劉智輝,陳洪立,江先志
(浙江理工大學 機械與自動控制學院,浙江 杭州 310018)
基于OpenCV的人工神經(jīng)網(wǎng)絡字符識別研究
劉智輝,陳洪立,江先志
(浙江理工大學 機械與自動控制學院,浙江 杭州 310018)
為克服傳統(tǒng)模板匹配方式識別字符存在的缺陷,采用BP神經(jīng)網(wǎng)絡技術,有效識別字符特征,快速識別字符.運用C++編程以及OpenCV計算機視覺庫,降低系統(tǒng)實現(xiàn)的復雜程度,實現(xiàn)了字符的快速準確識別.
字符識別;OpenCV;BP神經(jīng)網(wǎng)絡;智能系統(tǒng)
隨著人們物質(zhì)生活水平的不斷提高,車輛數(shù)量持續(xù)增長,車輛監(jiān)控和行車安全已經(jīng)成為人們關注的焦點.除了維持現(xiàn)有交通基礎設施投入之外,要科學使用交通設備,加強智能化應用水平,使得人們的出行更加安全、便捷[1-2].通過實時監(jiān)控設備,對過往車輛進行拍照,識別車牌的字符號碼,可以完善安保系統(tǒng)和城市道路交通安全系統(tǒng).車輛上安裝的相關智能設備,不依賴地圖更新就能夠自主快速識別道路指示標識(如限速標識)上的字符,提醒駕駛員了解道路行車狀況,進而保障駕駛員以及乘客的生命財產(chǎn)安全.這種自主導航方式同時能夠為今后的車輛自動駕駛提供良好的技術支撐.
基于OpenCV的人工神經(jīng)網(wǎng)絡的字符識別庫能夠有效地解決圖像上文字及符號的識別問題,對城市的交通監(jiān)控以及實時路況指導提供有效的參考,具有良好的應用前景[3-4].傳統(tǒng)上,模板匹配識別字符的方法較為復雜,容錯能力較差,對需要識別字符的圖像質(zhì)量要求較高,識別的速率較慢,正確率較低.神經(jīng)網(wǎng)路識別算法能夠有效地解決上述問題,對有殘缺或者不清晰的一些字符圖像也能夠進行識別.但是,使用神經(jīng)網(wǎng)絡識別字符算法的樣本訓練時間較長.由于樣本的訓練是在識別之前就可以完成的,因此在實際使用中只需要將訓練好的權值加載到神經(jīng)網(wǎng)絡中,即樣本的訓練不會占用識別時需要的各項系統(tǒng)資源.本文算法在實際應用過程中能夠體現(xiàn)出優(yōu)越性.
OpenCV(Open Source Computer Vision Library)是基于BSD許可(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統(tǒng)上.它由一系列C函數(shù)和少量C++類構成,包含了大量的數(shù)字圖像處理算法以及計算機視覺方面的算法.其功能模塊有CORE、IMGPRO、HIGHUI、ML、FRATURES2D等[5-6].
BP神經(jīng)網(wǎng)絡是一種具有3層或3層以上結構的無反饋、層內(nèi)無互聯(lián)結構的前向網(wǎng)絡(圖1).其首尾兩層分別為輸入層和輸出層,中間各層稱為隱含層(也稱中間層).BP神經(jīng)網(wǎng)絡中各層之間的神經(jīng)元為全連接關系,而層內(nèi)的各神經(jīng)元之間無連接.
圖1 3層BP神經(jīng)網(wǎng)絡結構
BP神經(jīng)網(wǎng)絡采用有指導的學習方式進行訓練和學習,即當一對學習模式提供給BP神經(jīng)網(wǎng)絡后,神經(jīng)元的激活值從輸入層經(jīng)各個隱含層向輸出層傳播,在輸出層的各個神經(jīng)元獲得網(wǎng)絡的實際輸出響應.通過比較輸出層各個神經(jīng)元的實際輸出與期望輸出,獲得二者間的誤差,然后按照誤差減小的方向,從輸出層經(jīng)各個隱含層并逐漸修正各個連接權值,最后回到輸入層.這種“正向輸出計算—反向傳播誤差”的過程不斷重復進行,直至誤差被降到可以接受的范圍,BP神經(jīng)網(wǎng)絡的學習訓練過程也就隨之結束[7].
在圖2所示的神經(jīng)網(wǎng)絡處理單元中,L1層的n個處理單元與L2層的p個處理單元全連接.其連接權向量為:
W={ωi j},i=1,2,…,n,j=1,2,…,p
(1)
L1層n個處理單元的輸出構成了L2層各個處理單元的輸入列向量.L2層各個處理單元的輸入列向量為:
X=(x1,…,xi,…,xn)T
(2)
L2層各個處理單元的閾值為,θj(j=1,2,…,p).
因此,L2層各個處理單元接收的輸入加權和為:
(3)
L2層各個處理單元的輸出由轉(zhuǎn)移函數(shù)決定.BP神經(jīng)網(wǎng)絡通常采用Sigmoid函數(shù)(圖3)作為轉(zhuǎn)移函數(shù).Sigmoid函數(shù)的數(shù)學表達式為:
(4)
因此,L2層各個處理單元的輸出為:
(5)
圖2 BP神經(jīng)網(wǎng)絡的處理單元
圖3 Sigmoid函數(shù)
Sigmoid函數(shù)的輸出接近生物神經(jīng)元的信號輸出形式,能夠模擬生物神經(jīng)元的非線性特征.同時,Sigmoid函數(shù)具有的非線性特征能夠增強神經(jīng)網(wǎng)絡的非線性映射能力[8].
3.1 系統(tǒng)組成
字符識別系統(tǒng)首先基于數(shù)字圖像處理算法提取圖像的多種特征,得到字符的特征向量,然后通過模式識別算法識別特征向量,進而達到識別圖像中字符的效果.系統(tǒng)組成關系如圖4所示.
圖4 系統(tǒng)組成關系
在系統(tǒng)組成中,分割后的字符圖片部分包括大小寫英文字母以及阿拉伯數(shù)字;特征提取部分包括字符圖片的歸一化處理和特征提取(灰度特征提取以及方向梯度特征提取);人工神經(jīng)網(wǎng)絡部分包括BP神經(jīng)網(wǎng)絡的創(chuàng)建、訓練和識別.
3.2 字符特征提取
3.2.1 歸一化處理
由于字符以及數(shù)字的數(shù)量較多,訓練將會耗費大量的時間,因此本文只對“A”、“B”、“C”、“D”4個大寫英文字母進行識別.每個字母均使用100個樣本進行訓練,共計400個訓練樣本.樣本被命名為“sample(*)”,其中“*”代表樣本序號.采用cvtColor函數(shù)以及resize函數(shù),將RGB圖像(三通道彩色圖像,分別為紅色通道Red、綠色通道Green、藍色通道Blue)轉(zhuǎn)換為灰度圖像并歸一化(圖5)到指定的大小(8×16).
圖5 圖像歸一化示意
圖像歸一化處理的核心代碼如下:
cvtColor(sampleImage[i],sampleImage[i],CV_BGR2GRAY);//圖像轉(zhuǎn)化為灰度圖像
resize(sampleImage[i],sampleImage[i],Size(8,16));//圖像歸一化到指定大小.
3.2.2 提取灰度特征
將歸一化后圖像展開成一行,將每個像素的值存放到一個float型的向量容器中,組成行數(shù)為1,列數(shù)為8×16=128的灰度特征向量.
提取灰度特征的核心代碼如下:
for (inti= 0;i< image.rows;i++)
{const uchar* linePtr = image.ptr
for (intj= 0;j { feat.push_back((float)linePtr[j]);} }. 3.2.3 提取方向梯度特征 為了得到圖像水平方向和豎直方向的梯度圖像,需要使用式(6)所示的Sobel算子. (6) 首先定義Sobel水平檢測算子x_mask和y_mask,其中y_mask為x_mask的轉(zhuǎn)置;然后分別用mask_x和mask_y進行圖像濾波,得到sobelX和sobelY;再計算濾波后圖像總的像素,劃分網(wǎng)格,計算每個網(wǎng)格內(nèi)像素值的總和;最后將每個網(wǎng)絡內(nèi)總灰度值占整個圖像的百分比統(tǒng)計在一起,寫入一個向量,將兩個方向各自得到的向量合并在一起,組成行數(shù)為1,列數(shù)為8×16/8=16的梯度特征向量. 提取方向梯度特征的核心代碼如下: for(inti=0;i< image.rows;i=i+4) //合并兩方向向量組成特征向量; { for(intj=0;j< image.cols;j=j+4) { Mat subImageX= sobelX(Rect(j,i,4,4)); feat.push_back(sumMatValue(subImageX)/totleValueX); Mat subImageY= sobelY(Rect(j,i,4,4)); feat.push_back(sumMatValue(subImageY)/totleValueY);}}. 最后將單幅字符圖像的灰度特征和梯度特征合并,組成行數(shù)為1,列數(shù)為128+16=144的單幅字符圖像的特征向量.其核心代碼如下: inputv1.insert(inputv1.end(),inputv2.begin(),inputv2.end()); return inputv1. 本文共使用400個樣本圖像進行訓練,通過合并單幅字符圖像的特征向量,最終得到了行數(shù)為400,列數(shù)為144的特征矩陣. 3.3 構建神經(jīng)網(wǎng)絡 3.3.1 定義神經(jīng)網(wǎng)絡期望輸出矩陣 由于本文只需要識別4個字符,共使用400個樣本對BP神經(jīng)網(wǎng)絡進行訓練,因此神經(jīng)網(wǎng)絡的期望輸出矩陣可以定義為400行4列的矩陣,每個字符的期望輸出矩陣各占100行,用數(shù)字“0”和“1”表示.4個字符期望輸出的特征向量定義如表1所示. 表1 字符的期望輸出向量 3.3.2 神經(jīng)網(wǎng)絡參數(shù)設定 新建一個名為bp的神經(jīng)網(wǎng)絡.網(wǎng)絡的層次結構為3層,包括一個144節(jié)點的輸入層、一個144節(jié)點的隱含層、一個4節(jié)點的輸出層.傳遞函數(shù)使用Sigmoid函數(shù).其核心代碼如下: CvANN_MLP bp;//定義名為bp的人工神經(jīng)網(wǎng)絡; int ar[]={144,18,4};//輸入層節(jié)點144,隱含層節(jié)點144,輸出層節(jié)點4; Mat layerSizes(1,3,CV_32S,ar);//3層神經(jīng)網(wǎng)絡; bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM, 1.0, 1.0);//創(chuàng)建人工神經(jīng)網(wǎng)絡. 3.4 神經(jīng)網(wǎng)絡訓練 設置bp神經(jīng)網(wǎng)絡的訓練參數(shù),將神經(jīng)網(wǎng)絡的迭代次數(shù)設置為2 000次,當誤差小于0.01時停止迭代,認為網(wǎng)絡已經(jīng)完成收斂,至此神經(jīng)網(wǎng)絡已經(jīng)全部訓練完畢.將訓練好的權值保存為xml文件,以便直接調(diào)用.其核心代碼如下: CvANN_MLP_TrainParams param;//設置人工神經(jīng)網(wǎng)絡訓練; param.term_crit=cvTermCriteria(1,2 000,0.01);//迭代2 000次,誤差0.01; param.train_method=CvANN_MLP_TrainParams::BACKPROP; //定義為BP神經(jīng)網(wǎng)絡; param.bp_dw_scale=0.1; param.bp_moment_scale=0.1; bp.train(inputs,outputs,Mat(),Mat(),param,0);//人工神經(jīng)網(wǎng)絡的訓練接口準備; bp.save("bp.xml");//保存bp網(wǎng)絡的權值. 3.5 神經(jīng)網(wǎng)絡識別 神經(jīng)網(wǎng)絡識別使用的是未經(jīng)訓練的測試樣本,“A”“B”“C”“D”各字符樣本均為20個,共計80個.樣本被命名為“test(*)”,其中“*”代表樣本序號. 對測試樣本進行歸一化操作,提取測試字符圖像的特征向量,然后將測試所用的特征向量送入已經(jīng)完成訓練的神經(jīng)網(wǎng)絡中進行識別.其核心代碼如下: bp.predict(testFeat[i],rus[i]) 通過字符的特征向量進行人工神經(jīng)網(wǎng)絡的識別,可得到表2所示的識別結果.測試樣本01-03為字符“A”20個樣本中前3個的識別結果;測試樣本21-23為字符“B”20個樣本中前3個的識別結果;測試樣本41-43為字符“C”20個樣本中前3個的識別結果;測試樣本61-63為字符“D”20個樣本中前3個的識別結果.將各字符的實際輸出向量與表1中各字符的期望輸出向量對比,顯然,對應字符的實際輸出向量與期望輸出向量的數(shù)值非常相似.因此,可以認為字符是被識別出來了,該識別方法是有效的. 表2 部分識別結果 測試平臺使用的是臺式計算機、ARM開發(fā)板(STM32F103ZET6)、USB攝像頭.計算機對攝像頭采集回來的圖像進行數(shù)字圖像處理,同時對字符用人工神經(jīng)網(wǎng)絡算法識別.按照計算機對字符的識別結果,以串口通訊的方式將指令發(fā)送給下位機(ARM開發(fā)板),下位機會反饋一條相同的指令給上位機(計算機),以完成對整個應用過程的測試. 對捕獲的字符標識(圖6a)進行數(shù)字圖像分割,得到圖6(b)的字符分割結果,再將分割的結果送入已訓練好的神經(jīng)網(wǎng)絡進行識別,得到識別結果.計算機按照事先設置的指令(字符“B”對應指令“0X02”),通過串口發(fā)送給下位機,下位機回發(fā)相同的指令給上位機(圖7).至此測試完成.這說明本實驗所研究的算法在實際應用過程中是可行的. (a)攝像頭捕獲字符標識 (b)字符分割結果圖6 小車拍攝圖像及字符分割結果 圖7 結果的指令發(fā)送界面 本文采用基于OpenCV的人工神經(jīng)網(wǎng)絡算法識別圖像字符,通過有效提取圖像的多種特征來準確識別圖像中的字符,避免了單特征所帶來的誤差.采用現(xiàn)階段應用較為廣泛的BP神經(jīng)網(wǎng)絡算法,避免了采用模板匹配算法時識別不準確、識別速度慢等問題,使得識別算法具有良好的魯棒性以及非線性映射能力. 本文算法配合高清攝像機和嵌入式系統(tǒng)等智能設備以及圖像分割技術,使得行駛車輛能夠自主快速識別道路指示標識(如限速標識)上的字符,實時提醒駕駛員道路情況,有利于駕駛員及時了解道路行車狀況,減少傷亡事故的發(fā)生,進而保障駕駛員及乘客的生命財產(chǎn)安全.它也為今后的車輛自動駕駛提供了一定的技術支撐. [1] 劉雄飛,朱盛春.車牌字符多特征提取與BP神經(jīng)網(wǎng)絡的識別算法[J].計算機仿真,2014,31(10):161-164,290. [2] 張三友,姜代紅.基于OPENCV的智能車牌識別系統(tǒng)[J].軟件導刊,2016,15(5):87-89. [3] 歐陽俊,劉 平.基于BP神經(jīng)網(wǎng)絡的車牌字符識別算法研究[J].光學與光電技術,2012,10(5):67-71. [4] 盧雅文.基于人工神經(jīng)網(wǎng)絡的圖像識別[J].電子技術與軟件工程,2016(12):103. [5] Kaehler A,Bradski G.Learning openCV:Computer vision in C++with the OpenCV library[J]. O′reilly Media,2016,34(5):1681-1682. [6] 毛星云.OpenCV3編程入門[M].北京:電子工業(yè)出版社,2015. [7] 吳岸城.神經(jīng)網(wǎng)絡與深度學習[M].北京:電子工業(yè)出版社,2016. [8] 馬 銳.人工神經(jīng)網(wǎng)絡原理[M].北京:機械工業(yè)出版社,2010. Research on Character Recognition of Artificial Neural Network Based on OpenCV LIU Zhi-hui,CHEN Hong-li,JIANG Xian-zhi (School of Mechanical Engineering and Automation,Zhejiang Sci-Tech University,Hangzhou 310018,China) This paper uses BP neural network technology which can effectively identify the feature of characters to achieve the ability to recognize characters. Through the use of C++programming and OpenCV computer vision library, the complexity of the system to achieve a fast and accurate recognition of characters can be greatly reduced. character recognition; OpenCV; BP neural network; intelligent system 2016-12-02 劉智輝(1992-),男,湖北宜昌人,碩士研究生,研究方向為計算機視覺和圖像處理. 1006-3269(2017)01-0053-05 TP27 A 10.3969/j.issn.1006-3269.2017.01.0114 字符識別系統(tǒng)測試
5 結束語