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