easypr arm linux,arm linux下交叉編譯EasyPR中文車牌識別系統開發(一)

EasyPR中文車牌識別系統開發(一),我主要介紹如何使用開源的EasyPR中文車牌識別系統,當然后面我會介紹訓練機器學習 SVM 支持向量機和 ANN 人工神經網絡模型在車牌識別的應用。

目錄:

一、linux平台下EasyPR環境搭建二、arm平台下EasyPR環境搭建

三、訓練機器學習 SVM 車牌監測算法模型和 ANN 字符識別神經網絡模型

四、提高字符識別准確率

五、加快EasyPR程序運行速度

EasyPR中文車牌識別系統包括兩個部分,但實際上為了更好進行模塊化開發,EasyPR被划分成了六個模塊,其中每個模塊的准確率與速度都影響着整個系統。具體說來,EasyPR中PlateDetect與CharsRecognize各包括三個模塊。EasyPR的處理流程,見下圖:

9b5e04174fc9cb0b88f2c681b651a38a.png

PlateDetect包括的是車牌定位,SVM訓練,車牌判斷三個過程,通過PlateDetect過程我們獲得了許多可能是車牌的圖塊,將這些圖塊進行手工分類,聚集一定數量后,放入SVM模型中訓練,得到SVM的一個判斷模型,在實際的車牌過程中,我們再把所有可能是車牌的圖塊輸入SVM判斷模型,通過SVM模型自動的選擇出實際上真正是車牌的圖塊。見下圖。

89732238e9fde20ad23d51c0101be9e4.png

PlateDetect過程結束后,我們獲得一個圖片中我們真正關心的部分--車牌。那么下一步該如何處理呢。下一步就是根據這個車牌圖片,生成一個車牌號字符串的過程,也就是CharsRecognisze的過程,CharsRecognise過程中,一副車牌圖塊首先會進行灰度化,二值化,然后使用一系列算法獲取到車牌的每個字符的分割圖塊。獲得海量的這些字符圖塊后,進行手工分類,然后喂入神經網絡的MLP模型中,進行訓練。在實際的車牌識別過程中,將得到7個字符圖塊放入訓練好的神經網絡模型,通過模型來預測每個圖塊所表示的具體字符,例如圖片中就輸出了“蘇EUK722”,  具體見下圖。

8dab1ab3ed09598ccee36c7f1e9703d3.png

至此一個完整的車牌識別過程就結束了,但是在每一步的處理過程中,有許多的優化方法和處理策略。尤其是車牌定位和字符分割這兩塊,非常重要,它們不僅生成實際數據,還生成訓練數據,因此會直接影響到模型的准確性,以及模型判斷的最終結果。

好了,下面開始進入平台搭建主題:

一、linux平台下EasyPR環境搭建。

編譯opencv3.2,並將lib庫文件

指定全局環境

二、arm平台下EasyPR環境搭建

1、交叉編譯編譯opencv3.2開發環境

2、解壓

opencv

壓縮文件,得到文件夾。

#cmake-gui 打開cmake的gui界面,開始進行配置,配置過程如下圖所示:

首先電腦得先安裝arm-linux的交叉編譯環境,這里就不介紹這個了,直接說重點。

(1)、在終端窗口輸入sudo apt-get install cmake-qt-gui下載cmake圖形界面

(2)、安裝好后在終端窗口輸入sudocmake-gui打開cmake的gui界面

(3)、在“where is the source code”中填入電腦中opencv源碼的位置,“where to build the binaries”填入生成make編譯文件的位置,然后點擊configure按鈕

15eae941f7174bffb6b9b83d0da9ae66.png

(4)、選擇最后一項

e5f741410bcc68a37d0b3246896390bb.png

(5)、點擊NEXT再跳出的界面中做如下設置

Operating System 選擇目標系統Linux

Compilers中選擇交叉編譯器的gcc和g++

這里注意選擇用什么編譯,根據不同的編譯選擇編譯命令的路徑。

我是使用的arm-oe-linux-gnueabi來編譯,找到編譯器的安裝路徑:

gcc:/opt/hisi-linux/x86-arm/arm-histbv310-linux/bin/arm-histbv310-linux-gcc

g++:/opt/hisi-linux/x86-arm/arm-histbv310-linux/bin/arm-histbv310-linux-g++

Target Root選擇交叉編譯器的路徑:/usr/local/arm-linux/arm-oe-linux-gnueabi/

include Mode選擇Search only in Target Root

