周原銳, 張逸群, 曹遠(yuǎn)航, 孫慧慧
(吉林大學(xué) 儀器科學(xué)與電氣工程學(xué)院, 長(zhǎng)春 130061)
近年來(lái)隨著技術(shù)不斷革新, 嵌入式設(shè)備的計(jì)算能力不斷提升, 各種復(fù)雜的計(jì)算被置于以嵌入式系統(tǒng)為核心的終端設(shè)備上, 小巧的嵌入式硬件設(shè)備已經(jīng)完全可以運(yùn)行復(fù)雜的圖像處理分析算法[1]。
目前字符識(shí)別研究主要集中在電腦端, 字符識(shí)別系統(tǒng)大部分也只能運(yùn)行在電腦端。但傳統(tǒng)的字符識(shí)別設(shè)備體積大, 在便捷性方面存在諸多缺陷。隨著嵌入式系統(tǒng)的不斷發(fā)展, 為字符識(shí)別系統(tǒng)提供了一個(gè)新的發(fā)展方向。相比電腦端的字符識(shí)別系統(tǒng), 基于嵌入式的字符識(shí)別系統(tǒng)不僅小巧便攜, 功耗低, 而且擁有較好的處理性能, 易編程。此外, 嵌入式設(shè)備安裝方便, 設(shè)備可以快速啟動(dòng)且穩(wěn)定運(yùn)行, 實(shí)時(shí)性強(qiáng), 能很好地滿(mǎn)足快速實(shí)時(shí)的字符識(shí)別要求[2]。因此, 筆者將圖像處理分析算法移植到小巧的高性能嵌入式設(shè)備樹(shù)莓派4, 設(shè)計(jì)了一種基于視覺(jué)庫(kù)OpenCV(Open Source Computer Vision Library)的手寫(xiě)數(shù)字識(shí)別系統(tǒng)。
系統(tǒng)的主體硬件平臺(tái)----樹(shù)莓派4是基于Linux操作系統(tǒng)的嵌入式設(shè)備, 其處理器芯片為1.5 GHz、 64位的BCM2711 A72, 能耗低、 運(yùn)行穩(wěn)定, 能完全滿(mǎn)足文中的圖像處理需求。圖像采集模塊選用支持500萬(wàn)像素的攝像頭, 能清晰地完成手寫(xiě)數(shù)字圖像采集, 顯示器顯示攝像頭采集實(shí)時(shí)視頻流圖像和數(shù)字識(shí)別結(jié)果。樹(shù)莓派4開(kāi)發(fā)板通過(guò)IIC(Inter-Integrated Circuit)接口連接舵機(jī)控制板, 用舵機(jī)控制二自由度舵機(jī)云臺(tái)轉(zhuǎn)動(dòng), 使攝像頭能采集[-90°,90°]范圍內(nèi)的視頻流, 為短距離、 大面積的手寫(xiě)數(shù)字識(shí)別提供基礎(chǔ)。舵機(jī)控制板的核心為PCA9685芯片, PCA9685為12位脈沖寬度調(diào)制 (PWM: Pulse Width Modulation)信號(hào)發(fā)生器, 可支持最多16路信號(hào)輸出, 使用IIC通信協(xié)議與樹(shù)莓派通信, 大大節(jié)約了樹(shù)莓派的系統(tǒng)資源。系統(tǒng)硬件設(shè)計(jì)框圖如圖1所示, 硬件實(shí)物圖如圖2所示。
圖1 硬件設(shè)計(jì)框圖 圖2 硬件實(shí)物圖 Fig.1 Hardware design block diagram Fig.2 Physical drawing of hardware
筆者設(shè)計(jì)的系統(tǒng)以Python作為設(shè)計(jì)語(yǔ)言, 以O(shè)penCV視覺(jué)識(shí)別庫(kù)作為圖像識(shí)別算法主體框架, 通過(guò)自主訓(xùn)練模型, 達(dá)到快速實(shí)時(shí)識(shí)別手寫(xiě)數(shù)字的目的。OpenCV是一個(gè)能在Linux操作系統(tǒng)上運(yùn)行的開(kāi)源機(jī)器視覺(jué)庫(kù), 其中有很多數(shù)字圖像處理函數(shù), 利用OpenCV編程能降低成本和復(fù)雜性, 提高識(shí)別率。此外, OpenCV能提供豐富的Python接口供本系統(tǒng)使用[3]。筆者除了使用OpenCV進(jìn)行圖像的預(yù)處理外, 還采用了其中的3種算法接口訓(xùn)練分類(lèi)模型, 分別是KNN(K-Nearest Neighbor)、 SVM(Support Vector Machine)和ANN(Artificial Neural Network)接口。
整個(gè)系統(tǒng)的手寫(xiě)數(shù)字識(shí)別流程包括圖片拼接、 圖像前期處理、 文本定位與輪廓檢測(cè)、 數(shù)字分割、 歸一化和數(shù)字識(shí)別6個(gè)環(huán)節(jié)[4], 數(shù)字識(shí)別流程圖如圖3所示。系統(tǒng)軟件設(shè)計(jì)中還包括算法移植和云臺(tái)驅(qū)動(dòng), 系統(tǒng)整體程序流程圖如圖4所示。驅(qū)動(dòng)云臺(tái)時(shí), 將樹(shù)莓派內(nèi)的IIC協(xié)議端口打開(kāi)并連接舵機(jī)控制板, 通過(guò)IIC協(xié)議端口讀寫(xiě)PCA9685內(nèi)部寄存器以控制舵機(jī)轉(zhuǎn)動(dòng), 進(jìn)而實(shí)現(xiàn)對(duì)云臺(tái)的控制。
圖3 數(shù)字識(shí)別流程圖 圖4 系統(tǒng)整體程序流程圖 Fig.3 Digital identification flow chart Fig.4 Flow chart of the system
利用舵機(jī)云臺(tái)控制攝像頭角度, 同一紙張?jiān)诓煌臄z角度下的拍攝結(jié)果如圖5所示。
圖5 不同角度下的拍攝結(jié)果Fig.5 Shooting results from different angles
由于拍攝的圖片存在拍攝距離和角度上的差異, 直接拼接會(huì)使結(jié)果出現(xiàn)重疊、 空白等現(xiàn)象, 從而影響識(shí)別結(jié)果。因此, 筆者采用特征匹配的方法對(duì)原始圖片進(jìn)行拼接處理。在實(shí)際應(yīng)用環(huán)境下, 不進(jìn)行二值化處理的圖片往往存在著大量特征點(diǎn), 因此筆者使用暴力匹配器(BruteForce)和KNN的方法對(duì)原始圖片進(jìn)行拼接。通過(guò)提取特征點(diǎn)、 特征點(diǎn)匹配以及透視變換等步驟, 獲得拼接結(jié)果, 圖5的拼接效果圖如圖6所示。
圖像前期處理分為灰度化、 二值化和傾斜檢測(cè)與校正3個(gè)環(huán)節(jié)[5]。該實(shí)驗(yàn)中圖像灰度化處理使用OpenCV中CvCameraViewFrame類(lèi)的gray()方法, 二值化采用最大類(lèi)間方差(OTSU)法選取閾值, 灰度化與二值化后的結(jié)果如圖7所示。
圖6 圖片拼接效果圖 圖7 灰度化、 二值化效果圖 Fig.6 Image mosaic renderings Fig.7 Grayscale, binarization effect drawing
圖像采集過(guò)程中, 如果攝像頭的角度或樣本位置稍有偏差, 會(huì)使采集的圖像呈現(xiàn)一定角度的傾斜, 所以需要進(jìn)行傾斜檢測(cè)與校正[6]。筆者采用Hough變換法,首先將目標(biāo)像素在笛卡爾坐標(biāo)系中的坐標(biāo)(x,y)變換到參數(shù)空間(ρ,θ)
ρ=xcosθ+ysinθ
(1)
通過(guò)對(duì)θ取合適的范圍{θ1,θ2,…,θn}, 構(gòu)造一個(gè)離散的參數(shù)空間, 并設(shè)計(jì)一個(gè)計(jì)數(shù)器矩陣A(ρi,θi)(1≤i≤n), 對(duì)每個(gè)目標(biāo)點(diǎn)用參數(shù)空間中的每個(gè)值做變換
ρi=xicosθi+yisinθ,i(1≤i≤n)
(2)
計(jì)數(shù)器的局部極大值對(duì)應(yīng)為圖像在笛卡爾坐標(biāo)系中存在的直線。設(shè)定一個(gè)閾值T, 使T=λmaxA(ρ,θ)(λ<1)。當(dāng)A(ρ,θ)≤T時(shí), 置零。最后通過(guò)對(duì)A(ρ,θ)累加獲得A′(θ), 其中最大元素即為傾斜角度。
為防止傾斜校正旋轉(zhuǎn)過(guò)程中數(shù)字縮小而使信息丟失, 先采用插值算法放大以顯示所有圖像[7]。然后用霍夫直線函數(shù)cv2.HoughLinesP()對(duì)字符中所有直線進(jìn)行線段檢索; 根據(jù)線段計(jì)算夾角, 即所有直線的傾斜角; 求出所有直線傾斜角的加權(quán)平均值; 利用傾斜角的加權(quán)平均值進(jìn)行傾斜校正。
實(shí)際使用中, 數(shù)字往往只占據(jù)圖片的一部分而非整體, 如果將整個(gè)圖片作為輸入, 計(jì)算量將會(huì)十分龐大, 因此需要定位文本所在區(qū)間[8]。因?yàn)楸疚哪繕?biāo)文本與背景區(qū)域?qū)Ρ榷容^大, 采用Canny邊緣檢測(cè)的方法進(jìn)行文本定位[9], 包括以下4個(gè)步驟:
1) 用模糊半徑進(jìn)行高斯模糊, 平滑圖像, 去除噪聲;
2) 計(jì)算圖像梯度, 將圖像梯度分為水平、 垂直和斜對(duì)角;
3) 非最大值抑制, 利用梯度方向判斷像素點(diǎn)在梯度的兩種方向上是否為局部的最大值, 若是, 則需要抑制該像素;
圖8 文本定位與輪廓檢測(cè)結(jié)果圖Fig.8 Text location and contour detection results
4) 用滯后閾值化選擇邊緣, 檢查某一條邊緣是否明顯到足以作為最終輸出, 去除所有不明顯的邊緣[10]。
利用OpenCV使用Canny邊緣檢測(cè)需要調(diào)用cv2.Canny()函數(shù), 在完成依靠邊緣檢測(cè)的文本定位后, 采用cv2.findContours()對(duì)文本區(qū)域輪廓進(jìn)行檢測(cè), 獲取文本的具體位置。文本定位與輪廓檢測(cè)結(jié)果如圖8所示。
由于相鄰的數(shù)字都存在一定的間隔, 筆者利用垂直投影法進(jìn)行數(shù)字分割, 提取文本區(qū)域后在垂直方向進(jìn)行的投影可用
(3)
圖9 分割后的數(shù)字圖片F(xiàn)ig.9 The segmented digital picture
表示[11]。其中s(i,j)對(duì)應(yīng)文本行的二值圖。將掃描線從圖像左側(cè)向右側(cè)移動(dòng), 分別移動(dòng)到首個(gè)V(j)≠0的點(diǎn)ja和首個(gè)V(j)=0的點(diǎn)jb, 點(diǎn)ja和點(diǎn)jb分別為第1個(gè)字符的左右邊界線, 采用同樣的方式將掃描線向右移動(dòng), 找出剩下字符的左、 右邊界, 再依照上述方法對(duì)數(shù)字文本塊進(jìn)行垂直投影, 最終實(shí)現(xiàn)數(shù)字分割[11]。數(shù)字分割后的圖片如圖9所示。
圖10 歸一化結(jié)果圖Fig.10 Normalized result graph
經(jīng)過(guò)分割后的單一數(shù)字圖片不滿(mǎn)足識(shí)別算法的輸入層的輸入條件, 需要對(duì)數(shù)字圖片進(jìn)行歸一化處理。在確定歸一化模板圖像的尺寸(28×28像素)后, 尋找其與原始圖像寬度和高度之間的函數(shù)關(guān)系, 使原始圖像與模板圖像具有相同的寬度和高度。歸一化過(guò)程的理論基礎(chǔ)是圖像的縮放原理, 根據(jù)原始圖像與模板圖像的尺寸, 計(jì)算原始圖像要縮小或放大的比例, 再線性地調(diào)整原始圖像的寬度和高度。筆者使用OpenCV中的cv2.resize()函數(shù)對(duì)圖片進(jìn)行歸一化, 歸一化結(jié)果如圖10所示。
在對(duì)獲取到的圖片進(jìn)行處理后, 采取合適的算法進(jìn)行手寫(xiě)數(shù)字識(shí)別。為提高在嵌入式設(shè)備上的使用效率, 筆者對(duì)比了3種不同的手寫(xiě)數(shù)字分類(lèi)算法, 分別是K最近鄰、 支持向量機(jī)和人工神經(jīng)網(wǎng)絡(luò)。
K最近鄰(KNN)是機(jī)器學(xué)習(xí)中的一種非參數(shù)估計(jì)分類(lèi)方法[12], 主要包括以下幾個(gè)步驟:
1) 用歐氏距離公式
(4)
求解已分類(lèi)的訓(xùn)練樣本與未分類(lèi)樣本之間的相似度或距離;
2) 在訓(xùn)練樣本中, 尋找出K個(gè)與未分類(lèi)樣本最相近的樣本;
3) 根據(jù)尋找出的K個(gè)訓(xùn)練樣本所屬的類(lèi)別, 對(duì)未分類(lèi)樣本進(jìn)行歸類(lèi)。
若找出的K個(gè)訓(xùn)練樣本全部歸類(lèi)于同一個(gè)類(lèi)別, 則未分類(lèi)樣本也被歸類(lèi)于此類(lèi)別; 否則將需要針對(duì)每個(gè)候選類(lèi)別分別評(píng)分, 按評(píng)分規(guī)則歸類(lèi)未分類(lèi)樣本[13]。
支持向量機(jī)(SVM: Support Vector Machine)是一種對(duì)數(shù)據(jù)二元分類(lèi)的線性分類(lèi)器, 從線性可分情況下的最佳分類(lèi)面發(fā)展而來(lái)[14]。其分類(lèi)原理就是尋找一個(gè)能將兩類(lèi)樣本完全精確分類(lèi)的分界線(即超平面), 并使安全間隔越大越好[15]。該實(shí)驗(yàn)中手寫(xiě)數(shù)字分類(lèi)問(wèn)題就是不斷地將多個(gè)二分類(lèi)問(wèn)題進(jìn)行拆分, 轉(zhuǎn)化為有限個(gè)十分類(lèi)問(wèn)題[16]。
圖11 數(shù)字識(shí)別結(jié)果圖Fig.11 Digital identification result graph
人工神經(jīng)網(wǎng)絡(luò)(ANN)是一種進(jìn)行并行信息處理的算法模型[17]。人工神經(jīng)網(wǎng)絡(luò)采取的方法是將任務(wù)分派給許多神經(jīng)元(也稱(chēng)為節(jié)點(diǎn)), 且每個(gè)神經(jīng)元都能“近似”生成輸入函數(shù)。“近似”是指用一個(gè)比較簡(jiǎn)單的函數(shù)表示一個(gè)更復(fù)雜的函數(shù)[18]。
筆者在OpenCV提供的ANN接口中, 通過(guò)定義輸入層、 隱藏層以及輸出層等神經(jīng)網(wǎng)絡(luò)層, 創(chuàng)建神經(jīng)網(wǎng)絡(luò)模型, 再設(shè)置網(wǎng)絡(luò)參數(shù)、 激活函數(shù)和迭代條件等參數(shù), 初始化神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)。其中, 神經(jīng)網(wǎng)絡(luò)模型的輸入采用手寫(xiě)數(shù)字字符圖片數(shù)據(jù)集MNIST[19]。圖10識(shí)別后的結(jié)果如圖11所示。
筆者使用了OpenCV中的KNN、 SVM和ANN3種不同的算法分別訓(xùn)練和測(cè)試數(shù)字識(shí)別模型, 并根據(jù)實(shí)際測(cè)試結(jié)果進(jìn)一步對(duì)ANN模型進(jìn)行了不同層數(shù)、 不同次數(shù)的訓(xùn)練和測(cè)試。首先在電腦端使用MNIST數(shù)據(jù)集進(jìn)行訓(xùn)練和模擬測(cè)試, 使用不同算法實(shí)現(xiàn)的指標(biāo)如表1所示。
表1 不同算法在電腦端的訓(xùn)練與模擬識(shí)別結(jié)果
注: 表1中ANN-150-20000表示使用150個(gè)中間層, 訓(xùn)練20 000次后的模型。
然后將模型移植到樹(shù)莓派平臺(tái)上測(cè)試。在4種不同的ANN模型中, 移植識(shí)別速度較快、 識(shí)別率較高、 體積較小的ANN-100-30000作為其代表。在光照良好、 紙面干凈且與文本對(duì)比度較高的情況下, 識(shí)別28×28像素的單個(gè)字符所用時(shí)間和識(shí)別率如表2所示。
表2 不同算法在樹(shù)莓派平臺(tái)的實(shí)際識(shí)別結(jié)果
從測(cè)試結(jié)果可以分析得出, 雖然KNN和SVM訓(xùn)練的模型相對(duì)于ANN的識(shí)別率較高, 但在樹(shù)莓派上的識(shí)別時(shí)間都要遠(yuǎn)大于ANN。在應(yīng)用中, 較長(zhǎng)的識(shí)別時(shí)間將會(huì)導(dǎo)致系統(tǒng)延遲, 大大降低識(shí)別效率。因此, 利用ANN訓(xùn)練模型對(duì)手寫(xiě)數(shù)字進(jìn)行識(shí)別可行性更高。
在默認(rèn)狀態(tài)(舵機(jī)位于0°位置)下, 該系統(tǒng)裝置整體尺寸約為: 長(zhǎng)98 mm, 寬60 mm, 高95 mm。整體最大功耗為15 W, 經(jīng)測(cè)試, 正常使用過(guò)程中功耗小于15 W。該系統(tǒng)的優(yōu)點(diǎn)是, 可在體積小巧、 低功耗的嵌入式設(shè)備上實(shí)現(xiàn)視頻幀的智能化處理, 同時(shí), 搭載的舵機(jī)云臺(tái)可以擴(kuò)大拍攝的角度范圍至[-90°,90°], 利用圖片拼接和數(shù)字分割技術(shù)可實(shí)現(xiàn)大面積識(shí)別, 彌補(bǔ)了傳統(tǒng)嵌入式前端視頻設(shè)備的不足。此外, OpenCV提供的大量視覺(jué)處理函數(shù)可以大大減少智能算法設(shè)計(jì)的工作量和資源占用量, 這在嵌入式設(shè)備上很有優(yōu)勢(shì)[20]。
筆者利用樹(shù)莓派設(shè)計(jì)了一種基于OpenCV的手寫(xiě)數(shù)字識(shí)別系統(tǒng), 通過(guò)舵機(jī)云臺(tái)實(shí)現(xiàn)了對(duì)攝像頭拍攝方向的控制, 并比較了KNN、 SVM和ANN 3種算法進(jìn)行手寫(xiě)數(shù)字識(shí)別時(shí)在識(shí)別速度、 識(shí)別準(zhǔn)確率、 模型體積等方面的區(qū)別。結(jié)果證明, 本系統(tǒng)可以適應(yīng)手寫(xiě)數(shù)字識(shí)別系統(tǒng)小型化的需求, 降低手寫(xiě)數(shù)字錄入的成本, 有一定實(shí)用價(jià)值。