宗春梅 張月琴 石 丁
(1.忻州師范學院計算機科學與技術系 忻州 034000)(2.太原理工大學計算機科學與技術學院 太原 030024)
手寫數字識別在現實生活中發揮著越來越重要的作用,從郵政快遞的普通信息單,到金融財務領域的數據統計,手寫數字識別都有著非常廣泛的應用。如何將手寫數字識別率進行提升并很好地應用于實際服務環節,是現階段手寫數字識別的基本目標。傳統手寫數字識別方法存在圖像預處理過程復雜、圖像特征提取冗余、網絡模型識別率不足等問題[1]。卷積神經網絡獨特的二維數據處理方式和在分類識別時自動提取圖像特征等特點可以提高手寫數字識別的泛化能力和準確度[2~4],因此引發眾多學者將如何把卷積神經網絡更好地應用于手寫數字識別服務作為研究對象,從而使手寫數字識別應用服務質量日益提升。
1998年Yann LeCun設計出LeNet-5卷積神經網絡模型,該網絡模型后來被廣泛應用于手寫數字識別技術上[4~5]。卷積神經網絡模型(ConvolutionalNeural Networks,CNN)能夠得出原始圖像的有效表征,這使得CNN能夠在原始像素基礎上經過極少的預處理識別出圖像視覺規律,但LeNet-5對于復雜問題的處理結果并不理想[5]。文獻[6]提出一種用SVM分類器進行分類識別的深度學習模型CNN-1,并將其應用于卷面手寫數字識別,取得了很好的識別效果,但該模型訓練數據僅針對MNIST數據集,具有一定的局限性。文獻[7]提出通過對RGB圖像進行高斯低通濾波、計算圖像均值等處理以提升抗幾何攻擊性,并對LeNet-5中卷積層和池化層數量及批處理數量。梯度下降步長等參數取不同值進行研究,在MNIST等數據集上得到了較好的實驗結果。文獻[8]采用LeNET-5卷積模型以階梯式處理輸入數據為手段剔除干擾信息獲得頂層數據特征,使手寫數字識別結果準確度提升,降低了圖像的過度擬合度,但在針對不同類型的圖像進行處理時效果欠佳。文獻[9]對通過建立卷積層和采樣層交替出現的網絡中間層對LeNet-5神經網絡模型進行了改進,很好地提取到了輸入數據特征,加入懲罰項以消除過擬合現象,相對減少了預處理工作量,在識別性能上優于傳統方法。文獻[10]對于卷積神經網絡LeNet-5模型用在手寫體數字識別上出現的問題提出三項優化改進辦法,提出通過添加權值衰減項降低誤識率,采用深度學習中dropout技術訓練深度神經網絡以提升網絡泛化能力和識別率,同時有效避免了過擬合現象,最終將識別率從93.61%提高到了97.30%。文獻[11]在CNN圖像識別過程中用加權PCA矩陣的形式表達卷積核,數據在CNN模型流程中利用每層的映射結果以生成碼本的方式產生高層特征向量。傳統方法中卷積神經網絡模型在進行特征提取后大都采用Softmax等進行分類,隨著支持向量機(Sup?port Vector Machine,SVM)等淺層分類器分類性能的成熟發展,學者們逐漸將CNN模型與性能更優的SVM分類器進行結合進行模式識別的研究。文獻[12]提出一種結合CNN與SVM進行手寫數字識別的方法,實驗結果證明將CNN與SVM結合進行分類效果優于一些傳統分類器,但算法的復雜度及分類速度改變不明顯。
研究表明,雖然在CNN的背景下人們已經提出不少手寫數字識別的算法,但這些算法存在以下局限性:其一,大多算法開放性差,運行速度有限,模塊易拓展較差,不支持自動求導功能等;其二,數據集相對較單一,訓練及測試數據本土性較差;其三,對模型的訓練過程缺乏及時的監管。針對上述問題,本文引入了深度學習框架PyTorch[13],并在PyTorch框架下對LeNet-5模型改進搭建手寫數字識別模型結構,使用MNIST樣本庫對改進后的模型進行訓練測試,實現了手寫數字識別并得到較高的準確率。在訓練網絡的過程中,借助TensorBoard這個可視化工具以便幫助我們監督整個網絡模型的訓練過程[14~15],并為網絡模型的參數優化提供依據和方向。對于數據集,不僅要使用MNIST數據集對改進的網絡模型進行訓練和測試,而且選用自制數據樣本對該網絡模型進行測試,以加強識別效果的可信度。實驗結果表明改進后的模型在識別準確率、網絡收斂速度等方面有所突破。最后將改進后的CNN實現手寫數字識別模型應用與本校真實的試卷分數識別中取得了一定效果,為教學環節種智能化模式識別服務的實現做出一定的技術貢獻。
實驗所使用的卷積神經網絡模型是在LeNet-5模型的基礎上改進而來。具體的改進內容及分析如下。
1)選擇ReLU激活函數。ReLU激活函數使部分神經元的輸出為0,一定程度上使卷積神經網絡擁有稀疏特性,減少了參數數量,降低了網絡計算量,使網絡模型的訓練更容易。
2)在池化層中改均值池化(mean-pooling)為最大池化(max-pooling)操作對數據進行池化處理。均值池化可以較好地保留圖像的背景信息,而最大池化能夠較好地提取圖像的紋理信息。
3)添加批標準化函數BatchNorm2d。
4)對輸入樣本大小、卷積核大小及其數量、零填充等參數進行調整。卷積層中卷積核過大或數量過多會影響網絡模型的訓練速度;若相反會提取不到有效的特征信息。
論文算法主要分為網絡訓練及測試和圖像預處理兩部分,其中網絡訓練算法步驟如下。
1)將MNIST訓練樣本圖片輸入改進的卷積神經網絡;
2)對網絡中的學習率、數據處理方式進行初始化,并設置損失函數;
3)逐層計算網絡各隱藏層的輸出值;
4)計算各網絡層的誤差損失;
5)利用反向傳播進行參數更新;
6)更新訓練樣本并判斷是否達到迭代次數,若達到,則網絡訓練結束;否則繼續之前的步驟,反復更新網絡參數,直到滿足要求;
7)將自制測試樣本進行像素取反成為黑底白字圖片;
8)調用rectangle函數,選定圖片中數字輪廓并裁剪;
9)對裁剪圖片進行20*20縮放;
10)調用copyMakeBorder函數將圖片零填充為28*28大小;
11)將經過預處理的測試樣本輸入已經訓練好的網絡中,并得出分類結果。
1)MNIST數據集
MNIST包含70000張圖片,分為有60000張圖片的訓練集和有10000張圖片的測試集。
2)自制數據集及其預處理
自制數據收集了不同人的手寫數字體來作為樣本,每張圖片在其命名中標記對應的數字,以此作為該圖片的標簽。經過與MNIST數據集相同的預處理,自制數據集中圖片的數字大小均為20*20,然后歸一化為28*28。自制數據集預處理步驟及方法如下:
(1)將圖片轉為黑底白字:調用Abs函數對圖片像素進行取反操作。
(2)將圖片中的數字輪廓選定出來:調用Find?Contours函數將選定數字輪廓,再調用Rectangle函數畫出輪廓區域。結果如圖1所示。

