張文 王意 劉天宇
摘要:手寫數(shù)字識別是圖像分類的常見應(yīng)用方向,可廣泛應(yīng)用于快遞編碼識別、簡歷電話號碼識別、電腦自動判卷等方面。為了解決BP神經(jīng)網(wǎng)絡(luò)在手寫數(shù)字識別中全連接模型參數(shù)過多、網(wǎng)絡(luò)計(jì)算數(shù)據(jù)量大、識別準(zhǔn)確率低等問題,采用卷積神經(jīng)網(wǎng)絡(luò)CNN進(jìn)行手寫數(shù)字識別。采用PyTorch搭建了網(wǎng)絡(luò)模型,對MNIST數(shù)據(jù)集進(jìn)行訓(xùn)練,手寫數(shù)字識別;采用交叉熵?fù)p失函數(shù)和Adam優(yōu)化算法,并設(shè)置學(xué)習(xí)率為0.001;經(jīng)過100個(gè)Epoch后,識別準(zhǔn)確率達(dá)到了99%,通過GUI界面可以識別自制的手寫數(shù)字,具有很強(qiáng)的魯棒性。
關(guān)鍵詞:卷積神經(jīng)網(wǎng)絡(luò);PyQt5;MNIST數(shù)據(jù)集;手寫數(shù)字識別
中圖分類號:TP391? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2023)35-0027-03
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID)
0 引言
目前在國內(nèi)外,針對手寫體數(shù)字識別技術(shù)已經(jīng)比較成熟,相較于傳統(tǒng)光學(xué)字符識別(OCR)圖像識別技術(shù),基于深度學(xué)習(xí)的卷積神經(jīng)網(wǎng)絡(luò)算法可以在復(fù)雜場景下快速、準(zhǔn)確、有效地獲取并識別場景中文字[1-2]。本文引用的文獻(xiàn)中關(guān)于手寫數(shù)字識別研究測試時(shí)采用的是與MNIST數(shù)據(jù)集同樣類型的黑色背景白色字體圖像均沒有涉及測試白色背景黑色字體類型的圖像,為了解決這個(gè)問題,本文基于卷積神經(jīng)網(wǎng)絡(luò)CNN對MNIST數(shù)據(jù)集進(jìn)行訓(xùn)練,采用PyTorch搭建自制網(wǎng)絡(luò)模型,使用PyQt5設(shè)計(jì)GUI界面,并最終實(shí)現(xiàn)CNN與GUI界面結(jié)合,從而在GUI界面可以測試手寫數(shù)字,實(shí)現(xiàn)識別自制的黑色背景白色字體和白色背景黑色字體的手寫數(shù)字準(zhǔn)確率均達(dá)到預(yù)期。
1 卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)CNN流程主要是先傳入圖像,然后進(jìn)行卷積、池化操作,特征圖展平后進(jìn)行全連接,最后返回類別結(jié)果,其中輸入層傳入的灰色圖像則是單通道,如圖1所示。
卷積層與池化層涉及的參數(shù)如表1所示。
卷積層之后的特征圖尺寸邊長遵循式(1)計(jì)算規(guī)則:
[H2=H1-2p+fs+1]? ? ? (1)
池化層之后的特征圖尺寸邊長遵循式(2)計(jì)算規(guī)則:
[H2=H12]? ? ? ? ? (2)
2 PyTorch與MNIST
本文的網(wǎng)絡(luò)模型采用PyTorch框架進(jìn)行搭建,用到的MNIST數(shù)據(jù)集可以在PyTorch框架中直接下載,數(shù)據(jù)集包含55 000個(gè)訓(xùn)練集樣本、5 000個(gè)驗(yàn)證集樣本以及10 000個(gè)測試集樣本,每個(gè)樣本都為二值化圖像數(shù)據(jù),像素為28×28[3-4],MNIST數(shù)據(jù)集的每張圖片都是0~9這10個(gè)數(shù)字類別的黑色背景白色字體手寫數(shù)字圖像,樣本實(shí)例如圖2所示。
3 PyQt5概述
PyQt5是專門用于開發(fā)GUI應(yīng)用程序的Python第三方庫,其特點(diǎn)是信號Signal與槽slot機(jī)制,使得用戶可以迅速、便捷地實(shí)現(xiàn)GUI程序的設(shè)計(jì)。
Qt設(shè)計(jì)師(designer.exe) 是PyQt5中的一個(gè)非常便捷的控件可視化工具,它可以通過拖拽控件方便地進(jìn)行GUI界面的設(shè)計(jì)和布局,同時(shí)Qt設(shè)計(jì)師可以實(shí)現(xiàn)預(yù)覽GUI界面。通過Qt界面生成器(designer.exe) ,可以將所需要的控件進(jìn)行可視化的拖拽放置,大大提高了界面設(shè)計(jì)效率[5-6]。PyQt5能夠?qū)崿F(xiàn)界面與邏輯分離,避免因修改算法邏輯而影響到界面的布局,也可以避免界面布局的更改而影響到代碼邏輯的運(yùn)行。
4 算法設(shè)計(jì)與實(shí)現(xiàn)
4.1 算法實(shí)現(xiàn)流程
算法總體設(shè)計(jì)流程如圖3所示,先通過卷積神經(jīng)網(wǎng)絡(luò)CNN對MNIST數(shù)據(jù)集進(jìn)行訓(xùn)練,依次經(jīng)過輸入層、卷積層、池化層、全連接層、輸出層,網(wǎng)絡(luò)模型訓(xùn)練結(jié)束后通過torch.save(model.state_dict(),path)保存模型參數(shù);GUI界面啟動后先實(shí)例化卷積神經(jīng)網(wǎng)絡(luò),再調(diào)用并恢復(fù)網(wǎng)絡(luò)模型參數(shù),從而可以選擇圖像進(jìn)行識別圖像并顯示識別結(jié)果。
4.2 網(wǎng)絡(luò)模型
在本文中,使用的自制卷積神經(jīng)網(wǎng)絡(luò)模型CNN-Six每一個(gè)卷積層采用卷積核尺寸邊長[f=3]、滑動窗口步長[s=1]、邊緣填充層數(shù)[p=0],因此每次卷積之后,新特征圖的邊長[H2=H1-2],為了彌補(bǔ)卷積操作過程中帶來的網(wǎng)絡(luò)模型參數(shù)損失,每次卷積后特征圖的通道數(shù)值翻倍,開始輸入時(shí)的通道是1,結(jié)束時(shí)的通道數(shù)是8。
4.2.1 網(wǎng)絡(luò)流程
CNN-Six是一個(gè)6層神經(jīng)網(wǎng)絡(luò),網(wǎng)絡(luò)執(zhí)行兩次“卷積+卷積+池化”流程;并且每次卷積操作結(jié)束都將結(jié)果傳給了Relu激活函數(shù),從而能夠更好地映射特征,增強(qiáng)卷積神經(jīng)網(wǎng)絡(luò)的表達(dá)能力;最后執(zhí)行兩次全連接對圖像進(jìn)行數(shù)字的10分類。
首先,傳入圖片像素尺寸為28×28的黑白單通道圖像,對圖像進(jìn)行歸一化操作;卷積操作:特征圖邊長由[28-2=26]轉(zhuǎn)變?yōu)?6,通道數(shù)變?yōu)?;再次卷積操作:特征圖邊長由[26-2=24]轉(zhuǎn)變?yōu)?4,通道數(shù)變?yōu)?;池化操作:特征圖邊長由[242=12]轉(zhuǎn)變?yōu)?2,通道數(shù)保持不變;卷積操作:特征圖邊長由[12-2=10]轉(zhuǎn)變?yōu)?0,通道數(shù)變?yōu)?;再次卷積操作:特征圖邊長由[10-2=8]轉(zhuǎn)變?yōu)?,通道數(shù)變?yōu)?6;池化操作:特征圖邊長由[82=4]轉(zhuǎn)變?yōu)?,通道數(shù)保持不變;展平操作:特征圖展平為16×4×4節(jié)點(diǎn);全連接操作:映射成80個(gè)節(jié)點(diǎn);全連接操作:80個(gè)節(jié)點(diǎn)映射成10個(gè)節(jié)點(diǎn);輸出10分類結(jié)果。CNN-Six網(wǎng)絡(luò)模型流程如4所示。
4.2.2 網(wǎng)絡(luò)訓(xùn)練
卷積神經(jīng)網(wǎng)絡(luò)在PyTorch框架中定義網(wǎng)絡(luò)模型類時(shí)包含了前向傳播的階段,即基礎(chǔ)的輸入層、輸出層以及卷積層、池化層和全連接層,但是沒有定義反向傳播。
反向傳播是計(jì)算卷積神經(jīng)網(wǎng)絡(luò)中參數(shù)梯度的階段,其可以通過鏈?zhǔn)椒▌t將損失函數(shù)的梯度值即導(dǎo)數(shù)值從輸出層向輸入層進(jìn)行相反操作的流程,進(jìn)而可以計(jì)算出卷積神經(jīng)網(wǎng)絡(luò)模型中每個(gè)參數(shù)對損失函數(shù)的貢獻(xiàn)。梯度更新可以根據(jù)梯度的方向和大小,通過減去學(xué)習(xí)率乘以梯度來更新網(wǎng)絡(luò)模型中對應(yīng)的參數(shù)數(shù)值;更新之后的網(wǎng)絡(luò)模型參數(shù)將會被用于下一個(gè)迭代epoch。
迭代次數(shù)epoch設(shè)置為100,CNN-Six網(wǎng)絡(luò)模型執(zhí)行epoch。訓(xùn)練結(jié)束后,模型的誤差值和正確率結(jié)果如圖5所示。
通過損失值曲線和正確率曲線可以看出,CNN-Six網(wǎng)絡(luò)模型訓(xùn)練集的識別正確率略優(yōu)于測試集,同時(shí)訓(xùn)練集和測試集的數(shù)字識別正確率都可以實(shí)現(xiàn)在99%左右,訓(xùn)練效果達(dá)到預(yù)期。
其中0~9這10個(gè)數(shù)字類別各自的預(yù)測正確率如圖6所示。
從各類別的測試正確率來看,CNN-Six網(wǎng)絡(luò)模型對于MNIST數(shù)據(jù)集圖像的預(yù)測較為準(zhǔn)確。
4.2.3 底色判定
由于MNIST數(shù)據(jù)集的每張圖像都是黑色背景白色字體類型圖像,所以如果測試識別手寫數(shù)字圖像傳入的是黑色背景白色字體類型圖像可以正確識別,但是如果傳入的是白色背景黑色字體類型圖像則可能不會正確識別。
為了在傳入手寫數(shù)字圖像后,系統(tǒng)可以自動分辨圖像是黑色背景白色字體類型圖像還是白色背景黑色字體類型圖像,在傳入圖像操作語句后添加一個(gè)底色判定語句塊。
設(shè)[Nw]、[Nb]數(shù)值均為0;Pic是待預(yù)測的圖像,其長度與寬度分別為[TL]、[TW];prediction是預(yù)測圖像操作,底色判定具體流程如下:
FOR L=0 TO [TL]:
FOR W=0 TO [TW]:
IF Pic[L][W]>=100 THEN [Nw]=[Nw]+1
ELSE [Nb]=[Nb]+1
END IF
IF [Nw<Nb] THEN prediction
ELSE
FOR L=0 TO [TL]:
FOR W=0 TO [TW]:
Pic[L][W]=255-Pic[L][W]
prediction
END IF
4.2.4 模型對比
將CNN-Six網(wǎng)絡(luò)模型分別與ResNet-18、VGG-16網(wǎng)絡(luò)測試結(jié)果進(jìn)行對比,結(jié)果如表2所示。由表2可知,從識別正確率看,CNN-Six網(wǎng)絡(luò)模型在手寫數(shù)字識別正確率相對較高。
以上結(jié)果可以表明,CNN-Six網(wǎng)絡(luò)模型可以快速精確地識別手寫數(shù)字。
4.3 識別測試
GUI界面顯示的同時(shí)傳入CNN-Six網(wǎng)絡(luò)模型訓(xùn)練好后保存的網(wǎng)絡(luò)模型參數(shù)文件路徑,實(shí)例化一個(gè)新的CNN-Six網(wǎng)絡(luò)模型并加載網(wǎng)絡(luò)參數(shù),選擇手寫數(shù)字圖像即可進(jìn)行識別,GUI界面就會顯示識別結(jié)果。以數(shù)字6為例,打開手寫數(shù)字6的圖像,并進(jìn)行圖像分類識別,加載網(wǎng)絡(luò)模型參數(shù)的GUI界面程序可以正確識別出圖像中的數(shù)字是6,結(jié)果如圖7所示:
自制多張手寫數(shù)字圖像,包括黑色背景白色字體樣式圖像和白色背景黑色字體兩種類型圖像,實(shí)例化CNN-Six網(wǎng)絡(luò)模型加載訓(xùn)練好的參數(shù)進(jìn)行識別圖像,實(shí)驗(yàn)證明,CNN-Six網(wǎng)絡(luò)模型可以正確地識別出圖像中的手寫數(shù)字。選取部分自制0~9這10個(gè)類別圖像黑色背景白色字體樣式和白色背景黑色字體樣式如圖8所示,對應(yīng)的識別結(jié)果如表3所示。
從表3可以看出,系統(tǒng)識別的手寫數(shù)字圖像大多都識別成功了,但是在測試的20張圖像中仍有一張手寫數(shù)字圖像識別錯(cuò)誤,數(shù)字“2”被識別成了數(shù)字“3”,正確率為95%,實(shí)現(xiàn)了較理想的識別效果。
5 結(jié)束語
本文利用卷積神經(jīng)網(wǎng)絡(luò)在圖像分類中的優(yōu)勢對MNIST數(shù)據(jù)集采用了自制的卷積神經(jīng)網(wǎng)絡(luò)模型CNN-Six進(jìn)行手寫數(shù)字識別,可以實(shí)現(xiàn)正確地識別黑色背景白色字體以及白色背景黑色字體2種類型的數(shù)字圖像,識別正確率達(dá)到預(yù)期,可以應(yīng)用于快遞編碼識別、簡歷電話號碼識別、電腦自動判卷等領(lǐng)域。
參考文獻(xiàn):
[1] 楊之杰,林雪剛,阮杰.基于CNN網(wǎng)絡(luò)的手寫體數(shù)字識別系統(tǒng)的實(shí)現(xiàn)[J].智能計(jì)算機(jī)與應(yīng)用,2023,13(4):158-162.
[2] YOVAN FELIX A,SHRIRAM S,MOHAN KUMAR D.The classification and segmentation of plant disease using convolutional neural network (CNN)[C]//DASH SS,PANIGRAHI BK,DAS S.Sixth International Conference on Intelligent Computing and Applications.Singapore:Springer,2021:475-482.
[3] 唐鑒波,李維軍,趙波,等.基于卷積神經(jīng)網(wǎng)絡(luò)的手寫數(shù)字識別方法研究[J].電子設(shè)計(jì)工程,2022,30(21):189-193.
[4] 祝永志,張彩廷.基于TensorFlow深度學(xué)習(xí)的Minist手寫數(shù)字識別技術(shù)[J].通信技術(shù),2020,53(1):46-51.
[5] 桑曉丹,郭銳.基于PyQt5的數(shù)字圖像處理實(shí)驗(yàn)平臺設(shè)計(jì)[J].電子技術(shù)與軟件工程,2021(18):129-130.
[6] 盧玲,漆為民.基于PyQt5的求解線性方程組軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].江漢大學(xué)學(xué)報(bào)(自然科學(xué)版),2023,51(1):18-27.
【通聯(lián)編輯:唐一東】