王洪申,李昌德
(蘭州理工大學機電工程學院,甘肅 蘭州 730050)
手寫字符的計算機自動識別具有良好的應用價值,如郵件自動分揀[1]和銀行票據自動識別[2]等。從上個世紀60、70年代開始,外國學者就已經對字符識別展開了研究[3],從模板匹配到機器學習,從打印字符到手寫字符,字符識別領域理論方法不斷進步,識別場景愈發復雜[4]。手寫數字識別是字符識別中重要的內容之一,其識別有其自身的特點:首先10個阿拉伯數字在實際手寫過程中千變萬化,有些阿拉伯數字形態還很相似,在世界各國不同地方書寫筆跡也有許多差異。其次,數字之間缺少上下文語意環境,無法根據已經識別的數字識別下一個數字,輸入的可用信息較少,多位數的識別也有一定的困難,隨著位數的增加識別困難也逐步升高。
隨著計算機硬件性能不斷提高,深度學習理論不斷發展,卷積神經網絡應用在字符識別領域取得較大成功,主要有兩大算法:基于分割的識別和基于無分割的識別[5]。基于分割的識別主要有準確分割和過分割的方法[6]。前者最大問題是對于粘連的數字無法準確分割。過分割的基本思想是多次分割,找到最佳分割點,這種方法計算量大,算法不夠穩定。LeNet-5是一種用于手寫體字符識別的非常高效的卷積神經網絡,商業上最典型的應用就是識別支票上的手寫數字。從上個世紀90年代開始,美國大多數銀行都使用這種技術識別支票上的手寫數字[7]。本文以試卷計分欄手寫分數的計算機自動識別為應用背景,采用無分割方法,將一位數或兩位數的手寫數字作為一個整體輸入LeNet-5神經網絡識別試卷計分欄手寫分數。通過對該神經網絡的訓練和參數調整,獲得較好的手寫分數識別效果,為計算機輔助閱卷和試卷分析系統提供核心算法。
試卷計分欄手寫分數識別方法的主要步驟:對試卷計分欄中的手寫分數圖像提取和預處理;利用數據集訓練LeNet-5網絡;運用訓練好的神經網絡,輔助問題的先驗信息,對手寫數字進行識別。本文算法流程圖如圖1所示。提取手寫分數圖像這一步驟稱為圖像預處理,主要方法有圖像ROI檢測與選擇、色彩空間轉換、二值化、輪廓檢測與篩選、形態學處理等。利用數據集訓練LeNet-5網絡,主要的工作是以csv格式創建包括來自網絡的圖像數據集和自采集圖片的數據集,訓練和改進該神經網絡,并完成對其的測試。將試卷計分欄各題的理論總分輸入訓練好的LeNet-5網絡,這些先驗信息使LeNet-5網絡識別手寫分數的正確率得到了提高。圖1表示本文算法設計思路的一個流程圖。

圖1 算法整體框架

圖2 高拍儀采集到的圖片
對于在普通環境下采集到的圖片來說,圖像預處理是手寫字符完整提取的重要前提。完整的字符輸入神經網絡將會提高字符識別準確率。本文處理對象為試卷上的手寫體數字,為試卷上每道題的得分和總分數,包括一位數和兩位數(暫不考慮100分的情況)。試卷的計分欄圖像通過高拍儀(可以實現固定時間自動拍攝,并可保證試卷與拍攝相機的距離固定)獲得,如圖2所示。對所獲得的圖像預處理主要步驟包括:ROI區域選擇、手寫數字輪廓檢測、輪廓排序和手寫數字圖片獲取。
首先,需要對采集到的圖片進行去噪。由于實際中試卷卷面的污點和采集圖像時光照等因素的影響,圖片的噪聲類似于椒鹽噪聲,所以使用中值濾波器去噪[8]。其次,將采集的圖片進行直方圖均衡化,使圖片中紅色更加鮮艷以便后續區域提取。最后,利用紅色信息將手寫分數提取出來。ROI(region of interest)是指圖像中感興趣的區域,在OpenCV中設置圖像 ROI 區域,實現只對 ROI 區域的操作。使用inRange()函數,設置紅色在HSV色彩空間的范圍值,實現對紅色區域(在這種情況下,該區域就稱為ROI區域)的提取。試卷計分欄的手寫分數是紅色,它和周圍的顏色差異較大。利用紅色信息能夠產生基本完整且只包含手寫分數的圖片。下圖3顯示了選擇出來的ROI區域。