圖1 數字輪廓選定
(3)對圖片中的數字區域進行裁剪:調用boundingRect函數保存數字輪廓的坐標,根據坐標對圖片進行裁剪。
(4)對裁剪下來的數字圖片進行縮放:調用cv2包中的resize函數進行20*20的縮放。
(5)將經過縮放的圖片零填充為28*28大小的圖片:通過調用cv2包中的copyMakeBorder函數對圖片進行零填充。結果如圖2所示。

圖2 零填充后的圖片
文章對LeNet-5模型進行改進操作,其中包括增加和修改所用函數、調整網絡模型參數等,用形成的各個網絡模型進行實驗,并對網絡模型的結構性能和訓練結果進行了對比分析。
1)不同結構的網絡模型對比
對四種不同結構網絡模型的結構及訓練結果作比較,如表1所示。

表1 四種網絡模型結構及訓練結果比較
比較結果驗證了ReLU激活函數解決Sigmoid函數的易飽和、均值非零的問題后可以很大程度上提升網絡模型識別的準確率。從提升的準確率上可以發現,最大池化方法的使用確實讓卷積神經網絡模型提取到了更能表達圖像紋理信息的數據。
通過對卷積神經網絡模型LeNet-5不同方式的改進,搭建出不同的網絡模型,并使用MNIST數據集作為對網絡模型進行訓練和測試,同時記錄各模型的損失率,使用TensorBoard工具將損失率曲線可視化。圖3為各模型損失率對比圖。

圖3 各模型損失率對比圖
研究表明LeNet-5網絡模型中Sigmoid函數和均值池化方式不能使網絡模型收斂;CNN-1模型的損失率有明顯的下降趨勢,但收斂時間卻很長;CNN-2模型的損失率明顯優于CNN-1模型;CNN-3模型的性能最優。
2)不同參數的網絡模型對比
文章對CNN-3模型設置了四種不同的參數進行測試。參數4對應的模型準確率高達到98.35%,將其命名為CNN_S。CNN_S模型包括兩層卷積層C、兩層池化層S和三層全連接層fc共7層結構,并在層間添加了BatchNorm函數和ReLU激活函數。調參效果對比如表2所示。

