楊之杰, 林雪剛, 阮 杰
(江蘇大學 計算機科學與通信工程學院, 江蘇 鎮(zhèn)江 212013)
隨著機器學習的發(fā)展,基于神經(jīng)網(wǎng)絡的深度學習已成為熱點,深度學習技術(shù)已被廣泛應用在文字、圖像識別分類研究中。 目前在國內(nèi)外,針對手寫體數(shù)字識別技術(shù)已經(jīng)比較成熟,相較于傳統(tǒng)光學字符識別(OCR)圖像識別技術(shù),基于深度學習的卷積神經(jīng)網(wǎng)絡算法可以在復雜場景下快速、準確、有效地獲取并識別場景中文字。 由于手寫體存在形態(tài)各異、千差萬別、隨意性大、書寫不規(guī)范的情況,同時還會存在數(shù)據(jù)采集時的光線、角度不同等問題,手寫數(shù)字識別問題有著很大的挑戰(zhàn)性[1]。
卷積神經(jīng)網(wǎng)絡是一種受到人類的視覺神經(jīng)系統(tǒng)和早期的時延神經(jīng)網(wǎng)絡( Time - Delay Neural NetWork)的啟發(fā)而設計提出的多層神經(jīng)網(wǎng)絡。 卷積神經(jīng)網(wǎng)絡結(jié)合了共享權(quán)重、局部感受野、空間或時間上的下采樣三種思想,使得網(wǎng)絡具有較少的訓練參數(shù)、簡單的網(wǎng)絡結(jié)構(gòu)且適應性強等優(yōu)點[2]
1994年,文獻[3] 提出LeNet,定義了卷積神經(jīng)網(wǎng)絡的基本架構(gòu)是卷積和池化,在手寫體數(shù)字領(lǐng)域識別率達到99.13%。 2012年,文獻[4] 提出AlexNet,采用雙GPU 網(wǎng)絡結(jié)構(gòu)并使用ReLU作為激活函數(shù),使得網(wǎng)絡能夠獲得更加豐富的特征。 2014年,文獻[5] 提出VGG 系列模型(包括VGG-11/VGG-13/VGG-16/VGG-19),使用很“深”的網(wǎng)絡結(jié)構(gòu)并在同年的ImageNet Challenge 上獲得分類任務第二名、定位(Localization)任務第一名。
隨著神經(jīng)網(wǎng)絡的發(fā)展,網(wǎng)絡結(jié)構(gòu)越來越深,但是對于小圖像容量的手寫體數(shù)字識別的實現(xiàn)并不需要大而深的網(wǎng)絡結(jié)構(gòu),否則對計算機處理性能將會造成巨大負擔,因此,本文設計一個簡單適宜的CNN網(wǎng)絡結(jié)構(gòu),實現(xiàn)了一個可以用于高精度識別的手寫體數(shù)字識別系統(tǒng)。 本文研發(fā)的手寫體數(shù)字識別系統(tǒng)主要分為2 個部分:GUI 交互界面與CNN 網(wǎng)絡模型。 其中,GUI 交互界面是通過Pyqt5 工具包進行搭建,再通過所搭建CNN 網(wǎng)絡模型進行相應的圖像訓練與測試,實驗仿真不同模式下的圖像識別場景,得出結(jié)論為:基于CNN 網(wǎng)絡的圖像識別算法的識別率可以達到99.9% ,具有高精度的識別性能。 本文實現(xiàn)的CNN 手寫體數(shù)字識別系統(tǒng)不僅可以有效實現(xiàn)手寫體數(shù)字識別,同時還具有簡單易行、識別性能優(yōu)良的優(yōu)點。
本文提出的手寫體數(shù)字識別系統(tǒng)是基于卷積神經(jīng)網(wǎng)絡模型實現(xiàn)的一種高效簡易的圖像識別系統(tǒng)。主要實現(xiàn)流程如圖1 所示。
圖1 手寫體數(shù)字識別系統(tǒng)實現(xiàn)流程圖Fig. 1 The flow chart of handwritten digit recognition system implementation
由圖1 可見,手寫體數(shù)字識別系統(tǒng)主要分為2 個主要模塊,分別是:基于Pyqt5 的GUI 界面和基于CNN 的深度學習模型。 其中,Pyqt5 實現(xiàn)的GUI 界面用于用戶與PC 端的人機交互,用戶可以選擇系統(tǒng)識別的模式:MNIST 數(shù)據(jù)集隨機抽取、鼠標手寫輸入;基于卷積神經(jīng)網(wǎng)絡的識別模型主要通過5 個網(wǎng)絡層:輸入層、卷積層、池化層、全連接層以及輸出層,實現(xiàn)對用戶所選取的識別模式下的手寫體圖片識別。
1.2.1 MNIST 數(shù)據(jù)集識別模式
MNIST 數(shù)據(jù)集是由手寫數(shù)字的圖片和相應的標簽組成,共有10 類,分別對應數(shù)字為0 ~9。 訓練圖片一共有60000張,可采用學習方法訓練出相應的模型。 測試圖片一共有10000 張,可用于評估訓練模型的性能[6]。
MNIST 數(shù)據(jù)集預處理過程如圖2 所示。 MNIST數(shù)據(jù)集抽取模式,要先將MNIST 數(shù)據(jù)集下載,手寫數(shù)字識別系統(tǒng)使用自定義load_mnist函數(shù)進行數(shù)據(jù)集的下載與本地保存。 本文中先將訓練集與測試集中的手寫體圖像進行預處理,下載的數(shù)據(jù)集圖像保存為歸一化的像素值(范圍是0.0 ~1.0),同時將對應的數(shù)字標簽輸入展開為一個784 的一維數(shù)組。 這樣有助于后續(xù)網(wǎng)絡模型的輸入處理。 同時,在GUI界面的畫板區(qū)域內(nèi)將MNIST 數(shù)據(jù)集的抽取圖像轉(zhuǎn)換成Qimage 對象,用于后續(xù)的識別圖像處理。
圖2 MNIST 數(shù)據(jù)集預處理過程Fig. 2 Preprocessing process of MNIST dataset
1.2.2 手寫輸入識別模式
鼠標手寫模式是基于Pyqt5 的GUI 開發(fā)框架實現(xiàn)的[7],在GUI 界面上設置一個空白畫板,背景色設置RGB(0,0,0),也就是純黑色;設置畫筆顏色為(255,255,255),也就是純白色。 利用Pyqt5 類庫中的繪圖工具進行手寫數(shù)字的交互事件實現(xiàn),本文實現(xiàn)的鼠標手寫圖像是只有黑白色的圖像,以方便2種圖像輸入模式后續(xù)使用相同的圖像識別處理過程。 用戶在GUI 界面的畫板上寫下相應的數(shù)字,點擊“識別”后,本程序就可以將畫板的內(nèi)容獲取并轉(zhuǎn)換成Qimage 對象,再通過Reshape 將其變換成符合網(wǎng)絡輸入規(guī)范的三維向量,用于后續(xù)CNN 網(wǎng)絡模型識別處理。 手寫模式的圖像采集過程如圖3 所示。
圖3 手寫模式的圖像采集過程Fig. 3 Image acquisition process in handwriting mode
1.2.3 CNN 網(wǎng)絡實現(xiàn)
識別處理是針對上述的2 種輸入識別模式所采集的手寫體數(shù)字圖像進行CNN 網(wǎng)絡模型輸入的規(guī)范化圖像對象處理,保證統(tǒng)一化的網(wǎng)絡輸入層的參數(shù)輸入。 在獲取了Qimage 對象后,需要將其轉(zhuǎn)換成Python 中的PIL image 對象,將圖像大小修改成1 通道的28×28 像素大小,同時批量大小為1,再將其轉(zhuǎn)換成灰度值歸一化的數(shù)組,規(guī)范成網(wǎng)絡輸入類型。手寫體數(shù)字圖像的預處理過程如圖4 所示。
圖4 手寫體數(shù)字圖像的預處理過程Fig. 4 Preprocessing of handwritten digital images
相比較傳統(tǒng)神經(jīng)網(wǎng)絡,CNN 網(wǎng)絡新增了卷積層(Convolution 層)和池化層(Pooling 層),因此一般的CNN 模型就是由卷積層、池化層和全連接層構(gòu)成的。 Convolution 層實現(xiàn)結(jié)構(gòu)如圖5 所示。 本文通過一個簡單合適的CNN 模型進行手寫體數(shù)字識別實現(xiàn),網(wǎng)絡結(jié)構(gòu)為“Convolution-ReLU-Pooling-Affine-ReLU-Affine-Softmax”。 CNN 網(wǎng)絡模型實現(xiàn)架構(gòu)如圖6 所示。 由圖6 可看到,對其中各組成部分擬展開闡釋分述如下。
圖5 Convolution 層實現(xiàn)結(jié)構(gòu)Fig. 5 Convolution layer implementation structure
圖6 CNN 網(wǎng)絡模型實現(xiàn)架構(gòu)Fig. 6 Implementation architecture of CNN network model
(1)卷積層。 在通過前一步的圖像采集與預處理后,輸入到卷積層(Convolution 層),該層的參數(shù)是通過反向傳播算法優(yōu)化得到的,隨后再將輸入元素進行卷積運算輸入到激活函數(shù)中,得到該層的輸出特征圖,卷積運算見式(1):
卷積層的作用相當于圖像處理過程中的“濾波器”運算,以此獲取圖像的特征,本文設計的卷積層的卷積核(濾波器)的數(shù)量為30,大小為5×5,步幅為1,填充為0。
(2)ReLU層。ReLU層可以理解為激活函數(shù)層,當輸入為正的時候,導數(shù)不為零,從而進行基于梯度的學習,對于圖像數(shù)據(jù)輸入而言,ReLU函數(shù)很適合進行模型中非線性映射學習,減少了參數(shù)之間的相互依存關(guān)系,避免了過擬合現(xiàn)象的發(fā)生[8]。ReLU函數(shù)的數(shù)學公式為:
(3)池化層(Pooling 層)。 可以縮小圖像尺寸,減少運算量,通常在卷積層之后會得到維度很大的特征,將特征切分為多個區(qū)域,取其最大值,得到新的、維度較小的特征,并在偏置處理后通過激活函數(shù)輸出,如式(3)所示:
本文實現(xiàn)的池化層,主要通過數(shù)據(jù)展開、求最大值、Reshape 成規(guī)范大小三個步驟來實現(xiàn)。 其中,數(shù)據(jù)展開是為了簡化本網(wǎng)絡中的向量運算,將四維向量展開成二維向量,便于數(shù)據(jù)處理;接著,求出每一行的最大值,作為輸出的元素;最后,將先前處理后的元素Reshape 成一個(30,1,12,12)的四維向量,輸入到下一層。
(4)Affine 層。 可以理解為全連接層,在網(wǎng)絡層中的正向傳播中進行矩陣乘積運算,主要是進行神經(jīng)網(wǎng)絡中的加權(quán)運算與偏置運算,在本文系統(tǒng)設計中運算為:np.dot(X,W)+B。
(5)Softmax 層。 作為最后的輸出層,主要用來將前一層(全連接層)的輸出作為輸入值進行正規(guī)化,調(diào)整到0~1 之間后再輸出,用于實現(xiàn)最終的圖像識別分類。 此處需用到的數(shù)學公式為:
其中,yi是前一層的輸出目標值。
1.2.4 界面顯示
本文實現(xiàn)的PC 端的手寫體數(shù)字識別系統(tǒng)界面是通過Pyqt 工具包搭建的,Pyqt 是一個用于創(chuàng)建GUI 應用程序的跨平臺工具包,可將Python 與Qt 庫融為一體。 也就是說,PyQt 允許使用Python 語言調(diào)用Qt 庫中的API。 本文使用Python3.0 版本在VScode 編輯器進行手寫體數(shù)字識別GUI 應用開發(fā)。
通過Qt 界面生成器(Qt designer)[9],可以將所需要的控件進行可視化的拖拽放置,大大提高了界面設計效率。 手寫體數(shù)字識別系統(tǒng)設計界面如圖7所示。 由圖7 可看到,本文的系統(tǒng)界面主要是2 個部分。 第一部分是手寫體數(shù)字識別模式選擇,模式選擇的布局就是通過QLabel、QComboBox 以及QPushButton 控件組成的。 其中,QComboBox 下拉框組件實現(xiàn)“MNIST 隨機抽取”與“鼠標手寫輸入”模式選擇,3 個QPushButton 按鈕用于實現(xiàn)MNIST 圖片抽取、清除數(shù)據(jù)、識別事件。
圖7 手寫體數(shù)字識別系統(tǒng)設計界面Fig. 7 Design interface of handwritten digit recognition system
第二個部分是顯示區(qū)域,主要是實現(xiàn)所識別手寫體數(shù)字圖像的顯示與識別結(jié)果、識別率的顯示。通過一個QLabel 組件用于顯示當前所識別的手寫體數(shù)字圖像,后續(xù)的圖像采集和預處理過程都是通過Qimage 對象變換實現(xiàn)的。
基于上述的GUI 界面與網(wǎng)絡模型的實現(xiàn),本小節(jié)主要針對實驗仿真結(jié)果進行分析,并且得出有效的實驗結(jié)論,證明本文所實現(xiàn)的手寫體數(shù)字識別系統(tǒng)有著優(yōu)良性能。
實驗仿真測試分為2 部分。 第一部分是按照“MNIST 隨機抽取”識別模式進行仿真測試,第二部分是按照“鼠標手寫輸入”識別模式進行仿真測試。2 種模式下分別進行10 組手寫體數(shù)字圖像識別仿真測試,每組選取10 張手寫體圖像進行識別。
在第一種識別模式下,通過MNIST 數(shù)據(jù)集連續(xù)抽取10 張圖片進行識別,分別進行10 組圖像隨機抽取實驗,以每組的識別率均值作為本組實驗數(shù)據(jù);在第二種模式下,通過本系統(tǒng)的GUI 界面連續(xù)手寫輸入0~9、共10 個數(shù)字進行識別,重復實驗10 組,以每組的識別率均值作為本組實驗數(shù)據(jù)。 MNIST 隨機抽取識別率如圖8 所示,手寫輸入的識別率如圖9 所示。
圖8 MNIST 隨機抽取識別率Fig. 8 Recognition rate of MNIST random extraction
圖9 手寫輸入的識別率Fig. 9 Recognition rate of handwritten input
實驗結(jié)果顯示,MNIST 隨機抽取的10 組實驗圖像識別率都在99.9% 以上,識別準確率很高;相比之下,鼠標手寫輸入的仿真結(jié)果中,識別率分布在98.75% ~99.75% 區(qū)間,相較于MNIST 數(shù)據(jù)集測試的識別率而言,有所降低。
對于手寫輸入模式下的手寫體數(shù)字識別,在仿真實驗中可以觀察到不同手寫數(shù)字的識別率會出現(xiàn)較大差異,如圖10 所示。 由圖10 可看到,數(shù)字中“0”、“1”、“2”、“3”、“5”、“6”、“7”、“8”的識別率都較穩(wěn)定,在99%左右,而數(shù)字“4”的識別率在97.5%左右,數(shù)字“9”的識別率在94%左右,識別精確度相較于其他數(shù)字較低。
圖10 數(shù)字0 ~9 的識別率Fig. 10 Recognition rate of numbers 0 ~9
以數(shù)字“9”為例,數(shù)字“9”的手寫體與“1”、“7”數(shù)字的形體十分相似,對識別造成了干擾。 誤判結(jié)果如圖11 所示,即使識別率達到了99.94% 但是卻誤判成數(shù)字“1”,也就是本文設計實現(xiàn)得到的CNN深度學習網(wǎng)絡對容易混淆的數(shù)字手寫體的識別會出現(xiàn)誤判現(xiàn)象[10]。 即使是人為判斷,因個體差異也會出現(xiàn)對數(shù)字的錯誤辨別,對于機器識別出現(xiàn)特殊字體的誤判也在合理范圍內(nèi)。
圖11 數(shù)字“9”的誤判Fig. 11 Misjudgment of the number “9”
從2 種識別模式下的仿真結(jié)果可以看出,MNIST 數(shù)據(jù)集抽取的圖像,系統(tǒng)識別率接近99.9%,說明本文實現(xiàn)的CNN 網(wǎng)絡的識別性能優(yōu)良,簡單易行,具有很好的實用性,基本達到了高精度目標識別的要求;而鼠標手寫輸入下的圖像,系統(tǒng)識別率卻會在98%~99%之間波動,同時也會根據(jù)用戶書寫規(guī)范程度有很大關(guān)系,這說明了本文的CNN 網(wǎng)絡模型出現(xiàn)了過擬合現(xiàn)象,只針對MNIST 數(shù)據(jù)集中的數(shù)據(jù)有很好的識別性能,而對于個體差異的書寫體卻不能做到精準識別。 因此需要對網(wǎng)絡模型進行再深層的優(yōu)化,提高可信度。