4b754c48f5590ecbfee7d70ceb14e0c2.png

(6)、同時可以將CMAKE_INSTALL_PREFIX和CMAKE_FIND_ROOT_PATH改成你想要的路徑,這個路徑是opencv最后庫文件和頭文件的安裝路徑。確認在不存在其他問題后點擊Generate生存Makefile文件,如果前面第三方的問題沒有解決這里是會報錯而無法生存Makefile。生成的Makefile文件和Cmake配置文件都在 Wher to build the binarier 中設置的文件夾下

bdb4905317bea5a6baf449de89d11f19.png

(7)、修改編譯選項

默認安裝目錄為 opencv-3.2.0/build/install ,改為 /usr/local/arm/opencv-install

CMAKE_INSTALL_PREFIX    /usr/local/arm/opencv-install(提前創建目錄)

去掉 WITH_CUDA

去掉 WITH_GTK

去掉 WITH_1394

去掉 WITH_GSTREAMER

去掉 WITH_LIBV4L    (因為后面有另外一個WITH_V4L)

去掉 WITH_TIFF

去掉 BUILD_OPENEXR

去掉 WITH_OPENEXR

去掉 BUILD_opencv_ocl

去掉 WITH_OPENCL

根據自己的需要選擇編譯的選項,有的選項需要安裝相應的依賴的庫,否則編譯會出錯

3cbb4b41def4a76135a2c8bf5c1cbe26.png

(8)、完成后 Generate ,生成Makefile文件:

修改 CMakeCache.txt, CMAKE_EXE_LINKER_FLAGS原來為空,加上 -lpthread -lrt

$ sodo make -j8

$make install

3、交叉編譯EasyPR-master,進入EasyPR-master修改,支持opencv3.2版本的頭文件:

//改成Opencv3.2版本的支持gaohui@pdg-OptiPlex-9010:~/opencv3.2.0/EasyPR-master$ vim include/easypr/config.h//#define CV_VERSION_THREE_ZERO#define CV_VERSION_THREE_TWO

4、修改CMakeList.txt,支持板卡的交叉編譯環境:

(1)交叉編譯環境的thidrparty /CMakeList.txt文件:

1.build CMakeList of the thidrparty.a

(2)交叉編譯EasyPR-master-arm下的CMakeList.txt文件:

如果生成C++ so庫文件修改:

進入EasyPR/,修改CMakeLists.txt,找到

add_library(easypr STATIC $(SOURCE_FILES))

STATIC改為SHARED,修改為:

add_library(easypr SHARED ${SOURCE_FILES})

同樣,進入Easy/thirdparty,修改CMakelists.txt,找到最后一行

add_library(thirdparty STATIC ${SOURCE_FILES})

修改為:

add_library(thirdparty SHARED ${SOURCE_FILES})

build.sh編譯,EasyPR/_build下找到libeasypr.so;

/EasyPR/_build/thirdparty下找到libthirdparty.so

三、訓練機器學習 SVM 車牌監測算法模型和 ANN 字符識別神經網絡模型

(1)訓練機器學習 SVM 車牌監測算法模型

為了加快訓練模型的速度,我將SVM模型和ANN模型訓練放在服務器上,

在easypr的主目錄下面新建了一個tmp文件夾,並且把svm.7z解壓得到的svm文件夾移動到tmp文件夾下面,

則可以執行 $ ./demo svm --plates=tmp/svm --svm=tmp/svm_hist.xml,生成得到的tmp文件夾下面的svm_hist.xml就是訓練好的模型,

替換model/svm_hist.xml就可以達到替換新模型的目的,替換前請先備份原始模型。

如何將自己的車牌圖片生成車牌圖塊放入到tmp/svm目錄中呢?

修改test/plate.hpp的代碼,將車牌圖片放在resources/image/test目錄下,指定生成的車牌和非車牌圖塊放在resources/image/tmp/Result目錄下,執行代碼選擇:

1. 測試;--》3. test plate_detect(車牌檢測);

喝杯茶的功夫,此時會將所有的圖片分割成圖塊(如何生成准確的車牌圖塊,后面會說),再人工分類,車牌目錄我的經驗把數據的70%用來訓練,30%用來測試模型;非車牌以此類推。放入svm目錄下,有車牌目錄和非車牌目錄,訓練生成svm_hist.xml模型。

車牌和非車牌圖塊大小是136*36,否則會報錯。

