python车辆型号识别_基于Tensorflow的车辆检测和车型识别
1 項目介紹
本項目實現了一個車輛檢測及車型識別系統。項目數據集為在停車場出入口,路口,高速卡口等位置采集的圖片數據,數據共包含48856張不同汽車型號的圖片,其中43971張作為訓練集,4885張作為驗證集,需要注意的是本數據集僅包含汽車型號的標簽,而不包含圖片中目標的位置信息即標定框信息。本項目基于tensorflow提供的slim分類框架和object detection框架完成。
由于項目提供的數據集中不包含目標位置信息,針對此問題,我們采用ssd預訓練模型結合人工標注訓練了一個多目標檢測器,可以檢測一整張圖片中的多輛汽車,并且可以檢測到圖片中的小目標車輛。使用訓練好的模型檢測所有數據集中的目標車輛并裁剪,利用裁剪出的車輛及對應的車型標簽訓練一個分類器,分類器的準確率可以達到91%,top5可以達到95%。
項目采取了檢測-分類兩步策略,使用訓練好的檢測器檢測圖片中的目標車輛并將其裁剪出來,放入到分類模型中進行分類,最后將檢測和分類的結果進行整合標注的原圖中,在web頁面進行顯示。
2 數據探索與分析
目標檢測中關鍵的步驟之一是對圖像目標做標定框并生成對應的xml文件,所以需要將課程提供的tfrecord文件轉為圖像數據。參考download_and_convert_flowers.py文件從tfrecord提取圖片各類信息,并存為jpg格式圖片。還原后的圖片按照車型類名存儲到 764個文件夾里,并對文件夾里的圖片進行粗略清洗,對一些明顯的錯誤類數據進行刪除,例如比亞迪元車型類別中出現的跑車圖片進行刪除,如下圖所示:
問題:讀取tfrecord文件還原圖片時,速度逐漸變慢,導致迭代一段時間后出現卡死現象。
原因:如上圖所示,運行session時在循環中使用tf.reshape()函數,因為每迭代一次都會在計算圖中增加新的節點,導致內存泄漏(memory leak),程序越來越慢,最后強行退出。如何判斷計算圖有沒有增加新的節點,可以使用graph.finalize()鎖死計算圖,如果報錯,說明迭代過程中計算圖是有改變的。
解決:使用numpy.reshape()代替tf.reshape()
3 檢測模型的訓練
由于本項目的提供的數據僅僅包含車型的標簽信息,但項目要求實現車輛檢測及車型識別,所以我們需要訓練一個可以檢測車輛的模型,檢測模型的訓練需要每張圖片中目標對應的坐標信息以及目標的類別信息。
對數據的人工標注可使用LabelImg工具,使用LabelImg標注的數據格式為voc格式,標注生成xml文件。但是本項目包含近50000張圖片,單純的使用人工標注會耗費大量的人力資源和時間成本。而直接使用預訓練模型ssd對目標進行標定可以節省大量的時間,但是由于ssd預訓練模型使用的coco數據集與本項目數據存在一定的差別,直接使用ssd模型標注會存在近千張數據未能檢測到,而直接舍棄,造成數據浪費,且檢測器的泛化能力較弱。所以我們采取的方法為使用ssd預訓練模型與人工標注結合的方式,提高檢測模型的準確度。
具體方法為:
(1) 使用ssd預訓練模型對所有數據進行標定,將可以檢測到的數據和未能檢測到的數據分開。結果中有近千張數據是ssd預訓練模型不能檢測到的。ssd預訓練模型使用的是coco數據集,數據集包括car,person,truck,bus,boat等90類物體,但是我們要訓練車輛檢測模型,只需將ssd模型檢測到的car,bus和truck三類目標的坐標信息輸出,所有數據類別標簽統一為car,因為訓練的這個檢測模型只用于定位所有車輛的位置坐標信息,不用于分類識別。將坐標信息、圖片名、類名car輸出到voc格式的xml文件。
(2) 從已標定的數據中隨機抽取5000張圖像進行篩選,選取標注結果較為準確的圖像數據。從未能檢測到的數據中心抽取1/3數據進行手動標注(LabelImg)。使用篩選后的自動標注和手動標注的數據進行檢測器的訓練,將原圖片和xml文件轉換為tfrecord文件,并訓練檢測模型。
(3) 使用訓練后的模型再次對所有數據進行檢測,結果同樣分為可以檢測到和未能檢測到,重復(2)中的操作,使檢測模型的性能不斷提升。
下圖顯示了檢測模型訓練損失下降過程及測試:
問題:
(1) 使用ssd預訓練模型標注數據時,需將類別為car、bus和turck的檢測坐標記錄下來,由于最開始標注時僅將每張圖片最大的標注框輸出,然后利用最大目標物體進行訓練,導致模型對小物體的檢測能力比較差。
(2) 直接使用使用預訓練模型進行標注然后訓練模型,模型性能較差,因為直接使用ssd標注數據集,會存在一定的偏差,ssd使用的coco數據集與本項目數據集不是獨立同分布,直接使用效果不佳。
4 分類模型的訓練
訓練分類模型有兩種方式,第一種直接選擇原圖進行訓練,這種方式利用項目的tfrecord分類數據進行,但是我們訓練出來的分類器需要對檢測器檢測并裁剪后的目標進行分類,如果直接使用原圖訓練分類模型,由于訓練數據和測試數據存在差異,可能導致模型在測試集(裁剪后的目標車輛)上效果不佳。所以本項目在原圖的基礎上重新制作數據集。
利用3中訓練好的汽車檢測模型遍歷項目所有圖片,因圖片中可能存在多個目標車輛,所以會得到每個目標的坐標信息,一般情況下,圖片中僅最大的目標存在分類標簽,為了保證車輛與標簽的準確性,我們只將圖片中最大的目標根據對應的坐標信息進行裁剪。裁剪的方式使用PIL或OpenCV均可。
PIL:img=Image.open() crop_img=img.crop(xmin,ymin,xmax,ymax)
Opencv: img=cv2.imread() crop_img=img[ymin:ymax,xmin:xmax]
裁剪后圖片按類別保存到每個文件夾下,下圖為裁剪后的示例:
模型訓練參數:
預訓練模型:inception v4 優化器:rmsprop batch_size:16
初始學習率:0.005
訓練結果如下所示:
5 構建web檢測系統
利用python的flask框架,實現python后臺程序與前臺頁面html之間的交互。
最終檢測輸出的圖片如下圖所示,模型能檢測到圖片中的多個目標,并且能夠輸入每個目標所屬的類別以及置信度。圖片的輸出使用了opencv的兩個方法:cv2.rectangle(img, (xmin,ymin), (xmax,ymax), (B,G,R), Thickness)
cv2.putText(img, text, (x,y), Font, Size, (B,G,R), Thickness)
缺點:將每張圖片的多個目標分別剪切送入分類模型進行識別,會耗費比較多的時間,對于實時檢測識別的工業任務還是有很多不足。
方法二:端到端
1 車輛檢測器訓練
(1)使用ssd預訓練模型對所有數據進行標定,將可以檢測到的數據和未能檢測到的數據分開。結果中有近千張數據是ssd預訓練模型不能檢測到的。
(2)從已標定的數據中隨機抽取5000張圖像進行篩選,選取標注結果較為準確的圖像數據。從未能檢測到的數據中心抽取1/3數據進行手動標注(LabelImg)。使用篩選后的自動標注和手動標注的數據進行檢測器的訓練,將所有數據標簽統一為car。
(3)使用訓練后的模型再次對所有數據進行檢測,結果同樣分為可以檢測到和未能檢測到,重復(2)中的操作,使檢測器的性能不斷提升。
2 生成xml標簽
使用訓練好的模型對所有數據生成xml標簽,標簽中包括每張圖片目標車輛的型號信息。
3 檢測和分類模型的訓練
由生成的xmls和images轉換為tfrecord文件,開始訓練模型。
訓練超參數:
預訓練模型 :ssd-mobilenet_v1 初始學習率:0.002 batch_size:24
訓練過程如下圖所示:
總結
以上是生活随笔為你收集整理的python车辆型号识别_基于Tensorflow的车辆检测和车型识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【五线谱】音高表示 ( 高音谱号 | C
- 下一篇: 爬虫dht