前文中,我們介紹了一些傳統(tǒng)計(jì)算機(jī)視覺的算法,包括降噪濾波、二值化、縮放、銳化等,最終我們在FPGA上實(shí)現(xiàn)了實(shí)時(shí)的運(yùn)動(dòng)目標(biāo)跟蹤算法。近些年基于神經(jīng)網(wǎng)絡(luò)的機(jī)器學(xué)習(xí)已經(jīng)成熟應(yīng)用于很多商業(yè)、工業(yè)領(lǐng)域,包括自動(dòng)駕駛、自動(dòng)生產(chǎn),智能醫(yī)療等。
那么,作為一本圖像處理的入門教材,除了介紹一些傳統(tǒng)入門的計(jì)算機(jī)視覺算法與對應(yīng)的硬件實(shí)現(xiàn),我們也希望引入最近很流行的神經(jīng)網(wǎng)絡(luò)相關(guān)的介紹。本章我們將簡單介紹卷積神經(jīng)網(wǎng)絡(luò)和基于LeNet5實(shí)現(xiàn)的手寫字符識別,并且在FPGA上實(shí)現(xiàn)實(shí)時(shí)識別的Demo。
一、神經(jīng)網(wǎng)絡(luò)的介紹
1.1人工神經(jīng)網(wǎng)絡(luò)
人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks,簡稱ANN),是受生物神經(jīng)網(wǎng)絡(luò)所啟發(fā)而構(gòu)建的數(shù)學(xué)模型,去模擬神經(jīng)元的動(dòng)作和神經(jīng)元之間的聯(lián)結(jié)[1]。一個(gè)簡單的人工神經(jīng)網(wǎng)絡(luò)的計(jì)算模型如圖1所示。通常一個(gè)人工神經(jīng)網(wǎng)絡(luò)包含一個(gè)輸入層,不少于一個(gè)的隱藏層和一個(gè)輸出層。輸入層是由一系列的神經(jīng)元來接受不同的輸入;隱藏層是介于輸入層和輸出層之間的由一層或者多層神經(jīng)元和連接組成的。通常隱藏層的數(shù)量決定了人工神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)和泛化能力。輸出層是輸入經(jīng)由整個(gè)神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)和分析得到的高層語義結(jié)果,比如目標(biāo)類型等。
圖1(a)所示的人工神經(jīng)網(wǎng)絡(luò)也稱為感知機(jī)(Perception),含有多層隱藏層的人工神經(jīng)網(wǎng)絡(luò)為多層感知機(jī)(Multi-layer perception)。
圖 1 一個(gè)簡單人工神經(jīng)網(wǎng)絡(luò)的圖表展示(a)展示了一個(gè)有8個(gè)輸入神經(jīng)元,一個(gè)隱藏層和一個(gè)輸出神經(jīng)元的人工神經(jīng)網(wǎng)絡(luò),(b)展示了在隱藏層中的一個(gè)神經(jīng)元的數(shù)學(xué)模型,包含累積和激活函數(shù)。
如圖1(b)所示,隱藏層對所有的輸入做加權(quán)累積,權(quán)重wi反映了不同神經(jīng)元之間連接的強(qiáng)弱程度,而偏置bi反映了神經(jīng)元被激活的難易程度。人工神經(jīng)網(wǎng)絡(luò)中的激活函數(shù)模擬了生物神經(jīng)網(wǎng)絡(luò)中神經(jīng)元的調(diào)節(jié)器,用來控制神經(jīng)元的興奮和靜息狀態(tài)。單個(gè)神經(jīng)元的數(shù)學(xué)模型hn如下所示:
該公式中,xi是第n個(gè)神經(jīng)元的輸入,wni是第i個(gè)輸入xi對應(yīng)連接的權(quán)重,bn 是第n個(gè)的神經(jīng)元的偏置,φ( )是激活函數(shù),如圖1(b)所示,這里用線性整流函數(shù)(Rectified Linear Unit)作為激活函數(shù)。
1.2卷積神經(jīng)網(wǎng)絡(luò)
卷積層是由一系列并行的卷積核(Kernel)組成,通過對輸入圖像以一定的步長(Stride)進(jìn)行滑動(dòng)卷積計(jì)算,產(chǎn)生對應(yīng)的特征圖(Feature map),供下一層計(jì)算使用。卷積核通常是二維,也有單個(gè)點(diǎn),一維或者三維的。一個(gè)典型的卷積核計(jì)算公式如下所示:
該公式中,Ix,y是第k個(gè)卷積核的輸入,wi,j,k是第k個(gè)輸入xx,y對應(yīng)連接的權(quán)重,bk 是第k個(gè)卷積核的偏置,x, y分別是輸入圖像像素點(diǎn)水平和豎直方向上的位置。i,j分別是權(quán)重在水平和豎直方向上的索引(Indices)。
池化層是一個(gè)在卷積神經(jīng)網(wǎng)絡(luò)中常見的操作層,主要有兩個(gè)作用,一是用來降低維度和計(jì)算量。一般卷積計(jì)算(步長為1)并不減少維度,而池化層主要是對一定的區(qū)域求取最大值或者取均值,這樣的操作分別為最大池化(Max pooling)和平均池化(Average pooling),如圖2所示,為一個(gè)示例展示了平均池化和最大池化分別作用于2×2的區(qū)域以2的步長滑動(dòng)。左邊的平均池化是對2 x 2的塊內(nèi)計(jì)算平均值,右邊的最大池化是對2 x 2的塊內(nèi)尋找最大值。
圖 2 2×2平均池化與最大值池化
池化層的另一個(gè)作用是盡可能多的保存最有效信息。因?yàn)榻?jīng)過卷積計(jì)算,圖像中的物體特征可以被精確地提取出來,但是并非所有的特征都是有效的,池化操作可以保留最有效的信息,同時(shí)降低了卷積神經(jīng)網(wǎng)絡(luò)對精確特征的敏感度。
批正則化是由Google在2015年提出的[4],目的是為了加速模型收斂,解決內(nèi)部協(xié)變量平移(Internal covariate shift)以及對模型引入正則化。在訓(xùn)練CNN的過程中,由于數(shù)據(jù)集太大,我們通常只會將一部分?jǐn)?shù)據(jù)(mini-batch)放到CPU或者GPU上。批正則化就是對mini-batch的數(shù)據(jù)都做正則化,轉(zhuǎn)換到均值為0,標(biāo)準(zhǔn)差為1的正態(tài)分布。批正則化的具體公式見圖3。批正則化的核心思想就是將數(shù)據(jù)分布變得比較均勻,這樣可以穩(wěn)定梯度,而且讓每一層的學(xué)習(xí)率變化沒那么大。CNN的每一層的均值和標(biāo)準(zhǔn)差都是不一樣的,這樣可以等效為引入一定的噪聲,增加了CNN的正則化效果。
圖 3 批正則化的具體算法[4]
在人工神經(jīng)網(wǎng)絡(luò)中提到的激活函數(shù),是作為一個(gè)部件來決定在神經(jīng)元內(nèi)的信息通路。從生物學(xué)上來說,神經(jīng)元之間通常由電化學(xué)來進(jìn)行信息傳遞的。一般神經(jīng)元會接收到不同來源的電勢,如果一個(gè)神經(jīng)元達(dá)到了興奮電勢,這個(gè)神經(jīng)元將會產(chǎn)生動(dòng)作電位,把信息通過神經(jīng)傳遞物質(zhì)或者電勢傳遞給其相鄰的神經(jīng)元。反之,如果一個(gè)神經(jīng)元沒有達(dá)到興奮電勢,那么它將不能激活也不能傳遞信息。許多種數(shù)學(xué)模型用來模擬這個(gè)生物特征。S型函數(shù)(Sigmoid function)是一個(gè)比較常見的激活函數(shù),在人工神經(jīng)網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)中使用的比較多,其公式如下:
該公式中,x是激活函數(shù)的輸入。f(·) 是S型函數(shù),將輸出限制在0到1之間(0,1)。S型函數(shù)通常用在卷積神經(jīng)網(wǎng)絡(luò)的輸出層,但是該函數(shù)在卷積神經(jīng)網(wǎng)絡(luò)優(yōu)化過程中,有兩個(gè)問題。第一個(gè)是當(dāng)S型函數(shù)的輸入趨于無窮大時(shí),在反向傳播過程中,梯度會趨近于0,產(chǎn)生了梯度彌散問題,導(dǎo)致卷積神經(jīng)網(wǎng)絡(luò)無法正常收斂。第二個(gè)問題是S型函數(shù)中的指數(shù)和除法運(yùn)算都會消耗比較多的硬件計(jì)算資源。前文提到的線性整流函數(shù)(ReLU)也是一個(gè)在卷積神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)。該函數(shù)實(shí)現(xiàn)簡單,同時(shí)又能避免S型函數(shù)在反向傳播中容易出現(xiàn)梯度消失的問題。它的導(dǎo)數(shù)是0或者1,不會消耗較多的計(jì)算資源同時(shí)也很容易收斂。其公式如下:
在神經(jīng)網(wǎng)絡(luò)發(fā)展的幾十年內(nèi),有非常多的理論和應(yīng)用涌現(xiàn)。本文受限于篇幅,只介紹了基本概念和基礎(chǔ)知識。本文只介紹了標(biāo)準(zhǔn)卷積和常用的激活函數(shù),還有很多其他的卷積類型,比如深度卷積(Depthwise convolution),分組卷積(Group convolution),空洞卷積(Dilated convolution),可變性卷積(Deformable convolution)等。激活函數(shù)除了S型函數(shù)和線性整流函數(shù),還有tanh函數(shù),Leaky ReLU函數(shù),Swish函數(shù)等。接下來,筆者會介紹一個(gè)基礎(chǔ)且經(jīng)典的卷積神經(jīng)網(wǎng)絡(luò)LeNet5,在手寫字符識別中的具體應(yīng)用以及軟硬件實(shí)現(xiàn)。
二、基于LeNet5 CNN的Matlab的實(shí)現(xiàn)
2.1 LeNet5 CNN簡介
LeNet5卷積神經(jīng)網(wǎng)絡(luò)最早出現(xiàn)在由Yann LeCun等人于1998年發(fā)表在Proceedings of The IEEE學(xué)術(shù)期刊上的“Graident-based Learning Applied to Document Recognition”這篇文章里[5],用于做手寫數(shù)字識別(Handwritten digit recognition)。LeNet5卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)非常簡單,如圖4所示,其中圖中的灰色方塊代表了一個(gè)特征圖。
圖 4 LeNet5卷積神經(jīng)網(wǎng)絡(luò)的架構(gòu)[5]
LeNet5卷積神經(jīng)網(wǎng)絡(luò)有3個(gè)卷積層(C1,C3,C5),2個(gè)池化層(S2,S4)和2個(gè)全連接層(F6和OUTPUT)。LeNet5卷積神經(jīng)網(wǎng)絡(luò)的輸入是分辨率為32×32的灰度圖,所以通道(Channel)數(shù)是1。第一層卷積層是由5×5×6的卷積核組成,與輸入層進(jìn)行卷積操作,我們得到28×28×6的特征圖,即圖4中的C1。經(jīng)過2×2的平均池化,我們得到14×14×6的特征圖,即圖4中的S2。然后對S2的特征圖進(jìn)行5×5×16的卷積計(jì)算,我們得到10×10×16的特征圖,即圖4中的C3。后面繼續(xù)進(jìn)行池化操作,我們得到5×5×16的特征圖,即圖4中的S4。最后一層卷積層有5×5×120個(gè)卷積核。經(jīng)卷積計(jì)算,我們得到1×1×120的特征圖,即圖4中的C5。經(jīng)過兩個(gè)全連接層,我們最終得到1×1×10的輸出,分別對應(yīng)0-9每個(gè)數(shù)字的置信度。LeNet5卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)如表1所示。LeNet5卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)量大約為60,000左右。
表 1 LeNet5卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)
層 |
通道數(shù) |
濾波器大小 |
步長 |
特征圖大小 |
參數(shù)量 |
輸入層 |
1 |
32×32×1 |
|||
卷積層1 |
6 |
5×5 |
1 |
28×28×6 |
5×5×6 + 6 |
池化層1 |
2×2 |
2 |
14×14×6 |
||
卷積層2 |
16 |
5×5 |
1 |
10×10×16 |
5×5×6×16 + 16 |
池化層2 |
2×2 |
2 |
5×5×16 |
||
卷積層3 |
120 |
5×5 |
1 |
1×1×120 |
5×5×16×120 + 120 |
全連接層1 |
84 |
1×1 |
1×1×84 |
1×1×120×84 + 84 |
|
全連接層2 |
10 |
1×1 |
1×1×10 |
1×1×84×10 + 10 |
2.2LeNet5 CNN的Matlab實(shí)現(xiàn)
首先我們需要準(zhǔn)備MNIST的手寫數(shù)字?jǐn)?shù)據(jù)集,從[6]上下載。該數(shù)據(jù)集中有60,000個(gè)訓(xùn)練數(shù)據(jù)和對應(yīng)的標(biāo)簽(Label),還有10,000個(gè)測試數(shù)據(jù)和對應(yīng)的標(biāo)簽。數(shù)據(jù)集圖片和標(biāo)簽的讀入格式如下圖5,6所示。數(shù)據(jù)集圖片的像素是按照逐行排列的,像素點(diǎn)值是0-255,0代表白色,255代表黑色,標(biāo)簽是0-9。
圖 5數(shù)據(jù)集圖片讀入格式[6]
圖 6 標(biāo)簽讀入格式[6]
在Matlab中,我們將編寫讀MNIST數(shù)據(jù)集的函數(shù)來準(zhǔn)備好訓(xùn)練集和測試集圖片及對應(yīng)的標(biāo)簽。具體代碼見loadMNIST.m。
圖 7 a)Matlab中讀入的手寫數(shù)字和b)對應(yīng)的數(shù)值
接下來我們將繼續(xù)構(gòu)建LeNet5卷積神經(jīng)網(wǎng)絡(luò)所需的其他部件,比如卷積層,池化層,激活函數(shù)和全連接層。卷積層的輸入為H×W×C大小的圖像,卷積核為N×Hin×Win×C的一組濾波器,輸出為Hout×Wout×N的圖像,卷積層還有一個(gè)步長參數(shù)stride。具體實(shí)現(xiàn)代碼見Conv2D.m。
對于池化層,沒有實(shí)現(xiàn)論文中的平均池化,我們這里用最大池化來做,平均池化的實(shí)現(xiàn)比較類似,讀者有興趣可以自己實(shí)現(xiàn)。池化層的輸入為H×W×C大小的特征圖,輸出為(H/Stride)×(W/Stride)×C大小的特征圖,只有一個(gè)步長參數(shù)。具體實(shí)現(xiàn)代碼見Maxpool.m。
我們選擇用ReLU作為激活函數(shù),方便硬件實(shí)現(xiàn)。在Matlab中,我們也利用其向量運(yùn)算的特性來快速實(shí)現(xiàn)ReLU函數(shù),具體代碼見ReLU.m。
全連接層就是特殊的卷積層,其卷積核的H和W為1,且輸入的H和W為1。所以這里我們復(fù)用了Conv2D的代碼,不再具體展示了。
現(xiàn)在有非常多好用的平臺進(jìn)行神經(jīng)網(wǎng)絡(luò)的訓(xùn)練和部署,筆者參考了Matlab來訓(xùn)練LeNet5卷積神經(jīng)網(wǎng)絡(luò)的,就不詳述在Matlab上實(shí)現(xiàn)LeNet5卷積神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程了(此部分包含誤差的計(jì)算和反向傳遞,權(quán)值的更新)。有興趣的讀者可以在網(wǎng)上搜索相關(guān)的資料進(jìn)一步理解。這里我們將TensorFlow訓(xùn)練的模型導(dǎo)出,然后在Matlab中讀入,對測試集進(jìn)行推理。如下圖8所示,我們將每一層的結(jié)果展示出來,方便我們理解LeNet5卷積神經(jīng)網(wǎng)絡(luò)的特征提取過程。
圖 8 LeNet5 Matlab實(shí)現(xiàn)中對應(yīng)的每一層特征圖
三、基于LeNet5 CNN的FPGA硬件加速實(shí)現(xiàn)
表 2 LeNet5卷積神經(jīng)網(wǎng)絡(luò)的架構(gòu)和每層所需的內(nèi)存大小
層 |
通道數(shù) |
濾波器大小 |
步長 |
特征圖大小 |
內(nèi)存大小 |
輸入層 |
1 |
32×32×1 |
1024×8 |
||
卷積層1 |
6 |
5×5 |
1 |
28×28×6 |
1024×6×16 |
池化層1 |
2×2 |
2 |
14×14×6 |
256×6×16 |
|
卷積層2 |
16 |
5×5 |
1 |
10×10×16 |
128×6×16 |
池化層2 |
2×2 |
2 |
5×5×16 |
32×16×16 |
|
卷積層3 |
120 |
5×5 |
1 |
1×1×120 |
128×16 |
全連接層1 |
84 |
1×1 |
1×1×84 |
||
全連接層2 |
10 |
1×1 |
1×1×10 |
圖 13 延時(shí)優(yōu)先的LeNet5卷積神經(jīng)網(wǎng)絡(luò)的仿真結(jié)果
四、基于攝像頭的字符識別FPGA Demo的搭建與實(shí)現(xiàn)
效果如下,具體的內(nèi)容,麻煩等書出版吧,謝謝
圖 16 字符識別的FPGA Demo系統(tǒng)實(shí)時(shí)識別,手寫字符由Matlab生成顯示在屏幕上,下面為FPGA Demo的實(shí)時(shí)識別結(jié)果。
原文標(biāo)題:基于LeNet5的深度學(xué)習(xí)FPGA加速實(shí)現(xiàn)
文章出處:【微信公眾號:FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
FPGA
+關(guān)注
關(guān)注
1642文章
21920瀏覽量
612233 -
matlab
+關(guān)注
關(guān)注
187文章
2990瀏覽量
232850 -
卷積神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
4文章
369瀏覽量
12135
原文標(biāo)題:基于LeNet5的深度學(xué)習(xí)FPGA加速實(shí)現(xiàn)
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
FPGA實(shí)現(xiàn)LeNet-5卷積神經(jīng)網(wǎng)絡(luò)
卷積神經(jīng)網(wǎng)絡(luò)如何使用
卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展及應(yīng)用
基于矢量特征編碼的手寫字符識別技術(shù)
【科普】卷積神經(jīng)網(wǎng)絡(luò)(CNN)基礎(chǔ)介紹

卷積神經(jīng)網(wǎng)絡(luò)CNN架構(gòu)分析-LeNet

基于卷積神經(jīng)網(wǎng)絡(luò)CNN的車牌字符識別方法

一種改進(jìn)的仿射傳播聚類的手寫字符識別

評論