圖3 ROI區域
ROI區域選擇完成后,就需要把每一個題號下的分數分割出來。有兩種常用方法:垂直投影法和連通域法[9]。垂直投影法在分割規則字符時,效果較好,如車牌識別[10]。但手寫字符通常不整齊,甚至兩個數字字符交錯和粘連情況也時有出現。本文主要考慮兩位數字粘連的情況。采用垂直投影法,會導致分割不完整或分割錯誤。連通域的方法是將每個不相連的圖像區域標記成一個單獨的塊,然后對塊進行提取,完成手寫字符分割。在計分欄中,兩個題號距離較遠,其下方的手寫分數通常是分別寫入,不會出現粘連的情況,這就保證了經過連通域計算必然能夠將不同的題號下的手寫分數提取出來。對于兩位數的手寫分數,通過對圖像膨脹處理,將其作為一個整體提取出來。本文采用的一種連通域算法是輪廓提取算法,在OpenCV中通過函數findContours()實現輪廓檢測,在這里只需要檢測手寫數字字符的外輪廓,因為在后續過程中,利用外輪廓的外接矩形截取出包含手寫字符的圖片。圖4是為檢測輪廓而進行膨脹的圖片。

圖4 膨脹處理后的圖片
利用python接口的OpenCV庫中findContours()函數檢測字符輪廓,識別出來的輪廓都存儲在一個列表中。但列表中的輪廓排列順序是混亂的,它和試卷題號不能對應,這導致后續步驟識別出來的結果無法對應到相應的題目。因此,需要對檢測出來的輪廓按原來順序從左到右排序。由于這些圖片上的分數在X軸方向差異特別大,因此考慮使用字符輪廓質心坐標對輪廓進行排序。通過使用函數moments()求出每個輪廓的質心坐標,根據質心X坐標從小到大進行排序。在輪廓排序前,其實也需要對輪廓進行篩選,在實際書寫中,筆畫斷開是常有的情況,這時斷裂的筆畫會被檢測成一個輪廓,這樣的輪廓是不需要的,而且會對輪廓排序產生嚴重干擾,因此必須對輪廓進行篩選。通過對檢測出來的輪廓面積大小設定一個閾值,從而將所需輪廓篩選出來。圖5是待排序輪廓質心x坐標值。

圖5 輪廓質心x坐標值
正確的輪廓已經檢測并且篩選出來了,需要根據輪廓外接矩形坐標將包含手寫數字的圖片截取出來。OpenCV提供了函數boundingRect(),該函數能夠獲取輪廓外接矩形左上角的坐標值以及該外接矩形的寬和高。根據這些信息,包含完整手寫數字的圖片就被截取出來了。至此,每個題號下的分數便被收集好了,后續只需要將這些圖片轉換格式便可以輸入LeNet-5網絡中進行訓練識別了。圖6是截取出來的圖片。

圖6 截取出來的圖片
LeNet-5 是Yann LeCun設計出來專門用于識別手寫字符的神經網絡[11],是一種典型的卷積神經網絡模型,該網絡包含輸入層在內共有八層,每一層都包含多個參數(權重)。C層代表的是卷積層,通過卷積操作,可以使原信號特征增強,并降低噪音。S層是一個下采樣層,利用圖像局部相關性的原理,對圖像進行子抽樣,可以減少數據處理量,同時也可保留一定的有用信息。圖7為 LeNet-5 的網絡結構示意圖。

圖7 LeNet-5網絡結構
本文對LeNet-5做了一些參數調整以提高手寫字符的識別準確率,主要的調整有修改batch的大小、learning rate的大小、epoch的值、卷積核的大小和數量、權重數量、神經元數量、激活函數和全連接層神經元數量等。本文需要對0到99做100個分類,故需要將全連接層神經元數量設置為100。
訓練和測試LeNet-5網絡需要大量圖像數據。本文采用的圖像數據集包括來自網絡數據集和自建數據集,其中來自網絡的數據集大部分用于訓練,小部分用于測試,自建數據集全部用于測試。為了將圖像數據輸入神經網絡,都需要將圖像格式進行轉化,本文使用的圖片采用csv(Comma-Separated Values)數據格式[12],該數據文件是一個字符序列,可以由任意數目的記錄組成,記錄間以某種換行符分割。每條記錄由字段組成,字段間的分隔符是其它字符或者字符串。所有的記錄都有完全相同的字段序列,相當于一個結構化表的純文本形式。圖8是圖像的csv文件格式。

圖8 csv文件
3.1.1 自建數據集
自建數據集即從手寫分數計分欄中截取出來的圖像制作成的數據集。這些截取的圖像有一個普遍的問題是圖像的尺寸大小不一,這會導致LeNet-5網絡難以搭建,尺寸過大的圖像過多會導致神經網絡計算量巨大[13],因此需要在不損失圖片主要信息的條件下將圖片處理成相同且較小的大小。本文中將圖像尺寸歸一為28×28像素。圖9為歸一化后的圖片。

