一、背景
? ? ? ? 隨著人們的生活水平不斷提高,汽車數(shù)量日益增加。隨之而來的管理難度逐漸增大,對車牌檢測有了越來越高的需求,比如:在汽車違法檢測、停車場的入口檢測等都需要車牌檢測進行輔助管理。中國車牌根據(jù)顏色可劃分為五種顏色:藍色、黃色、白色、黑色、綠色。根據(jù)車牌層數(shù)可以分為單層和雙層車牌,還可以更加細分為以下類別:
- 藍色單層車牌
- 黃色單層車牌
- 黃色雙層車牌
- 綠色新能源車牌、民航車牌
- 綠色農(nóng)用車牌
- 黑色單層車牌、使館車牌
- 白色警牌、軍牌、武警車牌
- 白色雙層軍牌
? ? ? ?考慮到目前實際生活中的實際情況以及開源的車牌數(shù)據(jù)集的原因,僅實現(xiàn)對藍色、黃色、綠色的單層車牌進行車牌檢測,白色和黑色車牌檢測效果不佳。
二、開發(fā)環(huán)境與庫函數(shù)說明
采用Python語言編寫,使用到的庫函數(shù)較多。這里僅介紹主要使用的庫:
tkinter:tkinter模塊是Python的標準Tk GUI工具包的接口。GUI界面采用該工具包。
opencv-python:是一個Python綁定庫,旨在解決計算機視覺問題。在實現(xiàn)傳統(tǒng)圖像處理方法檢測車牌中使用大量使用到。
torch:是深度學習神經(jīng)網(wǎng)絡中常用的庫。在實現(xiàn)YOLOv5算法檢測車牌中使用到。
tensorflow:tensorflow是Google推出的機器學習開源神器,擁有各種各樣的模型和算法。在實現(xiàn)CNN對車牌字符識別中使用到。
還使用到了許多其他庫,這里就不一一介紹了,詳情可見代碼中的requirements.txt文件。
三、編程思想介紹
? ? ? ?本次課程設計采用模塊化設計,將程序GUI和具體算法的實現(xiàn)進行分隔,將每一個識別算法進行封裝,互不影響。各模塊調(diào)用關系流程圖如圖1所示:
圖1 各模塊調(diào)用關系圖
?四、程序設計過程
? ? ? ?程序可以劃分為GUI模塊、傳統(tǒng)方法檢測車牌+SVM識別車牌字符模塊、YOLOv5方法檢測車牌+SVM識別車牌字符模塊、YOLOv5方法檢測車牌+CNN識別車牌字符模塊等四大模塊,下面將進行詳細介紹。
1.GUI模塊
? ? ? ?GUI模塊采用tkinter庫實現(xiàn)界面,由于界面不是重點,所以界面設計得比較簡約。界面效果如圖2所示:
圖2 界面效果圖?
? ? ? ? 界面主要包含原圖、車牌位置、識別結果、選擇識別算法、選擇圖片等組件。由于界面布局比較簡單,在此不對代碼邏輯進行介紹。使用時需注意當沒有選擇圖片時,無法選擇識別算法,識別算法默認選擇“傳統(tǒng)方法檢測車牌+SVM識別車牌字符”算法。當選擇圖片后,可以隨意更改識別算法。
2.傳統(tǒng)方法檢測車牌+SVM識別車牌字符模塊
? ? ? ? 該模塊可以細分為兩個子模塊,分別是傳統(tǒng)方法檢測車牌和識別車牌字符模塊。傳統(tǒng)方法檢測車牌模塊使用圖像處理方法負責在一張圖像中檢測出車牌,識別車牌字符模塊使用SVM算法負責識別車牌中的字符。
(1)以圖3為例,下面介紹傳統(tǒng)方法檢測車牌做了哪些工作:
①調(diào)整圖片比例,進行高斯去噪,并將圖片轉(zhuǎn)換為灰度圖。處理后的效果圖如圖4所示:
?
??圖3 原圖? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖4 去噪后的灰度圖
②進行形態(tài)變化,并將變化后的圖像和灰度圖兩幅圖像合成為一幅圖像。處理后的效果圖如圖5所示:
圖5 形態(tài)變化后的效果圖
③先對圖像進行閾值處理,再使用cv2.Canny函數(shù)進行邊緣檢測。處理后的效果圖如圖6所示:
圖6 邊緣檢測后的效果圖
④查找圖像邊緣整體形成的矩形區(qū)域,可能有很多,可以根據(jù)長寬比例是否是2~2.5之間進行排除那些不是矩形的區(qū)域。
⑤矩形區(qū)域可能是傾斜的矩形,所以先進行矯正,然后根據(jù)顏色定位,排除不是車牌的矩形,目前只識別藍、綠、黃車牌。
⑥檢測到車牌位置后,再根據(jù)車牌顏色再定位,縮小邊緣非車牌邊界。得到車牌如圖7所示:
圖7 檢測到的車牌
(2)在檢測到車牌后,緊接著對車牌進行字符識別的工作:
①將車牌轉(zhuǎn)換為灰度圖,并根據(jù)車牌顏色進行處理。由于黃、綠車牌字符比背景暗,藍車牌剛好相反,所以黃、綠車牌需要進行反向處理。處理好后的效果圖如圖8所示:
圖8 處理后的車牌
②對字符進行分割。首先進行水平投影,將二值化的車牌圖片水平投影到Y軸,得到連續(xù)投影最長的一段作為字符區(qū)域,因為車牌四周有白色的邊緣,這里可以把水平方向上的連續(xù)白線過濾掉。然后進行垂直投影,因為字符與字符之間總會分隔一段距離,因此可以作為水平分割的依據(jù),分割后的字符寬度必須達到平均寬度才能算作一個字符,這里可以排除車牌第2、3字符中間的“.”。
③將分割后的字符進行預測,使用訓練好的svmchinese.dat對車牌中的中文字符進行預測,使用訓練好的svm.dat對車牌中的英文和數(shù)字字符進行預測,得到預測結果為['京','A','D','7','Z','9','7','2']。預測結果中,有一點小錯誤,是因為訓練SVM模型的數(shù)據(jù)集太少的原因,導致結果不準確。程序GUI顯示的效果圖如圖9所示:
圖9?GUI顯示的效果圖
2.YOLOv5方法檢測車牌+SVM識別車牌字符
? ? ? ?該模塊可以細分為兩個子模塊,分別是YOLOv5方法檢測車牌和識別車牌字符模塊。YOLOv5方法檢測車牌模塊使用YOLOv5模型負責在一張圖像中檢測出車牌,識別車牌字符模塊使用SVM算法負責識別車牌中的字符。SVM算法識別車牌中的字符的過程在上一個小節(jié)描述了,在這兒不再贅述了。
? ? ? ? YOLOv5模型Ultralytics公司于2020年6月9日公開發(fā)布的。YOLOv5模型是基于YOLOv3模型基礎上改進而來的,有YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5四個模型。YOLOv5模型由骨干網(wǎng)絡、頸部和頭部組成。是計算機視覺界十分流行的模型,由于模型較大同時數(shù)據(jù)集也很大,導致訓練時間非常長,本次課程設計采用在CCPD數(shù)據(jù)集上預訓練好的模型作為車牌檢測模型。
①加載預訓練好的模型,檢測出車牌的四個角的坐標,檢測效果圖如圖10所示,紅框中即是檢測出的車牌。
圖10 車牌檢測的效果圖
②檢測出車牌后,將車牌截取出來,截取出的車牌如圖11所示。截取出的車牌再使用SVM模型進行字符識別。
圖11 截取出的車牌效果圖
3.YOLOv5方法檢測車牌+CNN識別車牌字符
? ? ? ?該模塊可以細分為兩個子模塊,分別是YOLOv5方法檢測車牌和識別車牌字符模塊。YOLOv5方法檢測車牌模塊使用YOLOv5模型負責在一張圖像中檢測出車牌,識別車牌字符模塊使用CNN算法負責識別車牌中的字符。YOLOv5模型檢測車牌的過程在上一個小節(jié)描述了,在這兒不再贅述了。
? ? ? ?CNN算法是卷積神經(jīng)網(wǎng)絡(Convolutional Neural Networks,簡稱CNN)?,F(xiàn)在,CNN已經(jīng)成為眾多科學領域的研究熱點之一。卷積神經(jīng)網(wǎng)絡CNN的結構一般包含這幾層:
1)輸入層:用于數(shù)據(jù)的輸入。
2)卷積層:使用卷積核進行特征提取和特征映射。
3)激活層:由于卷積也是一種線性運算,因此需要增加非線性映射。
4)池化層:進行下采樣,對特征圖稀疏處理,減少數(shù)據(jù)運算量。
5)全連接層:通常在CNN的尾部進行重新擬合,減少特征信息的損失。
6)輸出層:輸出模型預測的結果。
? ? ? ?采用Tensorflow庫搭建CNN模型,由于CCPD數(shù)據(jù)集龐大,訓練時間久,受于實驗設備和時間的影響,采用在CCPD數(shù)據(jù)集上預訓練好的模型作為車牌字符識別模型。但是由于該預訓練模型訓練輪次不夠,同時由于數(shù)據(jù)集黃色和綠色牌照的數(shù)量較少,導致模型對黃色和綠色牌照的檢測效果十分差,但是藍色牌照識別準確率很高。
五、實驗結果
1.程序運行效果:
? ? ? ?程序運行的初始界面如圖12所示。當未選擇圖片時,“選擇識別算法”下的單選框處于禁用狀態(tài),默認選擇“傳統(tǒng)方法檢測車牌,SVM識別車牌字符”。
圖12 程序運行的初始界面
? ? ? ? 在選擇圖片后,可根據(jù)需要切換識別算法,在“選擇識別算法”選擇對應算法的單選框,程序便會自動執(zhí)行對應的識別算法。選擇不同的識別算法后,程序運行的界面如圖13所示:
圖13 程序運行界面
?2.識別算法準確率分析:
? ? ? ? 為了了解算法哪個算法的檢測準確率最高,在測試集對識別算法進行測試。測試集包含30張圖片,其中藍色牌照24張、黃色牌照4張以及綠色牌照2張。測試集中的牌照比例是根據(jù)CCPD數(shù)據(jù)集中各牌照比例進行設計的。測試結果如表1所示:
算法 |
準確率(%) |
傳統(tǒng)方法檢測車牌+SVM識別車牌字符 |
56.7% |
YOLOv5方法檢測車牌+SVM識別車牌字符 |
60% |
YOLOv5方法檢測車牌+CNN識別車牌字符 |
43.3% |
? ? ? ? 從實驗結果可以看出,總體上看識別準確率并不高,但是觀察識別錯誤中的數(shù)據(jù),發(fā)現(xiàn)其中只是個別字符出現(xiàn)錯誤。其中YOLOv5對車牌的檢測效果要略優(yōu)于傳統(tǒng)圖像處理方法,如果YOLOv5算法訓練數(shù)據(jù)集以及訓練輪次增加,識別效果將會變得更好。SVM識別車牌字符效果看上去要比CNN識別車牌字符好,具體的原因是CNN訓練輪次不足導致的,如果實驗條件充足,增加訓練輪次和數(shù)據(jù)集,那么CNN識別效果肯定是優(yōu)于SVM的??傮w上來說,我認為YOLOv5方法檢測車牌+CNN識別車牌字符算法準確率是要優(yōu)于其他算法的,但是資源消耗上要遠遠高于其他算法。這也是深度學習模型共有的缺陷了,太過于依賴訓練輪次和訓練數(shù)據(jù)集。
代碼在:https://github.com/Dara-to-win/Plate-Recognition
歡迎Star一下?。。?/p>
參考文獻:
[1]基于yolov5的車牌檢測,https://github.com/xialuxi/yolov5-car-plate
[2]CCPD(中國城市停車數(shù)據(jù)集),https://github.com/detectRecog/CCPD
[3]端到端車牌識別項目,https://github.com/MrZhousf/license_plate_recognize
[4]車牌號識別python + opencv,https://blog.csdn.net/wzh191920/article/details/79589506
[5]車牌號識別https://github.com/wzh191920/License-Plate-Recognition文章來源:http://www.zghlxwxcb.cn/news/detail-432298.html
[6]CNN算法,http://t.zoukankan.com/lorenshuai724005-p-9520445.html文章來源地址http://www.zghlxwxcb.cn/news/detail-432298.html
到了這里,關于YOLOv5、CNN、SVM實現(xiàn)車牌檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!