EasyPR--一個開源的中文車牌識別系統

我正在作一個開源的中文車牌識別系統,Git地址爲:https://github.com/liuruoze/EasyPR。git

  我給它取的名字爲EasyPR,也就是Easy to do Plate Recognition的意思。我開發這套系統的主要緣由是由於我但願可以鍛鍊我在這方面的能力,包括C++技術、計算機圖形學、機器學習等。我把這個項目開源的主要目的是:1.它基於開源的代碼誕生,理應迴歸開源;2.我但願有人可以一塊兒協助強化這套系統,包括代碼、訓練數據等,可以讓這套系統的準確性更高,魯棒性更強等等。github

  相比於其餘的車牌識別系統,EasyPR有以下特色:算法

  1. 它基於openCV這個開源庫,這意味着全部它的代碼均可以輕易的獲取。
  2. 它可以識別中文,例如車牌爲蘇EUK722的圖片,它能夠準確地輸出std:string類型的"蘇EUK722"的結果。
  3. 它的識別率較高。目前狀況下,字符識別已經能夠達到90%以上的精度。

  系統還提供全套的訓練數據提供(包括車牌檢測的近500個車牌和字符識別的4000多個字符)。全部所有均可以在Github的項目地址上直接下載到。網絡

  那麼,EasyPR是如何產生的呢?我簡單介紹一下它的誕生過程:機器學習

  首先,在5月份左右時我考慮要作一個車牌識別系統。這個車牌系統中全部的代碼都應該是開源的,不能基於任何黑盒技術。這主要起源於我想鍛鍊本身的C++和計算機視覺的水平。函數

  我在網上開始搜索了資料。因爲計算機視覺中不少的算法我都是使用openCV,並且openCV發展很是良好,所以我查找的項目必須得是基於OpenCV技術的。因而我在CSDN的博客上找了一篇文章學習

  文章的做者taotao1233在這兩篇博客中以半學習筆記半開發講解的方式說明了一個車牌識別系統的所有開發過程。很是感謝他的這些博客,藉助於這些資料,我着手開始了開發。當時的想法很是樸素,就是想看看按照這些資料,可否真的實現一個車牌識別的系統。關於車牌照片數據的問題,幸運的很,我正在開發的一個項目中有大量的照片,所以數據不是問題。測試

  使人高興的是,系統確實可以工做,可是讓人沮喪的,彷佛也就「僅僅」可以工做而已。在車牌檢測這個環節中正確性已經慘不忍睹。優化

  這個事情給了我一撥不小的冷水,原本我覺得很快的開發進度看來是樂觀過頭了。因而我決定沉下心來,仔細研究他的系統實現的每個過程,結合OpenCV的官網教程與API資料,我發現他的實現系統中有不少並不適合我目前在作的場景。編碼

  我手裏的數據大部分是高速上的圖像抓拍數據,其中每一個車牌都偏小,並且模糊度較差。直接使用他們的方法,正確率低到了可怕的地步。因而我開始嘗試利用openCv中的一些函數與功能,替代,增長,調優等等方法,不斷的優化。這個過程很漫長,可是也有不少的積累。我逐漸發現,而且瞭解他系統中每個步驟的目的,原理以及若是修改能夠進行優化的方法。

  在最終實現的代碼中,個人代碼已經跟他的原始代碼有不少的不同了,可是成功率大幅度上升,並且車牌的正確檢測率不斷被優化。在系列文章的後面,我會逐一分享這些優化的過程與心得。

  最終我實現的系統與他的系統有如下幾點不一樣:

  1. 他的系統代碼基本上徹底參照了《Mastering OpenCV with Practical Computer Vision Projects》這本書的代碼,而這本書的代碼是專門爲西班牙車牌所開發的,所以不適合中文的環境。
  2. 他的系統的代碼大部分是原始代碼的搬遷,並無作到優化與改進的地步。而個人系統中對原來的識別過程,作了不少優化步驟。
  3. 車牌識別中核心的機器學習算法的模型,他直接使用了原書提供的,而我這兩個過程的模型是本身生成,並且模型也作了測試,做爲開源系統的一部分也提供了出來。

  儘管我和他的系統有這麼多的不一樣,可是咱們在根本的系統結構上是一致的。應該說,咱們都是參照了「Mastering OpenCV」這本數的處理結構。在這點上,我並無所「創新」,事實上,結果也證實了「Mastering OpenCV」上的車牌識別的處理邏輯,是一個實際有效的最佳處理流程。

  「Mastering OpenCV」,包括咱們的系統,都是把車牌識別劃分爲了兩個過程:即車牌檢測(Plate Detection)和字符識別(Chars Recognition)兩個過程。可能有些書籍或論文上不是這樣叫的,可是我以爲,這樣的叫法更容易理解,也不容易搞混。

  • 車牌檢測(Plate Detection):對一個包含車牌的圖像進行分析,最終截取出只包含車牌的一個圖塊。這個步驟的主要目的是下降了在車牌識別過程當中的計算量。若是直接對原始的圖像進行車牌識別,會很是的慢,所以須要檢測的過程。在本系統中,咱們使用SVM(支持向量機)這個機器學習算法去判別截取的圖塊是不是真的「車牌」。
  • 字符識別(Chars Recognition):有的書上也叫Plate Recognition,我爲了與整個系統的名稱作區分,因此改成此名字。這個步驟的主要目的就是從上一個車牌檢測步驟中獲取到的車牌圖像,進行光學字符識別(OCR)這個過程。其中用到的機器學習算法是著名的人工神經網絡(ANN)中的多層感知機(MLP)模型。最近一段時間很是火的「深度學習」其實就是多隱層的人工神經網絡,與其有很是緊密的聯繫。經過了解光學字符識別(OCR)這個過程,也能夠知曉深度學習所基於的人工神經網路技術的一些內容。

  下圖是一個完整的EasyPR的處理流程:

  

  本開源項目的目標客戶羣有三類:

  1. 須要開發一個車牌識別系統的(開發者)。
  2. 須要車牌系統去識別車牌的(用戶)。
  3. 須要作畢業設計的(學生)。

  第一類客戶是本項目的主要使用者,所以項目特意被精心劃分爲了6個模塊,以供開發者按需選擇。
  第二類客戶可能會有部分,EasyPR有一個同級項目EasyPR_Dll,能夠DLL方式嵌入到其餘的程序中,另外還有個一個同級項目EasyPR_Win,基於WTL開發的界面程序,能夠簡化與幫助車牌識別的結果比對過程。
  對於第三類客戶,最好在EasyPR的基礎上加上本身的創新與調整,這樣造成的設計纔有價值,有見地,而且可以有底氣經過設計會審。

  推薦你使用EasyPR有如下幾點理由:

  • 這裏面的代碼都是做者親自優化過的,你能夠在上面作修改,作優化,甚至一塊兒協做開發,一些處理車牌的細節方法你應該是感興趣的。
  • 若是你對代碼不感興趣,那麼通過做者精心訓練的模型,包括SVM和ANN的模型,能夠幫助你提高或驗證你程序的正確率。
  • 若是你對模型也不感興趣,那麼成百上千通過做者親自挑選的訓練數據生成的文件,你應該感興趣。做者花了大量的時間處理這些訓練數據與調整,如今直接提供給你,能夠大幅度減輕不少人缺乏數據的難題。

  有興趣的同志能夠留言或發Email:liuruoze@163.com 或者直接在Git上發起pull requet,均可以,將來我會在cnblogs上發佈更多的關於系統的介紹,包括編碼過程,訓練心得。

  最後,祝你們國慶快樂,節日順利!

相關鏈接:https://github.com/liuruoze/EasyPR/blob/master/Usage.md

相關文章
相關標籤/搜索