7548575fb4201f4e69cf1ed611e7f346.png

(2)ANN 字符識別神經網絡模型

在easypr的主目錄下面新建了一個tmp文件夾,並且把ann.7z解壓得到的ann文件夾移動到tmp文件夾下面,

則可以執行 $ ./demo ann --chars=tmp/ann --ann=tmp/ann.xml,生成得到的tmp文件夾下面的ann.xml就是訓練好的模型,

替換model/ann.xml就可以達到替換新模型的目的,替換前請先備份原始模型。

如何將自己的車牌圖塊生成字符放入到tmp/ann目錄中呢?

修改test/chars.hpp的代碼,將車牌圖塊放在resources/image/test1目錄下,指定生成的字符放在resources/image/tmp/Chars目錄下,執行代碼選擇:

1. 測試;--》4. test chars_segment(字符分隔);

這需要一定時間,此時會將所有的圖塊分割成字符(如何生成准確的字符,后面會說),再人工分類(非常耗時),放入ann目錄下,訓練生成ann.xml模型。

車牌和非車牌圖塊大小是20*20,否則會報錯。

四、提高字符識別准確率

車牌號碼識別主要包括圖像灰度拉伸、牌照定位分割、二值化、字元切割、字元識別等5個模塊。識別原理:識別模塊通過對圖像的智能分析,提取出包含車牌的相關區域,對車輛行進過程中的圖像進行逐幀處理和識別,系統可捕獲多個有效幀,對每一幀識別處理,經過預處理,將車牌切割成各個字符單元,並對每個字符單元進行分類識別。

系統能識別號牌字符包括:數字:0~9;字母:A~Z;31個省市簡稱:京、津、晉、冀、蒙、遼、吉、黑、滬、蘇、浙、皖、閩、贛、魯、豫、鄂、湘、粵、桂、瓊、川、貴、雲、藏、陝、甘、青、寧、新、渝。。。

提高字符識別准確率:

(1)保證你的SVM模型內的車牌圖塊數據准確,檢測字符單元的字符,去除目錄下的錯誤字符和人為不能判斷的字符,這個過程非常耗時后面我把優化后的svm和ann數據全部公開。

(2)保證你有足夠大的車牌圖塊和字符數據,來訓練SVM和ANN模型。

(3)將固定位置的攝像頭在白天、大角度、逆光、污損、夜間、下雨天的抓拍出來車牌圖片分類,進行SVM和ANN模型參數優化。

(4)最后將31個省市簡稱中文字符,訓練成中文模型,進行ANN中文模型參數優化。

最后公布我優化的車牌識別准確率,也許在不同環境下的識別准確率會有不同,但最終都在95%以上,符合項目工程需求:

1431b9cc5a9216d7ca8a629b5dfff149.png

五、加快EasyPR程序運行速度

因為程序運行的速度和硬件平台、模型算法有很大關系:我們的硬件平台海思板卡型號Hi3798CV200,4核64位Cortex A53處理器,GPU的架構Migard,型號MaliT720,

支持的規格OpenGL ES3.1、OpenCL1.1。

Linux下使用clock計時函數(clock_t t1=clock()),查找耗時的算法:評判指標、顏色定位(sobel算法)、車牌定位(sobel算法)、文字定位(MSER算法)。

如何對CPU和GPU加速呢?

1、對多核CPU使用:tbb和OpenMP

2、對圖形GPU加速:OpenGL、OpenCL

通過對耗時算法的耗時分析,使用OpenMP多核加速,來提高算法整體的效率。

(1)在交叉編譯EasyPR-master-arm下的CMakeList.txt文件中添加

FIND_PACKAGE( OpenMP REQUIRED)

if(OPENMP_FOUND)

message("OPENMP FOUND")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")

endif()

(2)主要關心的是在同一時間將一個任務划分成多個然后用多線程去完成。它們之間相互並不依賴,這將有利於分配不同的任務給不同的線程去執行。在循環結構可以進行並行(#pragma omp parallel for),可以進行分段並行(#pragma omp parallel sections)。

本文參考:

1、中文車牌識別系統,源碼Git地址為:https://github.com/liuruoze/EasyPR

2、優化基於EasyPR訓練的機器學習 SVM 車牌監測模型和 ANN 字符識別神經網絡模型的數據: http://download.csdn.net/download/u010872301/9941268

3、EasyPR--中文開源車牌識別系統 開發詳解(1): http://www.cnblogs.com/subconscious/p/4001896.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值