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

目錄:

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

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

四、提高字符識別准確率

五、加快EasyPR程序運行速度

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

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

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

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

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

一、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按鈕

(4)、選擇最后一項

(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

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

(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

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

(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,否則會報錯。

(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%以上,符合項目工程需求:

五、加快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

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

  1. linux 编译器制作,Linux交叉編譯器的制作(一)

    Linux交叉編譯器的制作-buildroot 1.問題出現 編譯內核時,需要在PC機上進行編譯才能下載到開發板上去,但兩個平台不一樣,需要我們自己實現這個功能. [klaus@localhost l ...

  2. linux 内核裁剪不当 死机,Linux編譯x86架構內核出現_stack_chk_guard未定義錯誤

    背景 android模擬器運行於virtualbox中,而virtualbox運行於x86架構的pc端,所以android及其Linux內核都編譯成x86架構.當virtualbox的vt未開啟的情況 ...

  3. zedboard移植linux内核,zedboard-嵌入式Linux系統移植

    1.在構建好嵌入式開發環境的基礎上進行下一步開發移植工作. 2.編譯U-Boot 首先在線獲取U-Boot源碼,在源碼include/configs/zynq_zed.h中,修改IP地址(CONFIG ...

  4. centos下将man改为中文

    centos下将man手册改为中文 正文 centos下将man改为中文 正文 在我们平时运维或者进行程序开发的时候难免记住所有的命令以及操作,这时候linux中有了man,man可以让我们更加轻松的 ...

  5. (原創) 如何在Visual Studio 2005編譯boost 1.33.1? (C/C++) (VC++) (boost)

    1.下載boost source到http://www.boost.org/下載最新版本的boost,我目前下載的是1.33.1,將之解壓縮到c:\boost_1_33_1\下 2.編譯bjam利用V ...

  6. 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)

    在linux系统下搞嵌入式开发,交叉编译器那肯定是必备工具.用的场合多了,就会见到各种各样的编译工具,比如: arm-linux-gcc arm-linux-gnueabi-gcc arm-none- ...

  7. 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  8. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  9. ARM的嵌入式Linux移植体验之操作系统

    转自:[url]http://dev.yesky.com/153/2527653.shtml[/url] 06-08-13 08:00 作者: 宋宝华 出处: 天极开发 责任编辑:方舟 在笔者撰写的& ...

最新文章

  1. cs6 数据库mysql_能mysql内容
  2. python.freelycode.com-快速提示-使用Modin加速Pandas
  3. mysql象限和投影_Camera类之orthographic-摄像机投影模式(第100篇随笔)
  4. android .so文件详解以及兼容性
  5. LSMW批处理使用方法(01)_总述及界面说明
  6. Android m 自定义下拉菜单,Android实现动画效果的自定义下拉菜单功能
  7. 创建自定义地理(坐标)变换
  8. 对SqlServer2008中的日志进行截断的方法
  9. 计算机鼠标装有,计算机鼠标装有传感器来监视鼠标的移动情况,如图
  10. O/R Mapping再乱弹
  11. 站点信息 统计 内容 概况
  12. SPring cloud (3)A Ribbon 负载均衡 配置初步
  13. powershell玩转ExcelCSV(一)
  14. 打开后缀html,文件名后缀打开
  15. 【PCL】【PCL实践】【PCL的使用学习记录】
  16. 物联网常见的几种通信方式
  17. 【用Unity实现抛物线向目标点发射炮弹功能】
  18. Jenkins 与 Gitlab 之间非交互拉取代码并进行代码部署
  19. 0514课堂笔记--抽象类-接口
  20. MySQL MGR搭建过程中常遇见的问题及解决办法

热门文章

  1. IIS7用FastCGI运行PHP配置
  2. [001]code blocks - error: expected identifier or ‘(‘ before ‘int‘|
  3. A. DS内排—直插排序
  4. Linux–shell脚本
  5. 数字IP和iP的转化
  6. 一名普通22届本科毕业生|前端程序员|22年年终总结
  7. 国内外抠图平台性能调研
  8. 《罗马革命》豆瓣 9.1 从恺撒大帝到屋大维
  9. Redis:字符串SET、SETNX、SETEX、PSETEX、GET、GETSET命令介绍
  10. 用最简单易懂的方式告诉大家——区块链到底是什么?