圖9 歸一化后的圖片
3.1.2 來自網絡的數據集
從網絡上下載的數據集有MNIST database 和Touching Digit (TP) database[14-15]。MNIST手寫數字數據庫由一個60000個示例的訓練集和一個10000個示例的測試集組成,所有圖像數據均是手寫的1位阿拉伯數字。它是NIST提供的一個更大集合的子集。圖片已經被歸一化,圖像尺寸固定并且圖像中的數字居中,圖像大小為 28×28像素,均為黑底白字,圖10為部分MNIST數據集。由于MNIST數據集只有0-9這樣的個位數,而本文還要識別兩位數,所以這個數據集還不夠。另一個數據集是Touching Digit(TP)數據集,最初由奧利維拉等人創建[16],它包含 2 位、3 位和 4 位粘連字符串的合成數據。圖11是數字間粘連的形式[17]。Touching Digit(TP)數據集是一個粘連手寫數字字符串數據集,此數據集專門用于訓練和測試無分割手寫數字識別算法。將TP數據集中2位粘連字符串歸一化并且轉化為csv格式。圖12是歸一化的2位粘連字符串TP數據集。

圖10 MNIST數據集

圖11 數字間粘連形式

圖12 歸一化的2位粘連字符串TP數據集
最后,將本文所用的數據集分為一個訓練數據集和一個測試數據集,其中訓練數據集有302793條,測試數據集有81003條。
與LeNet-5網絡相關的主要參數有batch、learning rate、epoch。這些參數的不同取值對神經網絡的識別效果有顯著影響[18].
本文算法測試平臺配置為64位Windows 10操作系統,core i7處理器,16GB內存的計算機,愛國者高拍儀,使用Python3編程語言并在 Python 中配置了TensorFlow,OpenCV.
3.2.1 每個參數不同取值的正確率
1)batch的取值
一個batch即為一個數據集批次,每次輸入LeNet-5網絡的數據個數。訓練數據集和測試數據集的數據量很大,如果一次性載入所有樣本,計算機內存將會溢出導致死機。將數據集分成一個一個batch便于訓練,也可以通過改變batch的大小,提高神經網絡的正確識別率。在其它參數不變的情況下,batch取不同的值,所出現的正確識別率和運行時間如表1所示。

表1 不同batch下的訓練結果
根據上面數據可知,隨著訓練集中每批樣本數量增多,識別正確率降低,識別時間減少,綜合考慮兩個因素,本文決定將batch取值為200,這樣會使LeNet-5網絡在正確率和識別時間之間找到一個平衡點。
2)learning rate(學習率)取值
學習率即神經網絡對數據進行學習的速率。在使用梯度下降優化算法時,學習率可以控制梯度下降的速度或者步長,從而為誤差函數找到一個最優解。學習率太大會難以找到誤差函數的最優解,太小會使誤差函數收斂過慢,尋找最優解的過程將十分漫長。

圖13 試驗效果
在batch=200,其它參數不變的情況下進行算法測試如下表2所示

表2 不同學習率的取值對正確識別率的影響
由上表可知,當學習率為0.01時,訓練模型無法收斂。綜合考慮學習率應該取0.001。
3)epoch(世代)取值
在訓練集上每完整的訓練一次稱為一個世代,多次訓練會提高正確識別率,但是過多的訓練會導致神經網絡過擬合。
在batch=200,learning rate=0.001,其它參數不變的情況下進行算法測試,結果如下表3所示。

表3 不同epoch的取值對正確識別率的影響
選擇在測試集中正確識別率最高的epoch,即epoch=30。
綜上所述,當batch=200,learning rate=0.001,epoch=30時LeNet-5網絡對測試樣本集可以到達最佳識別性能。
LeNet-5網絡需要分100個類,為了進一步提高正確識別率,需要給神經網絡輸入更多信息。對于具體閱卷,一套卷子每個題目的理論總分或者說滿分固定,而該題得分不可能超過滿分,所以該題識別出來的數字應該有一個范圍,這樣對于每個題目識別出來的分數的正確率會提高。下面通過具體試驗給出說明。
使用500張實際采集的圖片進行試驗,試驗結果如表4所示。

表4 試驗結果
由上表可知使用每個題目滿分的信息可以提高LeNet-5網絡的正確識別率,因此題目滿分這一信息可以利用。
以下為部分測試結果效果圖,正確識別率為 93.20%,如圖13 效果圖所示。
手寫數字的計算機自動識別技術有巨大的應用價值,本文以計算機輔助閱卷系統為應用背景,研究了識別試卷計分欄手寫分數的算法。本文采用的識別算法是運用LeNet-5神經網絡,使用無分割手寫字符識別算法。圖像預處理環節,本文結合處理對象的特點,通過計算連通域將每個題號下的手寫數字作為一個整體提取出來,無需將兩位數分割成一位數,從而避免了字符分割效果對識別結果的影響,較好地解決了數字粘連的問題。在字符識別環節,結合本文問題的特點,通過分析和實驗的方法,研究了LeNet-5網絡中參數值的選取,并根據問題的特點輔助一些先驗信息,有效地提高了手寫分數的識別準確率,使正確識別率達到 93.20%。
本文算法正確識別率還有待進一步提高,對于滿分100的識別還未考慮,對于有錯誤涂改的情況也未考慮,這些都是今后需要改進的方向。