1. 程式人生 > >easyPR車牌識別分析與測試結果

easyPR車牌識別分析與測試結果

簡介

最近由於專案需要,需要做一個車牌號抓取和識別的功能,於是找到了EasyPR,全稱Easy to do Plate Recognition,一個全中文的開源識別專案,基於OpenCV和機器學習實現,支援跨平臺,相對來說比較簡單,速度也還不錯,準確度而言,白天還行,晚上很差,尤其是開啟前照燈的情況下非常糟糕,不過還是要感謝作者能夠開源給大家分享。

下載

可以根據平臺下載自己需要的版本,然後按照Usage.md中介紹的一步步去編譯,也可借鑑這篇部落格(http://livezingy.com/compile-easypr-in-win10-vs2013-x64/),編譯過程中會出現有關opencv的錯誤,一般都是與版本有關,程式碼裡面的相關語法錯誤,按照需要進行對應修改,後續我會給出我修改好的demo,上傳更新。

大概思路

車牌檢測

檢測部分,主要用了三種方法的結果進行融合,提取出來的車牌矩形框大小為360x160,這三種方法分別是:

  • 邊緣檢測:基於Sobel,程式碼中的函式為plateSobelLocate()
  • 基於顏色的搜尋:函式為plateColorLocate(),分步並行處理三種顏色:藍色,黃色,白色,當然需要的可以進行程式碼修改,增加綠色牌的搜尋;
  • 基於文字區域的搜尋:這裡使用了MSER運算元,來處理有字元的區域,函式為plateMserLocate();

將上面三種方法找到的矩形框都放到一個vector裡,準備做篩選:

  • step1:提取不同車牌feature,送入SVM進行訓練,給出score;程式碼中用的是顏色直方圖特徵,當然還給出來別得feature,在feature.cpp檔案中可以看到,有:HOG,LBP,Sift,直方圖,顏色,hsv直方圖等;
  • step2:NMS做最後的過濾;

字元分割

  • 首先對矩形框進行二值化:為了消除燈光的音響,用了Otsu閾值化,函式為spatial_ostu();
  • 通過0和1畫素的跳躍次數,來去除車牌上的柳釘以及干擾直線,函式為clearLiuDing();
  • 去除干擾後,利用輪廓查詢找到左右可能是字元的矩形框Rect,然後利用位置比例找到屬於特定字元的Rect,函式為GetSpecialRect();

字元識別

字元識別這裡,用了最簡單的MLP進行訓練,中文字元31個,數字字元10個,字母字元24個(I和O不用),白天場景下可得到80+的識別準確率,應該還是不錯的了,當然需要的話,可以自己用更多更新的樣本進行重新訓練,以得到更高的準確率。

測試結果

Pc機上檢測的時間在20ms以內;完整識別的時間在0.25-0.35s之間,其中第一張圖片的識別時間稍長,後面就比較快,由於演算法執行開始需要load所需模型。

檢測準確率:白天為85%;夜晚為70%;

識別準確率:白天為80%;夜晚為60%;

與其他演算法的比較

翔雲車牌識別服務

這是一個收費解決方案,用我們採集的照片在該服務上測試,得到以下測試結果:

1) 白天場景下識別效果好於晚上;

2) 白天拍攝距離7m以內;晚上2m內;

3) 識別時間大於0.5s;

4) 準確率:90%(白天)80%(晚上)

惠號通車牌識別

同樣作為一個商業化解決方案,效果明顯好於測試過的其它同類演算法。其演算法在手機app上執行,該app要求現場採集圖片,無法讀取已有圖片,且拍照過程中自動調焦,拍攝到的照片人為因素很大,得到的照片質量明顯好於我們採集到的圖片質量,清晰度高,對比度高。測試結果如下:

1) 同樣白天識別效果優於晚上;

2) 拍攝距離小於2m;

3) 識別時間取決於手機,華為榮耀V8上識別時間為100ms左右;

4) 準確率:>95%(白天)85%(晚上)

HyperLPR

這是github上的一個免費開源專案,基於深度學習的高效能中文車牌識別,可以現場拍照,也可以load相簿已有圖片,在華為榮耀V8上測試結果如下:

1) 白天效果好於晚上;

2) 拍攝距離小於2m;

3) 識別時間100ms左右;

4) 準確率:85%(白天)60-70%(晚上)

OpenALPR

這是一個國外的開源專案,都是白色車牌,線上測試了一下,感覺速度很快,準確率也很好,但是用我們自己的場景圖片,準確率直線下降;

結論

白天場景下,拍攝距離不超過7m,否則無法檢測;

晚上場景下,不開大燈光線好拍攝距離不超過7m,開大燈不超過2m,否則無法檢測;

下面是在7m距離的拍攝識別情況:

識別結果:

開前大燈無法檢測:

總的來說還是可以的,如果條件不是非常苛刻,因為我們的需要場景是在夜間,而且是動態拍攝,所以比較尷尬。