我正在做一個開源的中文車牌識別系統,Git地址為:https://github.com/liuruoze/EasyPR。
我給它取的名字為EasyPR,也就是Easy to do Plate Recognition的意思。我開發這套系統的主要原因是因為我希望能夠鍛鍊我在這方面的能力,包括C++技術、計算機圖形學、機器學習等。我把這個專案開源的主要目的是:1.它基於開源的程式碼誕生,理應迴歸開源;2.我希望有人能夠一起協助強化這套系統,包括程式碼、訓練資料等,能夠讓這套系統的準確性更高,魯棒性更強等等。
相比於其他的車牌識別系統,EasyPR有如下特點:
- 它基於openCV這個開源庫,這意味著所有它的程式碼都可以輕易的獲取。
- 它能夠識別中文,例如車牌為蘇EUK722的圖片,它可以準確地輸出std:string型別的"蘇EUK722"的結果。
- 它的識別率較高。目前情況下,字元識別已經可以達到90%以上的精度。
系統還提供全套的訓練資料提供(包括車牌檢測的近500個車牌和字元識別的4000多個字元)。所有全部都可以在Github的專案地址上直接下載到。
那麼,EasyPR是如何產生的呢?我簡單介紹一下它的誕生過程:
首先,在5月份左右時我考慮要做一個車牌識別系統。這個車牌系統中所有的程式碼都應該是開源的,不能基於任何黑盒技術。這主要起源於我想鍛鍊自己的C++和計算機視覺的水平。
我在網上開始搜尋了資料。由於計算機視覺中很多的演算法我都是使用openCV,而且openCV發展非常良好,因此我查詢的專案必須得是基於OpenCV技術的。於是我在CSDN的部落格上找了一篇文章。
文章的作者taotao1233在這兩篇部落格中以半學習筆記半開發講解的方式說明了一個車牌識別系統的全部開發過程。非常感謝他的這些部落格,藉助於這些資料,我著手開始了開發。當時的想法非常樸素,就是想看看按照這些資料,能否真的實現一個車牌識別的系統。關於車牌照片資料的問題,幸運的很,我正在開發的一個專案中有大量的照片,因此資料不是問題。
令人高興的是,系統確實能夠工作,但是讓人沮喪的,似乎也就“僅僅”能夠工作而已。在車牌檢測這個環節中正確性已經慘不忍睹。
這個事情給了我一撥不小的冷水,本來我以為很快的開發進度看來是樂觀過頭了。於是我決定沉下心來,仔細研究他的系統實現的每一個過程,結合OpenCV的官網教程與API資料,我發現他的實現系統中有很多並不適合我目前在做的場景。
我手裡的資料大部分是高速上的影像抓拍資料,其中每個車牌都偏小,而且模糊度較差。直接使用他們的方法,正確率低到了可怕的地步。於是我開始嘗試利用openCv中的一些函式與功能,替代,增加,調優等等方法,不斷的優化。這個過程很漫長,但是也有很多的積累。我逐漸發現,並且瞭解他系統中每一個步驟的目的,原理以及如果修改可以進行優化的方法。
在最終實現的程式碼中,我的程式碼已經跟他的原始程式碼有很多的不一樣了,但是成功率大幅度上升,而且車牌的正確檢測率不斷被優化。在系列文章的後面,我會逐一分享這些優化的過程與心得。
最終我實現的系統與他的系統有以下幾點不同:
- 他的系統程式碼基本上完全參照了《Mastering OpenCV with Practical Computer Vision Projects》這本書的程式碼,而這本書的程式碼是專門為西班牙車牌所開發的,因此不適合中文的環境。
- 他的系統的程式碼大部分是原始程式碼的搬遷,並沒有做到優化與改進的地步。而我的系統中對原來的識別過程,做了很多優化步驟。
- 車牌識別中核心的機器學習演算法的模型,他直接使用了原書提供的,而我這兩個過程的模型是自己生成,而且模型也做了測試,作為開源系統的一部分也提供了出來。
儘管我和他的系統有這麼多的不同,但是我們在根本的系統結構上是一致的。應該說,我們都是參照了“Mastering OpenCV”這本數的處理結構。在這點上,我並沒有所“創新”,事實上,結果也證明了“Mastering OpenCV”上的車牌識別的處理邏輯,是一個實際有效的最佳處理流程。
“Mastering OpenCV”,包括我們的系統,都是把車牌識別劃分為了兩個過程:即車牌檢測(Plate Detection)和字元識別(Chars Recognition)兩個過程。可能有些書籍或論文上不是這樣叫的,但是我覺得,這樣的叫法更容易理解,也不容易搞混。
- 車牌檢測(Plate Detection):對一個包含車牌的影像進行分析,最終擷取出只包含車牌的一個圖塊。這個步驟的主要目的是降低了在車牌識別過程中的計算量。如果直接對原始的影像進行車牌識別,會非常的慢,因此需要檢測的過程。在本系統中,我們使用SVM(支援向量機)這個機器學習演算法去判別擷取的圖塊是否是真的“車牌”。
- 字元識別(Chars Recognition):有的書上也叫Plate Recognition,我為了與整個系統的名稱做區分,所以改為此名字。這個步驟的主要目的就是從上一個車牌檢測步驟中獲取到的車牌影像,進行光學字元識別(OCR)這個過程。其中用到的機器學習演算法是著名的人工神經網路(ANN)中的多層感知機(MLP)模型。最近一段時間非常火的“深度學習”其實就是多隱層的人工神經網路,與其有非常緊密的聯絡。通過了解光學字元識別(OCR)這個過程,也可以知曉深度學習所基於的人工神經網路技術的一些內容。
下圖是一個完整的EasyPR的處理流程:
本開源專案的目標客戶群有三類:
- 需要開發一個車牌識別系統的(開發者)。
- 需要車牌系統去識別車牌的(使用者)。
- 需要做畢業設計的(學生)。
第一類客戶是本專案的主要使用者,因此專案特地被精心劃分為了6個模組,以供開發者按需選擇。
第二類客戶可能會有部分,EasyPR有一個同級專案EasyPR_Dll,可以DLL方式嵌入到其他的程式中,另外還有個一個同級專案EasyPR_Win,基於WTL開發的介面程式,可以簡化與幫助車牌識別的結果比對過程。
對於第三類客戶,最好在EasyPR的基礎上加上自己的創新與調整,這樣形成的設計才有價值,有見地,並且能夠有底氣通過設計會審。
推薦你使用EasyPR有以下幾點理由:
- 這裡面的程式碼都是作者親自優化過的,你可以在上面做修改,做優化,甚至一起協作開發,一些處理車牌的細節方法你應該是感興趣的。
- 如果你對程式碼不感興趣,那麼經過作者精心訓練的模型,包括SVM和ANN的模型,可以幫助你提升或驗證你程式的正確率。
- 如果你對模型也不感興趣,那麼成百上千經過作者親自挑選的訓練資料生成的檔案,你應該感興趣。作者花了大量的時間處理這些訓練資料與調整,現在直接提供給你,可以大幅度減輕很多人缺少資料的難題。
有興趣的同志可以留言或發Email:liuruoze@163.com 或者直接在Git上發起pull requet,都可以,未來我會在cnblogs上釋出更多的關於系統的介紹,包括編碼過程,訓練心得。
最後,祝大家國慶快樂,節日順利!