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