我用AI回懟美女汽車銷售系列[yolo車牌識別](二)
前期回顧:
在上一期介紹了事情的起因,為什么要做yolo車牌識別,以及最終的網(wǎng)絡結(jié)構(gòu)。(鏈接在這里:我用AI回懟美女汽車銷售系列[yolo車牌識別](一) - 嗶哩嗶哩 (bilibili.com))但是為了驗證和編碼的方便,我們基于下圖的網(wǎng)絡結(jié)構(gòu)開發(fā)。即將yolo檢測網(wǎng)絡和識別網(wǎng)絡分開,驗證通過了,再將識別功能集成到y(tǒng)olo上面,這樣可以大大降低風險。回顧一下流程,首先圖片經(jīng)過檢測網(wǎng)絡YoloX,識別出藍牌或者綠牌。然后根據(jù)矩形框坐標從原圖中剪裁出牌照圖片,將裁剪出的藍牌圖片送入到藍牌分類網(wǎng)絡進行牌照的識別;綠牌則送入到綠牌分類網(wǎng)絡進行識別。本期將要根據(jù)開源數(shù)據(jù)集CCPD,對三個網(wǎng)絡(YoloX車牌檢測網(wǎng)絡),藍牌識別網(wǎng)絡和綠牌識別網(wǎng)絡進行訓練。

檢測網(wǎng)絡訓練
檢測網(wǎng)絡使用普通的目標檢測網(wǎng)絡即可,這里我選擇YoloX。這是一個AnchorFree的Yolo系列,速度和精度都還不錯。由于YoloX目標檢測需要使用coco格式的數(shù)據(jù)集。因此需要將CCPD的格式進行轉(zhuǎn)換。在上一期已經(jīng)介紹過CCPD通過文件名來標注車牌信息。我們可以編寫一個python腳本,將CCPD轉(zhuǎn)換成COCO格式。

轉(zhuǎn)換好之后,就可以使用YoloX進行訓練??梢灾苯邮褂肶oloX官方的代碼進行訓練,也可以使用我之前開源的YoloX EasyTrain進行訓練。我這里使用YoloX EasyTrain進行訓練,因為只需要點點鼠標,并且所有配置信息可以在界面中編輯,而且訓練過程中還有實時的曲線信息,非常的方便。在YoloX EasyTrain中新建一個工程:CCPD,然后選擇基于YoloX Nano(小模型訓練快),然后配置一下CCPD的路徑(注意是轉(zhuǎn)換成coco格式的CCPD),點擊訓練。出去喝一杯咖啡,再回來看看效果吧。

訓練了5個epoch之后,map0.5以及map0.75已經(jīng)達到了0.99,精度是非常的高,那就直接停止訓練,使用第5個epoch的結(jié)果來測試一下推理,看看從百度上隨意下載的圖片,能否準確的檢測出車牌。效果非常理想?。?!

藍牌網(wǎng)絡訓練
首先對CCPD數(shù)據(jù)集進行一個轉(zhuǎn)換。由于藍牌網(wǎng)絡輸入的是車牌圖片,而不是整張圖片。因此需要對CCPD進行裁剪,裁剪出車牌圖片,然后進行保存??梢詫懸粋€python腳本,進行自動的裁剪。裁剪后的圖片與原始圖片對比:

有了圖片就可以訓練了,我這里使用shufflenetv2進行車牌的分類和識別。大家對分類任務應該非常熟悉,需要輸入多少個類別,就讓shufflenetv2最終輸出多少維度的向量。由于藍牌識別需要對7個位置進行分類,且每個位置有非常多的可能。例如省份有31中可能,而普通的字符位置有34種可能,那么我們就定義藍牌網(wǎng)絡最終的輸入是7*34維的向量。對于第一位的省份來說,34位是冗余的,因為省份只有31位,不過這沒有關(guān)系,最后幾位不用關(guān)注即可。訓練過程也非常簡單,使用常見的sgd優(yōu)化器,訓練60epoch,step學習率下降。最后top1測試精度達到了95%。非常nice!

綠牌網(wǎng)絡訓練
最后訓練綠牌網(wǎng)絡,和藍牌網(wǎng)絡幾乎一樣。不同的是需要使用CCPD中的新能源車的圖片進行裁剪和訓練。然后網(wǎng)絡的輸出是8*34維度,而不是藍牌的7*34維度。因為綠牌比藍牌多了一位。

ONNX轉(zhuǎn)換
由于訓練好的模型是pytorch的,不利于部署,因此我們將yolox模型和分類模型直接通過pytorch的接口導出為onnx模型,然后利用onnxruntime進行推理。使用如下代碼進行導出:
torch.onnx._export(model,
? ? ? ? ? ? ? ? ? ? ? dummy_input,
? ? ? ? ? ? ? ? ? ? ? "yolox.onnx",
? ? ? ? ? ? ? ? ? ? ? verbose=True,
? ? ? ? ? ? ? ? ? ? ? opset_version=11,
? ? ? ? ? ? ? ? ? ? ? input_names=['input'], output_names=['output'])
對于yolox來說,直接導出會報如下錯誤:
Exporting the operator silu to ONNX opset version 11 is not supported
意思是onnx不支持yolox中的silu激活函數(shù)。最簡單的方式是修改一下pytorch的源代碼,將silu的實現(xiàn)修改為如下圖所示,然后在調(diào)用上面的接口可以順利導出。

DEMO開發(fā)
有了上面訓練完的三個onnx網(wǎng)絡之后,為了測試的方便,我們用PyQt編寫一個簡單的demo。支持從圖片,視頻,以及攝像頭獲取圖片,然后將圖片輸入給檢測網(wǎng)絡進行車牌檢測,根據(jù)檢測出的車牌矩形框,從原始圖片中裁剪出車牌圖片。然后根據(jù)車牌的類型(藍牌還是綠牌)再送入到對應的網(wǎng)絡中進行分類識別。如下圖所示:

正當我覺得效果流逼,可以馬上上路檢測的時候,卻發(fā)現(xiàn)在視頻中同一個車牌被檢測出來不同的車牌號。導致一輛車會被識別成很多輛車。按照之前的邏輯,就會被識別出不同的車輛。這對于統(tǒng)計道路上的新能源車占比來說,是無法容忍的。因此需要解決該問題。

冷靜分析,通過上面的測試視頻來看,車牌的檢測倒是非常準確(紅框基本沒有問題),但是車牌識別的不夠準確。那么如何解決該問題,從而實現(xiàn)準確的車牌檢測呢?留在下期去解決吧。(說實話:我自己還沒有想好?。?/span>
總結(jié)
感謝各位觀眾老爺又看到了最后。這期主要是數(shù)據(jù)集的準備和網(wǎng)絡的調(diào)通。原以為可以馬上上路測試了,卻遇到了在視頻中識別不準的問題,嚴重影響實驗的精度。用這種精度統(tǒng)計出來的新能源車占比,我自己都不信,更不要說讓銷售相信了。下一期還是先解決識別精度的問題,盡情期待哦!