王洪申,李昌德
(蘭州理工大學(xué)機(jī)電工程學(xué)院,甘肅 蘭州 730050)
手寫字符的計算機(jī)自動識別具有良好的應(yīng)用價值,如郵件自動分揀[1]和銀行票據(jù)自動識別[2]等。從上個世紀(jì)60、70年代開始,外國學(xué)者就已經(jīng)對字符識別展開了研究[3],從模板匹配到機(jī)器學(xué)習(xí),從打印字符到手寫字符,字符識別領(lǐng)域理論方法不斷進(jìn)步,識別場景愈發(fā)復(fù)雜[4]。手寫數(shù)字識別是字符識別中重要的內(nèi)容之一,其識別有其自身的特點(diǎn):首先10個阿拉伯?dāng)?shù)字在實際手寫過程中千變?nèi)f化,有些阿拉伯?dāng)?shù)字形態(tài)還很相似,在世界各國不同地方書寫筆跡也有許多差異。其次,數(shù)字之間缺少上下文語意環(huán)境,無法根據(jù)已經(jīng)識別的數(shù)字識別下一個數(shù)字,輸入的可用信息較少,多位數(shù)的識別也有一定的困難,隨著位數(shù)的增加識別困難也逐步升高。
隨著計算機(jī)硬件性能不斷提高,深度學(xué)習(xí)理論不斷發(fā)展,卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用在字符識別領(lǐng)域取得較大成功,主要有兩大算法:基于分割的識別和基于無分割的識別[5]。基于分割的識別主要有準(zhǔn)確分割和過分割的方法[6]。前者最大問題是對于粘連的數(shù)字無法準(zhǔn)確分割。過分割的基本思想是多次分割,找到最佳分割點(diǎn),這種方法計算量大,算法不夠穩(wěn)定。LeNet-5是一種用于手寫體字符識別的非常高效的卷積神經(jīng)網(wǎng)絡(luò),商業(yè)上最典型的應(yīng)用就是識別支票上的手寫數(shù)字。從上個世紀(jì)90年代開始,美國大多數(shù)銀行都使用這種技術(shù)識別支票上的手寫數(shù)字[7]。本文以試卷計分欄手寫分?jǐn)?shù)的計算機(jī)自動識別為應(yīng)用背景,采用無分割方法,將一位數(shù)或兩位數(shù)的手寫數(shù)字作為一個整體輸入LeNet-5神經(jīng)網(wǎng)絡(luò)識別試卷計分欄手寫分?jǐn)?shù)。通過對該神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和參數(shù)調(diào)整,獲得較好的手寫分?jǐn)?shù)識別效果,為計算機(jī)輔助閱卷和試卷分析系統(tǒng)提供核心算法。
試卷計分欄手寫分?jǐn)?shù)識別方法的主要步驟:對試卷計分欄中的手寫分?jǐn)?shù)圖像提取和預(yù)處理;利用數(shù)據(jù)集訓(xùn)練LeNet-5網(wǎng)絡(luò);運(yùn)用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò),輔助問題的先驗信息,對手寫數(shù)字進(jìn)行識別。本文算法流程圖如圖1所示。提取手寫分?jǐn)?shù)圖像這一步驟稱為圖像預(yù)處理,主要方法有圖像ROI檢測與選擇、色彩空間轉(zhuǎn)換、二值化、輪廓檢測與篩選、形態(tài)學(xué)處理等。利用數(shù)據(jù)集訓(xùn)練LeNet-5網(wǎng)絡(luò),主要的工作是以csv格式創(chuàng)建包括來自網(wǎng)絡(luò)的圖像數(shù)據(jù)集和自采集圖片的數(shù)據(jù)集,訓(xùn)練和改進(jìn)該神經(jīng)網(wǎng)絡(luò),并完成對其的測試。將試卷計分欄各題的理論總分輸入訓(xùn)練好的LeNet-5網(wǎng)絡(luò),這些先驗信息使LeNet-5網(wǎng)絡(luò)識別手寫分?jǐn)?shù)的正確率得到了提高。圖1表示本文算法設(shè)計思路的一個流程圖。
圖1 算法整體框架
圖2 高拍儀采集到的圖片
對于在普通環(huán)境下采集到的圖片來說,圖像預(yù)處理是手寫字符完整提取的重要前提。完整的字符輸入神經(jīng)網(wǎng)絡(luò)將會提高字符識別準(zhǔn)確率。本文處理對象為試卷上的手寫體數(shù)字,為試卷上每道題的得分和總分?jǐn)?shù),包括一位數(shù)和兩位數(shù)(暫不考慮100分的情況)。試卷的計分欄圖像通過高拍儀(可以實現(xiàn)固定時間自動拍攝,并可保證試卷與拍攝相機(jī)的距離固定)獲得,如圖2所示。對所獲得的圖像預(yù)處理主要步驟包括:ROI區(qū)域選擇、手寫數(shù)字輪廓檢測、輪廓排序和手寫數(shù)字圖片獲取。
首先,需要對采集到的圖片進(jìn)行去噪。由于實際中試卷卷面的污點(diǎn)和采集圖像時光照等因素的影響,圖片的噪聲類似于椒鹽噪聲,所以使用中值濾波器去噪[8]。其次,將采集的圖片進(jìn)行直方圖均衡化,使圖片中紅色更加鮮艷以便后續(xù)區(qū)域提取。最后,利用紅色信息將手寫分?jǐn)?shù)提取出來。ROI(region of interest)是指圖像中感興趣的區(qū)域,在OpenCV中設(shè)置圖像 ROI 區(qū)域,實現(xiàn)只對 ROI 區(qū)域的操作。使用inRange()函數(shù),設(shè)置紅色在HSV色彩空間的范圍值,實現(xiàn)對紅色區(qū)域(在這種情況下,該區(qū)域就稱為ROI區(qū)域)的提取。試卷計分欄的手寫分?jǐn)?shù)是紅色,它和周圍的顏色差異較大。利用紅色信息能夠產(chǎn)生基本完整且只包含手寫分?jǐn)?shù)的圖片。下圖3顯示了選擇出來的ROI區(qū)域。
圖3 ROI區(qū)域
ROI區(qū)域選擇完成后,就需要把每一個題號下的分?jǐn)?shù)分割出來。有兩種常用方法:垂直投影法和連通域法[9]。垂直投影法在分割規(guī)則字符時,效果較好,如車牌識別[10]。但手寫字符通常不整齊,甚至兩個數(shù)字字符交錯和粘連情況也時有出現(xiàn)。本文主要考慮兩位數(shù)字粘連的情況。采用垂直投影法,會導(dǎo)致分割不完整或分割錯誤。連通域的方法是將每個不相連的圖像區(qū)域標(biāo)記成一個單獨(dú)的塊,然后對塊進(jìn)行提取,完成手寫字符分割。在計分欄中,兩個題號距離較遠(yuǎn),其下方的手寫分?jǐn)?shù)通常是分別寫入,不會出現(xiàn)粘連的情況,這就保證了經(jīng)過連通域計算必然能夠?qū)⒉煌念}號下的手寫分?jǐn)?shù)提取出來。對于兩位數(shù)的手寫分?jǐn)?shù),通過對圖像膨脹處理,將其作為一個整體提取出來。本文采用的一種連通域算法是輪廓提取算法,在OpenCV中通過函數(shù)findContours()實現(xiàn)輪廓檢測,在這里只需要檢測手寫數(shù)字字符的外輪廓,因為在后續(xù)過程中,利用外輪廓的外接矩形截取出包含手寫字符的圖片。圖4是為檢測輪廓而進(jìn)行膨脹的圖片。
圖4 膨脹處理后的圖片
利用python接口的OpenCV庫中findContours()函數(shù)檢測字符輪廓,識別出來的輪廓都存儲在一個列表中。但列表中的輪廓排列順序是混亂的,它和試卷題號不能對應(yīng),這導(dǎo)致后續(xù)步驟識別出來的結(jié)果無法對應(yīng)到相應(yīng)的題目。因此,需要對檢測出來的輪廓按原來順序從左到右排序。由于這些圖片上的分?jǐn)?shù)在X軸方向差異特別大,因此考慮使用字符輪廓質(zhì)心坐標(biāo)對輪廓進(jìn)行排序。通過使用函數(shù)moments()求出每個輪廓的質(zhì)心坐標(biāo),根據(jù)質(zhì)心X坐標(biāo)從小到大進(jìn)行排序。在輪廓排序前,其實也需要對輪廓進(jìn)行篩選,在實際書寫中,筆畫斷開是常有的情況,這時斷裂的筆畫會被檢測成一個輪廓,這樣的輪廓是不需要的,而且會對輪廓排序產(chǎn)生嚴(yán)重干擾,因此必須對輪廓進(jìn)行篩選。通過對檢測出來的輪廓面積大小設(shè)定一個閾值,從而將所需輪廓篩選出來。圖5是待排序輪廓質(zhì)心x坐標(biāo)值。
圖5 輪廓質(zhì)心x坐標(biāo)值
正確的輪廓已經(jīng)檢測并且篩選出來了,需要根據(jù)輪廓外接矩形坐標(biāo)將包含手寫數(shù)字的圖片截取出來。OpenCV提供了函數(shù)boundingRect(),該函數(shù)能夠獲取輪廓外接矩形左上角的坐標(biāo)值以及該外接矩形的寬和高。根據(jù)這些信息,包含完整手寫數(shù)字的圖片就被截取出來了。至此,每個題號下的分?jǐn)?shù)便被收集好了,后續(xù)只需要將這些圖片轉(zhuǎn)換格式便可以輸入LeNet-5網(wǎng)絡(luò)中進(jìn)行訓(xùn)練識別了。圖6是截取出來的圖片。
圖6 截取出來的圖片
LeNet-5 是Yann LeCun設(shè)計出來專門用于識別手寫字符的神經(jīng)網(wǎng)絡(luò)[11],是一種典型的卷積神經(jīng)網(wǎng)絡(luò)模型,該網(wǎng)絡(luò)包含輸入層在內(nèi)共有八層,每一層都包含多個參數(shù)(權(quán)重)。C層代表的是卷積層,通過卷積操作,可以使原信號特征增強(qiáng),并降低噪音。S層是一個下采樣層,利用圖像局部相關(guān)性的原理,對圖像進(jìn)行子抽樣,可以減少數(shù)據(jù)處理量,同時也可保留一定的有用信息。圖7為 LeNet-5 的網(wǎng)絡(luò)結(jié)構(gòu)示意圖。
圖7 LeNet-5網(wǎng)絡(luò)結(jié)構(gòu)
本文對LeNet-5做了一些參數(shù)調(diào)整以提高手寫字符的識別準(zhǔn)確率,主要的調(diào)整有修改batch的大小、learning rate的大小、epoch的值、卷積核的大小和數(shù)量、權(quán)重數(shù)量、神經(jīng)元數(shù)量、激活函數(shù)和全連接層神經(jīng)元數(shù)量等。本文需要對0到99做100個分類,故需要將全連接層神經(jīng)元數(shù)量設(shè)置為100。
訓(xùn)練和測試LeNet-5網(wǎng)絡(luò)需要大量圖像數(shù)據(jù)。本文采用的圖像數(shù)據(jù)集包括來自網(wǎng)絡(luò)數(shù)據(jù)集和自建數(shù)據(jù)集,其中來自網(wǎng)絡(luò)的數(shù)據(jù)集大部分用于訓(xùn)練,小部分用于測試,自建數(shù)據(jù)集全部用于測試。為了將圖像數(shù)據(jù)輸入神經(jīng)網(wǎng)絡(luò),都需要將圖像格式進(jìn)行轉(zhuǎn)化,本文使用的圖片采用csv(Comma-Separated Values)數(shù)據(jù)格式[12],該數(shù)據(jù)文件是一個字符序列,可以由任意數(shù)目的記錄組成,記錄間以某種換行符分割。每條記錄由字段組成,字段間的分隔符是其它字符或者字符串。所有的記錄都有完全相同的字段序列,相當(dāng)于一個結(jié)構(gòu)化表的純文本形式。圖8是圖像的csv文件格式。
圖8 csv文件
3.1.1 自建數(shù)據(jù)集
自建數(shù)據(jù)集即從手寫分?jǐn)?shù)計分欄中截取出來的圖像制作成的數(shù)據(jù)集。這些截取的圖像有一個普遍的問題是圖像的尺寸大小不一,這會導(dǎo)致LeNet-5網(wǎng)絡(luò)難以搭建,尺寸過大的圖像過多會導(dǎo)致神經(jīng)網(wǎng)絡(luò)計算量巨大[13],因此需要在不損失圖片主要信息的條件下將圖片處理成相同且較小的大小。本文中將圖像尺寸歸一為28×28像素。圖9為歸一化后的圖片。
圖9 歸一化后的圖片
3.1.2 來自網(wǎng)絡(luò)的數(shù)據(jù)集
從網(wǎng)絡(luò)上下載的數(shù)據(jù)集有MNIST database 和Touching Digit (TP) database[14-15]。MNIST手寫數(shù)字?jǐn)?shù)據(jù)庫由一個60000個示例的訓(xùn)練集和一個10000個示例的測試集組成,所有圖像數(shù)據(jù)均是手寫的1位阿拉伯?dāng)?shù)字。它是NIST提供的一個更大集合的子集。圖片已經(jīng)被歸一化,圖像尺寸固定并且圖像中的數(shù)字居中,圖像大小為 28×28像素,均為黑底白字,圖10為部分MNIST數(shù)據(jù)集。由于MNIST數(shù)據(jù)集只有0-9這樣的個位數(shù),而本文還要識別兩位數(shù),所以這個數(shù)據(jù)集還不夠。另一個數(shù)據(jù)集是Touching Digit(TP)數(shù)據(jù)集,最初由奧利維拉等人創(chuàng)建[16],它包含 2 位、3 位和 4 位粘連字符串的合成數(shù)據(jù)。圖11是數(shù)字間粘連的形式[17]。Touching Digit(TP)數(shù)據(jù)集是一個粘連手寫數(shù)字字符串?dāng)?shù)據(jù)集,此數(shù)據(jù)集專門用于訓(xùn)練和測試無分割手寫數(shù)字識別算法。將TP數(shù)據(jù)集中2位粘連字符串歸一化并且轉(zhuǎn)化為csv格式。圖12是歸一化的2位粘連字符串TP數(shù)據(jù)集。
圖10 MNIST數(shù)據(jù)集
圖11 數(shù)字間粘連形式
圖12 歸一化的2位粘連字符串TP數(shù)據(jù)集
最后,將本文所用的數(shù)據(jù)集分為一個訓(xùn)練數(shù)據(jù)集和一個測試數(shù)據(jù)集,其中訓(xùn)練數(shù)據(jù)集有302793條,測試數(shù)據(jù)集有81003條。
與LeNet-5網(wǎng)絡(luò)相關(guān)的主要參數(shù)有batch、learning rate、epoch。這些參數(shù)的不同取值對神經(jīng)網(wǎng)絡(luò)的識別效果有顯著影響[18].
本文算法測試平臺配置為64位Windows 10操作系統(tǒng),core i7處理器,16GB內(nèi)存的計算機(jī),愛國者高拍儀,使用Python3編程語言并在 Python 中配置了TensorFlow,OpenCV.
3.2.1 每個參數(shù)不同取值的正確率
1)batch的取值
一個batch即為一個數(shù)據(jù)集批次,每次輸入LeNet-5網(wǎng)絡(luò)的數(shù)據(jù)個數(shù)。訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集的數(shù)據(jù)量很大,如果一次性載入所有樣本,計算機(jī)內(nèi)存將會溢出導(dǎo)致死機(jī)。將數(shù)據(jù)集分成一個一個batch便于訓(xùn)練,也可以通過改變batch的大小,提高神經(jīng)網(wǎng)絡(luò)的正確識別率。在其它參數(shù)不變的情況下,batch取不同的值,所出現(xiàn)的正確識別率和運(yùn)行時間如表1所示。
表1 不同batch下的訓(xùn)練結(jié)果
根據(jù)上面數(shù)據(jù)可知,隨著訓(xùn)練集中每批樣本數(shù)量增多,識別正確率降低,識別時間減少,綜合考慮兩個因素,本文決定將batch取值為200,這樣會使LeNet-5網(wǎng)絡(luò)在正確率和識別時間之間找到一個平衡點(diǎn)。
2)learning rate(學(xué)習(xí)率)取值
學(xué)習(xí)率即神經(jīng)網(wǎng)絡(luò)對數(shù)據(jù)進(jìn)行學(xué)習(xí)的速率。在使用梯度下降優(yōu)化算法時,學(xué)習(xí)率可以控制梯度下降的速度或者步長,從而為誤差函數(shù)找到一個最優(yōu)解。學(xué)習(xí)率太大會難以找到誤差函數(shù)的最優(yōu)解,太小會使誤差函數(shù)收斂過慢,尋找最優(yōu)解的過程將十分漫長。
圖13 試驗效果
在batch=200,其它參數(shù)不變的情況下進(jìn)行算法測試如下表2所示
表2 不同學(xué)習(xí)率的取值對正確識別率的影響
由上表可知,當(dāng)學(xué)習(xí)率為0.01時,訓(xùn)練模型無法收斂。綜合考慮學(xué)習(xí)率應(yīng)該取0.001。
3)epoch(世代)取值
在訓(xùn)練集上每完整的訓(xùn)練一次稱為一個世代,多次訓(xùn)練會提高正確識別率,但是過多的訓(xùn)練會導(dǎo)致神經(jīng)網(wǎng)絡(luò)過擬合。
在batch=200,learning rate=0.001,其它參數(shù)不變的情況下進(jìn)行算法測試,結(jié)果如下表3所示。
表3 不同epoch的取值對正確識別率的影響
選擇在測試集中正確識別率最高的epoch,即epoch=30。
綜上所述,當(dāng)batch=200,learning rate=0.001,epoch=30時LeNet-5網(wǎng)絡(luò)對測試樣本集可以到達(dá)最佳識別性能。
LeNet-5網(wǎng)絡(luò)需要分100個類,為了進(jìn)一步提高正確識別率,需要給神經(jīng)網(wǎng)絡(luò)輸入更多信息。對于具體閱卷,一套卷子每個題目的理論總分或者說滿分固定,而該題得分不可能超過滿分,所以該題識別出來的數(shù)字應(yīng)該有一個范圍,這樣對于每個題目識別出來的分?jǐn)?shù)的正確率會提高。下面通過具體試驗給出說明。
使用500張實際采集的圖片進(jìn)行試驗,試驗結(jié)果如表4所示。
表4 試驗結(jié)果
由上表可知使用每個題目滿分的信息可以提高LeNet-5網(wǎng)絡(luò)的正確識別率,因此題目滿分這一信息可以利用。
以下為部分測試結(jié)果效果圖,正確識別率為 93.20%,如圖13 效果圖所示。
手寫數(shù)字的計算機(jī)自動識別技術(shù)有巨大的應(yīng)用價值,本文以計算機(jī)輔助閱卷系統(tǒng)為應(yīng)用背景,研究了識別試卷計分欄手寫分?jǐn)?shù)的算法。本文采用的識別算法是運(yùn)用LeNet-5神經(jīng)網(wǎng)絡(luò),使用無分割手寫字符識別算法。圖像預(yù)處理環(huán)節(jié),本文結(jié)合處理對象的特點(diǎn),通過計算連通域?qū)⒚總€題號下的手寫數(shù)字作為一個整體提取出來,無需將兩位數(shù)分割成一位數(shù),從而避免了字符分割效果對識別結(jié)果的影響,較好地解決了數(shù)字粘連的問題。在字符識別環(huán)節(jié),結(jié)合本文問題的特點(diǎn),通過分析和實驗的方法,研究了LeNet-5網(wǎng)絡(luò)中參數(shù)值的選取,并根據(jù)問題的特點(diǎn)輔助一些先驗信息,有效地提高了手寫分?jǐn)?shù)的識別準(zhǔn)確率,使正確識別率達(dá)到 93.20%。
本文算法正確識別率還有待進(jìn)一步提高,對于滿分100的識別還未考慮,對于有錯誤涂改的情況也未考慮,這些都是今后需要改進(jìn)的方向。