馮超
摘 要 手寫體數(shù)字識(shí)別系統(tǒng)具有廣泛的應(yīng)用場(chǎng)景。文章描述了一種把稀疏自編碼器無監(jiān)督學(xué)習(xí)得到的權(quán)值矩陣應(yīng)用于卷積神經(jīng)網(wǎng)絡(luò),利用提取的特征訓(xùn)練分類器,并將權(quán)值系數(shù)矩陣寫入ARM Cortex-M4,實(shí)現(xiàn)了手寫體數(shù)字實(shí)時(shí)識(shí)別系統(tǒng)的教學(xué)實(shí)驗(yàn)案例。
關(guān)鍵詞 手寫體數(shù)字識(shí)別 卷積神經(jīng)網(wǎng)絡(luò) 稀疏自編碼器 Cortex-M4
中圖分類號(hào):TP389.1?????????????????????????????????文獻(xiàn)標(biāo)識(shí)碼:A??DOI:10.16400/j.cnki.kjdk.2021.12.010
Abstract Handwritten numeral recognition system has a wide range of application scenarios. This paper describes a method of applying the weight matrix obtained from unsupervised learning of sparse self encoder to convolutional neural network, and using the extracted features to train the classifier,And the weight coefficient matrix is written into arm cortex-m4 to realize the teaching experiment case of handwritten numeral real-time recognition system.
Keywords handwritten numeral recognition; convolutional neural network; sparse autoencoder; Cortex-M4
0 引言
深度學(xué)習(xí)在計(jì)算機(jī)視覺、自然語言處理等領(lǐng)域廣泛應(yīng)用。在應(yīng)用過程中,通常需要復(fù)雜的數(shù)據(jù)預(yù)處理,包括人工提取特征。對(duì)于圖像處理,提取的特征具有明顯的含義。本文采用不直接訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò),而是通過稀疏自編碼器無監(jiān)督學(xué)習(xí)得到的權(quán)值矩陣作為稀疏自編碼器的卷積濾波器得方法,從而間接確定卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)。本文介紹的小型嵌入式系統(tǒng)由兩個(gè)部分組成,一個(gè)部分是開發(fā)板模塊,另一部分是攝像頭模塊。開發(fā)板模塊使用的是德州儀器Tiva C系列TM4C1294的開發(fā)板。其中,MCU的內(nèi)核是ARM Cortex-M4 CPU,具有1MB閃存、256KB SRAM,頻率可達(dá)120MHz。
1 識(shí)別系統(tǒng)的構(gòu)成及其工作原理
1.1 CCD攝像頭
攝像頭模塊包含三個(gè)部分、攝像頭、電池、信號(hào)采集和二值化電路。攝像頭采用SONY CCD,感光面積4.8mm?.6mm,信號(hào)制式為PAL制,水平清晰度420線,工作電壓為12V。采集和二值化電路用于把攝像頭輸出的信號(hào)轉(zhuǎn)化為二值化的信號(hào),方便使用GPIO口采集。
攝像頭的輸出經(jīng)過二值化處理,通過單片機(jī)的GPIO口可直接讀取。
圖像的傳輸通過行信號(hào)和場(chǎng)信號(hào)進(jìn)行。場(chǎng)信號(hào)代表一副圖像傳輸?shù)拈_始, 行信號(hào)代表每一行像素傳輸?shù)拈_始。行信號(hào)和場(chǎng)信號(hào)到達(dá)時(shí),模塊會(huì)輸出一個(gè)脈沖,可用上升沿或下降沿的外部中斷來捕捉,并進(jìn)行圖像的采集。
1.2 Tiva采集攝像頭數(shù)據(jù)工作原理
圖像采集時(shí)當(dāng)每一個(gè)場(chǎng)信號(hào)到達(dá)之后,會(huì)有一小段時(shí)間攝像頭的輸出不包含圖像信息(全為高電平或全為低電平),即場(chǎng)消隱區(qū)。每一個(gè)行信號(hào)到達(dá)之后,會(huì)有一小段時(shí)間攝像頭的輸出不包含圖像信息,即行消隱區(qū)。圖像采集通常有兩種方法:a、使用for循環(huán)延時(shí)采集;b、使用場(chǎng)中斷和行中斷的DMA傳輸。
具體實(shí)現(xiàn)步驟:等待場(chǎng)中斷信號(hào)到達(dá);場(chǎng)中斷信號(hào)到達(dá)后,把當(dāng)前行數(shù)置為0,開啟行中斷;每一次行中斷信號(hào)到達(dá),利用for循環(huán),通過GPIO口采集,當(dāng)前行數(shù)增加;圖像采集完成后,關(guān)閉行中斷,等待場(chǎng)中斷信號(hào)等。
本實(shí)驗(yàn)案例采用的LCD觸摸屏型號(hào)是EB-LM4F120-L35,包含3.5英寸QVGA TFT液晶屏。顯示驅(qū)動(dòng)芯片SSD2119。該模塊通過2個(gè)20 pin接插件同開發(fā)板連接。Tiva MCU支持Grlib圖形庫,通過這套完整得圖形顯示方案,可以快捷開發(fā)常見的、基于消息的控件(Widget)來實(shí)現(xiàn)圖形、文字繪制。該圖形庫主要分為三部分,分別是:a、控件層(Widget),用于繪制顯示屏上的用戶界面元素,響應(yīng)用戶與元素的交互;b、基本圖形層(Graphics Primitives Layer),用于繪制如線條、圓形、文字等;c、顯示驅(qū)動(dòng)層(Display Driver Layer),該層主要跟硬件相關(guān),提供了同物理硬件通信的基本功能。
應(yīng)用程序可以在這三個(gè)層中的任何一層調(diào)用API,可以使用widgets,也可以直接使用基本圖形。顯示驅(qū)動(dòng)層實(shí)現(xiàn)了Grlib與LCD屏傳輸數(shù)據(jù),比如背光控制和對(duì)比度控制等。顯示驅(qū)動(dòng)程序由tDisplay結(jié)構(gòu)體來描述。在存儲(chǔ)單元中開辟一個(gè)緩沖區(qū),然后將該結(jié)構(gòu)體原型復(fù)制到該緩沖區(qū)中,當(dāng)所有繪圖操作完成后,將結(jié)果顯示在屏幕上。其中顯示緩沖區(qū)的每個(gè)字節(jié)有兩個(gè)像素,寫單個(gè)像素需要讀寫該緩沖區(qū)內(nèi)存各一次。而Flush()函數(shù)用于將本地顯示緩沖區(qū)數(shù)據(jù)復(fù)制到LCD屏上顯示。
Widget用于LCD屏上的圖形元素的渲染以及響應(yīng)用戶的輸入。每個(gè)Widget對(duì)應(yīng)一個(gè)消息處理程序,響應(yīng)一組通用消息。例如,WIDGET_MSG_PAINT消息被發(fā)送,以請(qǐng)求Widget在屏幕上開啟繪圖。Widget以樹形結(jié)構(gòu)組織。樹結(jié)構(gòu)允許以受控的方式進(jìn)行消息傳遞。每條消息都會(huì)根據(jù)消息的語義,以自上而下或自下而上的順序創(chuàng)建。Widget可以在運(yùn)行時(shí)通過調(diào)用函數(shù)來創(chuàng)建,也可以在編譯時(shí)通過使用全局結(jié)構(gòu)來創(chuàng)建。
在實(shí)驗(yàn)代碼工程中添加Tivaware驅(qū)動(dòng)庫和圖形庫,分別在driverlib和grlib下。tDisplay結(jié)構(gòu)體重命名為 “SSD2119”并添加Kentec320x240x16_ssd2119_8bit.c到工程中,將Kentec320x240x16_SSD2119Init函數(shù)放在系統(tǒng)時(shí)鐘配置后,用于初始化顯示驅(qū)動(dòng)。
GrContextInit(&sContext, &g_sKentec320x240x16_SSD2119)完成初始化。sRect.i16XMin、sRect.i16YMin、sRect.i16XMax和sRect.i16YMax分別定義數(shù)字顯示范圍。GrContextForegroundSet函數(shù)設(shè)置在指定的繪圖上下文中用于繪圖的顏色。實(shí)現(xiàn)準(zhǔn)備好數(shù)字0到9的圖片文件,以頭文件形式包含在工程中,當(dāng)攝像頭識(shí)別出是哪個(gè)數(shù)字,就在LCD屏上顯示該數(shù)字對(duì)應(yīng)的圖片,主要用到的函數(shù)有:GrContextForegroundSet;GrRectFill;GrStringDrawCentered。
2 識(shí)別系統(tǒng)關(guān)鍵算法
2.1 自編碼器
自動(dòng)編碼器是前饋神經(jīng)網(wǎng)絡(luò)的一種特殊類型,其中輸入與輸出相同。將輸入壓縮成一個(gè)較低維度的代碼,然后從這個(gè)代碼中重建輸出。該代碼是對(duì)輸入的壓縮。一個(gè)自編碼器通常由三個(gè)部分組成:編碼器、編碼和解碼器。編碼器對(duì)輸入進(jìn)行壓縮并產(chǎn)生編碼,解碼器通過編碼對(duì)輸入進(jìn)行重建。構(gòu)造自編碼器時(shí)需要定義編碼方法,解碼方法,以及將輸出與目標(biāo)進(jìn)行比較的損失函數(shù)。自編碼器主要是一種降維(或壓縮)算法。自編碼器只能夠有效地壓縮與它們所訓(xùn)練數(shù)據(jù)相似的數(shù)據(jù)。由于自編碼器學(xué)習(xí)的是給定訓(xùn)練數(shù)據(jù)的特定的特征,因此它們與其他標(biāo)準(zhǔn)數(shù)據(jù)壓縮算法不同。同時(shí),算法有損的壓縮。自編碼器的輸出不會(huì)和輸入的完全一樣,得到的是一個(gè)接近的,但性能會(huì)有劣化的數(shù)據(jù)表示。最后,自編碼器是無監(jiān)督的。訓(xùn)練一個(gè)自編碼器,將原始輸入數(shù)據(jù)輸入即可。所以自編碼器是一種無監(jiān)督的學(xué)習(xí)技術(shù),因?yàn)樗鼈儾恍枰_定的標(biāo)簽來進(jìn)行訓(xùn)練。自編碼器從訓(xùn)練數(shù)據(jù)中生成所需要的標(biāo)簽,從這個(gè)角度講,是自監(jiān)督的學(xué)習(xí)方式。
2.2 卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network 簡(jiǎn)稱 CNN)是一種廣泛應(yīng)用于語音識(shí)別、 圖像識(shí)別、自然語言處理等領(lǐng)域的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。CNN和傳統(tǒng)神經(jīng)網(wǎng)絡(luò)相比有權(quán)值數(shù)量少、網(wǎng)絡(luò)結(jié)構(gòu)對(duì)平移和比例縮放等變形有高度不變形等特點(diǎn)。CNN網(wǎng)絡(luò)結(jié)構(gòu)輸入數(shù)據(jù)經(jīng)卷積濾波得到C1層,再通過降采樣得到S1層,依此類推,這一過程起到特征提取的作用。網(wǎng)絡(luò)的最后一層是把提取到的特征作為另一個(gè)神經(jīng)網(wǎng)絡(luò)的輸入,用于分類、回歸等任務(wù)。
卷積操作的目的是提取特征。卷積濾波器在原始圖像上按照特定步長(zhǎng)遍歷進(jìn)行卷積操作,得到的結(jié)果稱為特征圖(Feature Map)。
降采樣又稱為池化(Pooling),目的是降維,本質(zhì)上是使用特殊的卷積濾波器對(duì)圖像進(jìn)行卷積操作,卷積的步長(zhǎng)和卷積濾波器的邊長(zhǎng)相等,即保證卷積過程中不出現(xiàn)重疊(同一個(gè)像素點(diǎn)只被卷積一次)。通過使用不同的卷積濾波器,可以進(jìn)行不同類型的降采樣,比如取均值、取最大值等。降采樣通過降低特征圖的分辨率來增加特征提取過程中對(duì)特征的平移、縮放等變化的容忍能力。
傳統(tǒng)神經(jīng)網(wǎng)絡(luò)中,各層間的節(jié)點(diǎn)是全連接的,對(duì)于大型圖像來說,由于權(quán)值過多導(dǎo)致網(wǎng)絡(luò)難以訓(xùn)練。而卷積神經(jīng)網(wǎng)絡(luò)通過局部連接和權(quán)值共享,大大降低了整個(gè)網(wǎng)絡(luò)的權(quán)值個(gè)數(shù)。
卷積神經(jīng)網(wǎng)絡(luò)在進(jìn)行卷積時(shí),輸入層和隱層部分連接,每個(gè)節(jié)點(diǎn)對(duì)應(yīng)圖像的一個(gè)小區(qū)域,稱為局部感受域,而權(quán)值共享的含義是,對(duì)同一個(gè)卷積濾波器,所有局部感受域的權(quán)值是相同的。若圖像大小為200?00,隱層神經(jīng)元個(gè)數(shù)為400個(gè),那么全連接的傳統(tǒng)神經(jīng)網(wǎng)絡(luò)將會(huì)得到1600萬個(gè)連接權(quán)值。對(duì)于卷積神經(jīng)網(wǎng)絡(luò),假設(shè)每個(gè)神經(jīng)元對(duì)應(yīng)原始圖像上10乘10的小區(qū)域,即每個(gè)神經(jīng)元和輸入層的連接權(quán)值有100個(gè)。每個(gè)神經(jīng)元和局部感受域連接的神經(jīng)元權(quán)值是共享的,所以總權(quán)值個(gè)數(shù)為100。
2.3 手寫體數(shù)字圖像識(shí)別
實(shí)驗(yàn)案例使用的數(shù)據(jù)是常用的MNIST數(shù)據(jù)集,訓(xùn)練集數(shù)據(jù)包含了60000張20?0的手寫體數(shù)字圖片及對(duì)應(yīng)的標(biāo)簽,測(cè)試集數(shù)據(jù)包含了10000個(gè)20?0的手寫體數(shù)字圖片和對(duì)應(yīng)的標(biāo)簽。讀取圖片數(shù)據(jù)后,把原始圖像進(jìn)行擴(kuò)展,得到20?0的新圖像,原始圖像在新圖像中的位置隨機(jī)選取。
實(shí)驗(yàn)案例步驟如下:
a.選取卷積濾波器對(duì)輸入圖像進(jìn)行卷積操作,得到FeatureMap1,共使用25個(gè)卷積濾波器,所以FeatureMap1包含了25個(gè)特征圖
b. 對(duì)FeatureMap1 進(jìn)行降采樣,即FeatureMap2
c. 把Feature Map2展開為神經(jīng)網(wǎng)絡(luò)輸入
d. 正向傳導(dǎo),作出預(yù)測(cè)
選取良好的特征提取能力的卷積濾波器對(duì)于卷積神經(jīng)網(wǎng)絡(luò)的特征提取至關(guān)重要,稀疏自編碼器對(duì)小塊圖像進(jìn)行無監(jiān)督學(xué)習(xí)得到的特征是圖像的邊緣,所以認(rèn)為把稀疏自編碼器訓(xùn)練結(jié)果作為卷積濾波器,對(duì)圖像的邊緣特征有提取的作用。
分類器中需要訓(xùn)練的參數(shù)是神經(jīng)網(wǎng)絡(luò)的輸入和輸出之間的連接權(quán)值,采用Softmax分類,對(duì)數(shù)字0到4進(jìn)行分類,數(shù)字5到9用于稀疏自編碼器的訓(xùn)練。
2.3.1 稀疏自編碼器的訓(xùn)練
首先對(duì)參數(shù)進(jìn)行了初始化,指定了學(xué)習(xí)率和batch大小為32。下載數(shù)據(jù)集并對(duì)圖像數(shù)據(jù)進(jìn)行變換。get_device() 函數(shù)可以在自編碼器神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練過程中選擇使用CUDA GPU設(shè)備或CPU進(jìn)行計(jì)算。將圖像調(diào)整尺寸為28x28x1并保存。訓(xùn)練包含稀疏度懲罰的自編碼器神經(jīng)網(wǎng)絡(luò),首先,自編碼器網(wǎng)絡(luò)的編碼器部分包含五個(gè)編碼器層,每個(gè)MNIST圖像784個(gè)像素,32個(gè)in_features和16個(gè)out_features。不斷增加神經(jīng)元的數(shù)量。最終達(dá)到784個(gè)out_features。使用forward()函數(shù)實(shí)現(xiàn)自編碼器神經(jīng)網(wǎng)絡(luò)的真正編碼和解碼功能。當(dāng)編碼和解碼發(fā)生時(shí),所有的編碼器和解碼器神經(jīng)網(wǎng)絡(luò)層都會(huì)經(jīng)過ReLU激活函數(shù)。接下來,初始化SparseAutoencoder()模塊并將其加載到計(jì)算設(shè)備上。對(duì)于損失函數(shù),案例使用MSELoss,優(yōu)化器是Adam,學(xué)習(xí)率設(shè)置為0.001。在模型參數(shù)通過ReLU激活函數(shù)后,稀疏度才會(huì)被計(jì)算出來。通過定義一個(gè)sparse_loss()函數(shù),將自動(dòng)編碼器模型和圖像作為輸入?yún)?shù)。然后計(jì)算圖像通過模型參數(shù)和ReLU激活函數(shù)后的稀疏度損失。接下去分別調(diào)用fit()和validate()。fit()函數(shù)需要三個(gè)參數(shù),即自編碼器模型、數(shù)據(jù)加載器和當(dāng)前的epoch數(shù)。running_loss則計(jì)算每個(gè)batch的loss。通過調(diào)用sparse_loss函數(shù),計(jì)算最終的稀疏度約束。每5個(gè)epochs保存訓(xùn)練好的重建圖像。最后返回epoch_loss值。訓(xùn)練的模型以頭文件形式包含在Tiva單片機(jī)的工程中實(shí)現(xiàn)部署,最終部署實(shí)驗(yàn)結(jié)果如圖1。
3 結(jié)論
文章介紹了用低成本MCU開發(fā)神經(jīng)網(wǎng)絡(luò)的實(shí)驗(yàn)案例。以往神經(jīng)網(wǎng)絡(luò)在終端邊緣側(cè)運(yùn)行,對(duì)硬件通常有一定性能要求,但是隨著傳統(tǒng)單片機(jī)的硬件性能的逐步提升,乘累加單元即相關(guān)指令一定程度上可以用于神經(jīng)元計(jì)算,因此單片機(jī)的專用乘加指令跟神經(jīng)元具有一定契合性。利用低成本MCU進(jìn)行AI教學(xué),闡述神經(jīng)網(wǎng)絡(luò)的基本原理是有一定意義的。該實(shí)驗(yàn)案例對(duì)傳統(tǒng)的MCU教學(xué)是一個(gè)有益補(bǔ)充,PC完成模型訓(xùn)練,MCU實(shí)現(xiàn)模型部署,軟硬結(jié)合的方式,從而實(shí)現(xiàn)從訓(xùn)練到部署完整的AI流程,對(duì)教學(xué)有著借鑒意義。
基金項(xiàng)目:教育部高等教育司2019年第一批產(chǎn)學(xué)合作協(xié)同育人項(xiàng)目(項(xiàng)目編號(hào): 201901115005));2019年福建省本科高校一般教育教學(xué)改革研究項(xiàng)目(項(xiàng)目編號(hào):FBJG20190191)
參考文獻(xiàn)
[1] 楊迪,黃盼盼,夏志勇,沈森.基于ARM手寫數(shù)字識(shí)別系統(tǒng)[J].山西電子技術(shù),2018(5):22-24.
[2] 劉文杰,吳剛.基于ARM9的手寫體數(shù)字識(shí)別技術(shù)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)與數(shù)字工程,2013,41(9):1498-1450.
[3] Luca B.Saldanha,Christophe Bobda.An embedded system for handwritten digit recognition[J].Journal of Systems Architecture,v61,n10,p693-699,November 1,2015.
[4] 涂樸,黃晨.基于Tensorflow深度學(xué)習(xí)框架的手寫體數(shù)字識(shí)別模型優(yōu)化及應(yīng)用[J].自動(dòng)化技術(shù)與應(yīng)用,2020,39(12).