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