表2 CNN-3模型不同參數及訓練結果比較
對CNN_S模型進行訓練后,可以對網絡訓練的情況進行可視化輸出。例如通過記錄每個epoch的梯度值來監測網絡訓練過程,可以分析出權值的更新方向并判斷其是否符合規律,繼而對神經網絡學習率做出設置和調整。
1)特征圖可視化
原始圖像輸入卷積神經網絡后,每經過一層網絡層都會進行相應的操作。CNN_S模型中使用了ReLU激活函數,因此特征圖經過了激活函數作用。圖4為手寫數字3在經過網絡模型各層結構時形成的特征圖。

圖4 手寫數字3特征圖
2)梯度更新
在神經網絡的訓練過程中,梯度消失、梯度爆炸等問題可以采用記錄每個epoch的梯度值的方式來監測并以此做出問題解決。在直方圖中,x軸表示變量大小,y軸為訓練的次數,隨著訓練次數的增加曲線顏色由深到淺。直方圖可以很直觀地顯示出每個epoch訓練時,變量值的大小。
卷積層中權重曲線隨著訓練次數的增加是條曲線,說明權重值隨著網絡的訓練也在變化,如果是直線表示網絡模型沒有進行有效的訓練。在進行網絡訓練的過程中,訓練數據經過每一層時都會進行層操作,進而發生權重、偏置的更新變化。經過良好訓練的網絡權值、偏置往往表現為曲線美觀、光滑;反之,訓練不良好的網絡則表現為多噪聲,或缺乏結構性的情況。C1層中權重weight的直方圖如圖5所示。

圖5 C1層中權重weight的直方圖
PyTorch讀取數據時,會讀取圖片數據和對應標簽。因此經過預處理的圖片數據在輸入網絡進行識別前,要將圖片數據和標簽數據保存在txt文件中。數據讀入網絡中,通過計算預測值與數據標簽相比較,可以得到識別準確的圖片數量。圖片識別準確率等于識別正確的數量除以數據總數。將經過處理后的數據圖片輸入網絡進行識別測試后,已經達到了99.2%的準確率,結果如圖6所示。

圖6 自制數據測試結果
文章中以試卷卷頭手寫分數為數據,使用CNN_S算法來研究實現手寫數字識別應用方面的問題。實驗結果表明,該算法可以準確識別試卷上的分數,驗證了卷積神經網絡在手寫數字識別應用上的可行性。
1)主要預處理過程
試卷手寫分數識別的首先需要獲取試卷卷頭上的每一個手寫分數數字,其具體的操作步驟依次包括圖片灰度化、二值化、圖片取反、去除表格邊框、數字區域提取、去噪聲、數字字符分割、歸一化等。對試卷分值圖像取反前后及歸一化效果如圖7、圖8所示。

圖7 原始試卷卷頭圖像取反前后

圖8 歸一化
2)試卷手寫分數識別的實現
對試卷中的手寫分數進行預處理后使用CNN_S模型進行識別,并對識別出的成績進行計算,得到的總成績與原始試卷的成績相同。識別后進行計算可以與卷面總分做對比,檢測識別準確性。試卷成績識別結果如圖9所示。

圖9 試卷成績識別結果圖
通過實驗可以發現,CNN_S模型可以準確識別出試卷中的手寫分數,驗證了卷積神經網絡實現手寫數字識別在實際應用中的可行性。
3)生成自動登分系統
在實現了自動評分流程中的一系列關鍵技術之后,選用Tkinter模塊開發了“忻州師范學院自動登分系統”,并通過相應組建于技術程序進行了連接,從而實現了自動化登分。自動登分系統的實現使登分環節的公平公正性得到加強。系統經歷登錄、選擇評分對象后即可自動評分并將結果顯示出來。部分界面如圖10所示。

圖10 系統部分界面
文章提出的卷積神經網絡模型在自制數據集上的誤識率低至0.8%,驗證了改進后的手寫數字自動識別模型在實際應用中的可行性,但仍有一些問題有待后續研究。首先,改進后的模型對異數據集識別率存在差異,因此需要提升算法的泛化能力;其次,繼續對文章所提出的網絡模型進行改進,提升其識別率。在實驗中,使用的數據為字跡清晰規整的數字,因此后期將嘗試使用書寫格式不規整的數字圖像作為數據進行分數識別的實驗,同時系統的實用性及功能的全面性也有待提升。在識別服務的過程中,可以將與多個數字相似度較高的數字對服務對象做出警示,以期人工干預,從而使自動化與人工相結合,使服務效果達到最佳。