车型识别API调用与批量分类车辆图片
版權聲明:本文為博主原創文章,轉載 請注明出處https://blog.csdn.net/sc2079/article/details/82189824
9月9日更:博客資源下載:鏈接: https://pan.baidu.com/s/1AEtQL7uk4_T7TPKa1Q6kFg 提取碼: g1n8 永久有效
動機
暑假實習,一位做算法的老師讓我們一行人將攝像頭拍取的車輛照片按車型分類保存。
示例如下:
這樣的圖片共有上萬張,且有多個文件夾,人工打開圖片、放大,再識別(如果不清楚車輛標志,還需上網查找),并Ctrl+C、Ctrl+V將其保存在相應文件夾下,這著實讓人感到無聊與繁瑣。
因此,我就萌發了用熟知的python寫個腳本,自動化完成工作。
開始工作
上面想法很好,但是實際行動起來我還是遇到了很多問題。
首先,技術路線的選取。最簡單莫過于直接調用某云上的API接口,但是免費調用次數有限。當然,我最開始也最想采用的是走爬蟲路線。有很多網站可以在線上傳車輛照片并返回車型結果,我就想利用這一點解決車型識別的問題。然并卵,post請求無法響應,就想向selenium上靠,可是上傳文件對話框阻礙了我進一步操作。雖然網上有很多解決對話框的方法,但是礙于時間緊且方法較復雜(短時我無法實現)等種種原因,我不得不采用了最簡單直接的方法。PS:如果有做過類似的項目(對話框)的大佬請不吝賜教!
1.環境配置
編譯環境:Python3.6,Spyder
依賴模塊:shelve,PIL,shutil
2.申請API
打開百度云圖像識別的網頁鏈接:https://cloud.baidu.com/product/imagerecognition,創建一個項目,便可以得到API調用的接口。
找到并下載車型識別Python的SDK
車型識別的示例:
""" 讀取圖片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
image = get_file_content('example.jpg')
""" 調用車輛識別 """
client.carDetect(image);
""" 如果有可選參數 """
options = {}
options["top_num"] = 3
options["baike_num"] = 5
""" 帶參數調用車輛識別 """
client.carDetect(image, options)
3.指定目錄下所有車型的獲得
對API調用返回JSON數據的清洗,提取所需要的信息(取第一個)
car_info=client.carDetect(img)
try:
car_color=car_info['color_result']
except:
car_color='無法識別'
try:
car_name=car_info['result'][0]['name']
car_score=car_info['result'][0]['score']
car_year=car_info['result'][0]['year']
except:
car_name='非車類'
car_score=1
car_year='無年份信息'
car_result=[car_color,car_name,car_score,car_year,file]
獲取指定目錄下的所有車輛照片的車型
path='..'
img_path=path+'\car_img'
#調用API獲取指定目錄下所有文件的車型,并將數據保存
m_files=os.listdir(img_path)
for i in range(len(m_files)):
results=[]
files_path=img_path+'\'+m_files[i]
imgs=os.listdir(files_path)
for j in range(len(imgs)):
#out_path,img=img_cut(m_files[i],imgs[j])
result=get_info(out_path,img)
results.append(result)
data_path=path+'\'+'data'+'\'+m_files[i]
shelf_save(results,data_path)
實際操作中,發現有些圖片識別不出來,便裁剪一下,保留下半部分,竟然發現它能識別了。因此,在上傳圖片時首先對圖片進行了裁剪。
#圖片裁剪
def img_cut(file,img):
img_read = Image.open(path+'\car_img\'+file+'\'+img)
a = [0,1300,3310,2600]
box = (a)
roi = img_read.crop(box)
out_path = path+'\圖片處理\'+file
if not os.path.exists(out_path):
os.mkdir(out_path)
roi.save(out_path+'\'+img)
return out_path,img
我這里使用了shelve模塊將每個文件夾數據進行保存與調用
def shelf_load(path):
shelfFile = shelve.open(path)
results=shelfFile['results']
shelfFile.close()
return results
def shelf_save(results,path):
shelfFile = shelve.open(path)
shelfFile['results'] = results
shelfFile.close()
4.根據車型分類建立文件夾
話不多說,直接上代碼
#按車型分類建立文件夾
for i in range(len(m_datas)):
_path=path+'\data\'+m_datas[i]
datas=shelf_load(_path)
for j in range(len(datas)):
ori_path=img_path+'\'+m_datas[i]+'\'+datas[j][4]
if datas[j][1]=='非車類':
if not os.path.exists(path+'\results\未知'):
os.mkdir(path+'\results\未知')
now_path=path+'\results\未知\'+datas[j][4]
shutil.copy(ori_path,now_path)
continue
for brand in brands:
if brand in datas[j][1]:
if not os.path.exists(path+'\results\'+brand):
os.mkdir(path+'\results\'+brand)
now_path=path+'\results\'+brand+'\'+datas[j][4]
shutil.copy(ori_path,now_path)
break
if brand=='其他':
if not os.path.exists(path+'\results\未知'):
os.mkdir(path+'\results\未知')
now_path=path+'\results\未知\'+datas[j][4]
shutil.copy(ori_path,now_path)
運行結果
由于調用次數限制,我跑了480張圖片,僅有幾張無法識別,識別率還可以。至于準確率,我簡單翻看了一些目錄下的照片,雖然有個別車型識別錯誤,但大多還可以的。這里僅展示已經自動分類好的文件。
結語
由于時間倉促,代碼還沒整理好。另外其他細節(如存儲車型brands數組,獲得shelve數據、根文件夾下子文件下有哪些等)這里就不一一展示了。如果實在需要,過段時間我發個Github 鏈接。
總結
以上是生活随笔為你收集整理的车型识别API调用与批量分类车辆图片的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 502 Bad Gateway - Re
- 下一篇: Win7 64bit 成功安装ArcVi