第一部分 設(shè)計概述 /Design Introduction
1.1設(shè)計目的與應(yīng)用

隨著人工智能的發(fā)展,神經(jīng)網(wǎng)絡(luò)正被逐步應(yīng)用于智能安防、自動駕駛、醫(yī)療等各行各業(yè)。目標識別作為人工智能的一項重要應(yīng)用也擁有著巨大的前景,隨著深度學習的普及和框架的成熟,卷積神經(jīng)網(wǎng)絡(luò)模型的識別精度越來越高。有名的LeNet-5手寫數(shù)字識別網(wǎng)絡(luò),精度達到99%,AlexNet模型和VGG-16模型的提出突破了傳統(tǒng)圖像識別算法,GooLeNet和ResNet推動了卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用。
但是神經(jīng)網(wǎng)絡(luò)的發(fā)展也給我們帶來了更多挑戰(zhàn),權(quán)重參數(shù)越來越多,計算量越來越大導致了復雜的模型很難移植到移動端或嵌入式設(shè)備中,且嵌入式環(huán)境對功耗、實時性、存儲都有著嚴格的約束。因此如何將卷積神經(jīng)網(wǎng)絡(luò)部署到嵌入式設(shè)備中是一件非常有意義的事情。目前神經(jīng)網(wǎng)絡(luò)在傳統(tǒng)嵌入式設(shè)備上絕大部分是基于ARM平臺,神經(jīng)網(wǎng)絡(luò)在ARM上部署時存在的巨大問題是算力的不足。GPU主要應(yīng)用于神經(jīng)網(wǎng)絡(luò)訓練階段,對環(huán)境和庫的依賴性較大,國內(nèi)技術(shù)積累較弱,難以實現(xiàn)技術(shù)自主可控。ASIC 是為特定需求而專門定制優(yōu)化開發(fā)的架構(gòu),靈活性較差,缺乏統(tǒng)一的軟硬件開發(fā)環(huán)境,開發(fā)周期長且造價極高所以基于FPGA的硬件加速平臺是時候發(fā)揮它的優(yōu)勢了,F(xiàn)PGA由于獨特的架構(gòu)被廣泛的應(yīng)用與實時信號處理、圖像處理領(lǐng)域,其并行性也為卷積神經(jīng)網(wǎng)絡(luò)提供了巨大算力。
傳統(tǒng)的RTL開發(fā)FPGA流程相比緩慢,不如軟件的開發(fā)效率高,所以HLS運營而生,使用高層次語言來進行轉(zhuǎn)換為底層的硬件代碼,極大的加快開發(fā)進程。因此項目選用HLS工具來實現(xiàn)算法中的加速IP核,將SSD目標檢測網(wǎng)絡(luò)移植到FPGA硬件平臺上, 對于硬件加速過程中的算法并行性,在本設(shè)計中主要采用兩個方式:對層內(nèi)的運算并行化,將多個通道的數(shù)據(jù)進行分塊,每一塊內(nèi)的通道同時進行運算,最后將結(jié)果累加在一起。對于模塊的運算采用HLS并行優(yōu)化,對數(shù)組核循環(huán)添加優(yōu)化指令進行優(yōu)化。整個系統(tǒng)采用PYNQ的軟件框架來實現(xiàn),為SSD目標檢測算法提供了硬件加速方案,充分發(fā)揮了FPGA的并行性。
1.2 SSD目標檢測算法原理
SSD,Single Shot Multi Box Detector,于2016年提出,是經(jīng)典的單階段目標檢測模型之一。它的精度可以媲美FasterRcnn雙階段目標檢測方法,速度卻達到了59FPS(512x512,TitanV),單階段目標檢測方法的目標檢測和分類是同時完成的,其主要思路是利用CNN提取特征后,均勻地在圖片的不同位置進行密集抽樣,抽樣時可以采用不同尺度和長寬比,物體分類與預測框的回歸同時進行,整個過程只需要一步,所以其優(yōu)勢是速度快。
SSD采用的主干網(wǎng)絡(luò)是VGG網(wǎng)絡(luò),VGG是由Simonyan 和Zisserman在文獻《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷積神經(jīng)網(wǎng)絡(luò)模型,其名稱來源于作者所在的牛津大學視覺幾何組(Visual Geometry Group)的縮寫。該模型參加2014年的 ImageNet圖像分類與定位挑戰(zhàn)賽,取得了優(yōu)異成績:在分類任務(wù)上排名第二,在定位任務(wù)上排名第一。

圖1.VGG16網(wǎng)絡(luò)結(jié)構(gòu)
這里的VGG網(wǎng)絡(luò)相比普通的VGG網(wǎng)絡(luò)有一定的修改,主要修改的地方就是:
1、將VGG16的FC6和FC7層轉(zhuǎn)化為卷積層。
2、去掉所有的Dropout層和FC8層;
3、新增了Conv6、Conv7、Conv8、Conv9。

圖2.SSD主干網(wǎng)絡(luò)結(jié)構(gòu)
上圖展示了SSD的主干網(wǎng)絡(luò)結(jié)構(gòu),整個網(wǎng)絡(luò)為全卷積網(wǎng)絡(luò)結(jié)構(gòu),SSD將VGG16的兩個全連接層轉(zhuǎn)換成了普通的卷積層,池化層POOL5由原來的stride=2,kernel大小2x2變成stride=1,kernel大小3x3,為了不改變特征圖大小同時獲得更大的感受野,Conv6改為空洞卷積,diliation=6,輸入的圖片經(jīng)過了改進的VGG網(wǎng)絡(luò)(Conv1->fc7)和幾個另加的卷積層(Conv6->Conv9)進行特征提取。
從圖2我們可以看出,SSD將conv4_3、conv7、conv6_2、conv7_2、conv8_2、conv9_2都連接到了最后的檢測分類層做回歸,6個特征圖分別預測不同大小和長寬比的邊界框,具體細節(jié)如圖3。

圖3.SSD特征提取網(wǎng)絡(luò)
SSD為每個檢測層都預定義了不同大小的先驗框(prior boxes),Conv4_3、Conv8_2和Conv9_2分別有4個先驗框,而Conv7、conv7_2和Conv8_2分別有6種先驗框,即對應(yīng)于特征圖上的每個像素,都會生成4或6個prior box.
在淺層的神經(jīng)網(wǎng)絡(luò)里,只能看到圖片的細節(jié)和紋理信息,就如管中窺豹。隨著網(wǎng)絡(luò)層數(shù)的加深,相當于把圖片往后移動一段距離。這樣才能夠感知到圖片的整體信息。低層卷積可以捕捉到更多的細節(jié)信息,高層卷積可以捕捉到更多的抽象信息。低層特性更關(guān)心“在哪里”,但分類準確度不高,而高層特性更關(guān)心“是什么”,但丟失了物體的位置信息。SSD正是利用不同尺度檢測圖片中不同大小和類別的目標物體,獲得了很好的效果。
1.3 作品展示




第二部分 系統(tǒng)組成及功能說明 /System Construction & Function Description
2.1 系統(tǒng)功能
實現(xiàn)了SSD目標檢測網(wǎng)絡(luò)在PYNQ平臺上的移植,能夠?qū)崿F(xiàn)人、自行車、汽車、馬、飛機等20類目標的檢測。輸入任意大小圖像,能夠輸出圖像中所含目標,并輸出目標具體位置。
2.2 系統(tǒng)框圖
系統(tǒng)框圖如下所示:包含卷積模塊、池化模塊、L2范數(shù)模塊。CPU控制各個模塊的運行,存取地址,通道數(shù)設(shè)置等參數(shù),完成整個SSD特征提取網(wǎng)絡(luò),并將各個特征層的數(shù)據(jù)存儲在DDR內(nèi)存中,最后CPU對輸出結(jié)果進行softmax運算識別出圖片中存在的目標種類,并根據(jù)輸出計算出框圖所在的位置。池化模塊和L2范數(shù)模塊是通過AXI-Stream數(shù)據(jù)流的形式對輸入數(shù)據(jù)進行處理,卷積模塊以M_AXI端口同時讀取特征數(shù)據(jù)和權(quán)重數(shù)據(jù)。


2.3 模塊劃分
卷積模塊:

為了提高模塊的通用性,對模塊的輸入?yún)?shù)約束為AXI_LITE的端口,方便CPU對模塊進行控制,權(quán)重特征及偏置數(shù)據(jù)連接到3個HP口同時讀取數(shù)據(jù)。具體的參數(shù)如下

設(shè)置并行數(shù)量K=8時,約束最內(nèi)層循環(huán)II=1,最終得到的資源消耗如下表:


當設(shè)置并行數(shù)量K=32時,約束最內(nèi)層循環(huán)II=1,消耗的資源如下表:


考慮到硬件的資源,最終選擇了設(shè)置K=8路并行處理。
池化模塊:



為了實現(xiàn)流水線的操作,第一步先對輸入特征進行橫向的池化,兩個兩個進行比較,留下較大的那個值,第二步再對縱向池化,縱向池化時需要第一行的值進行緩存,再將第二行的值與其比較,可以使用bram來保存中間值。

L2 范數(shù)模塊



根據(jù)范數(shù)計算的公式,第一步需要對每個通道像素值平方后累加,再開根號??梢詫⑦@個計算以流水線的形式對每個通道的像素值進行累加存放到數(shù)組中,這個過程同樣可以對多個通道同時操作,增加并行性,等到所有的通道都計算完成后,將所得到的值存入DDR內(nèi)存地址中,等待下一步使用。
第二步同樣使用流水線的形式取出特征像素和上一步中DDR中存放的數(shù)據(jù),進行除法操作,之后再寫回DDR。這樣就完成了整個L2范數(shù)流水線的計算。下圖分別為K=16和K=32時消耗資源的對比,可以看出當K變大時,消耗的LUT資源變得很大,在項目中由于該模塊只使用了一次,因此只將K取為8。


2.4 設(shè)計優(yōu)化
并行設(shè)計:
為了提高數(shù)據(jù)的傳輸效率和FPGA的并行特性,我們將特征在內(nèi)存中的排布方式變?yōu)橄聢D的方式,其中一個長方體子塊代表一個數(shù)據(jù)子塊,位寬為16*K,K的值可以改變。即每次存取特征數(shù)據(jù)K個通道的像素值,同時存取K個權(quán)重子塊的數(shù)據(jù)進行運算,


量化設(shè)計
因為FPGA并不比擅長對浮點數(shù)進行運算,如果特征和權(quán)重數(shù)據(jù)都使用浮點數(shù)則會導致資源的消耗特別厲害,因此為了解決這個問題,采用定點數(shù)的形式對所有的數(shù)據(jù)進行定點化處理。為了獲取權(quán)重及特征的小數(shù)精度,要對訓練好的權(quán)重數(shù)據(jù)進行統(tǒng)計,對于不同層的權(quán)重使用不同精度的定點數(shù),同時要在前向網(wǎng)絡(luò)時對數(shù)據(jù)集中所有數(shù)據(jù)進行統(tǒng)計,獲取每一層特征數(shù)據(jù)的精度范圍,將這些精度保留作為卷積模塊的輸入?yún)?shù)。在所有模塊中的計算都是直接使用定點數(shù)進行運算。

下圖為提取的部分權(quán)重小數(shù)點精度和偏置小數(shù)點精度,可以發(fā)現(xiàn)大部分小數(shù)點的位數(shù)都很高。所以只需要很少的比特去表示整數(shù)位。



2.5 Python 網(wǎng)絡(luò)搭建
第一步.通過PYNQ調(diào)用卷積和池化單元完成主干特征網(wǎng)絡(luò)的實現(xiàn)
#layer 1
Run_Conv(conv,3,64,3,3,1,1,1,1,0,image,0,vgg1_1w,15,vgg1_1b,14,vgg1_1,5)
Run_Conv(conv,64,64,3,3,1,1,1,1,0,vgg1_1,5,vgg1_2w,15,vgg1_2b,15,vgg1_2,3)
Run_Pool(pool,dma,64,2,2,vgg1_2,vgg1_p)
#layer 2
Run_Conv(conv,64,128,3,3,1,1,1,1,0,vgg1_p,3,vgg2_1w,15,vgg2_1b,15,vgg2_1,2)
Run_Conv(conv,128,128,3,3,1,1,1,1,0,vgg2_1,2,vgg2_2w,15,vgg2_2b,15,vgg2_2,2)
Run_Pool(pool,dma,128,2,2,vgg2_2,vgg2_p)
#layer 3
Run_Conv(conv,128,256,3,3,1,1,1,1,0,vgg2_p,2,vgg3_1w,15,vgg3_1b,15,vgg3_1,2)
Run_Conv(conv,256,256,3,3,1,1,1,1,0,vgg3_1,2,vgg3_2w,15,vgg3_2b,15,vgg3_2,2)
Run_Conv(conv,256,256,3,3,1,1,1,1,0,vgg3_2,2,vgg3_3w,15,vgg3_3b,15,vgg3_3,2)
Run_Pool(pool,dma,256,2,2,vgg3_3,vgg3_cp)
#layer 4
Run_Conv(conv,256,512,3,3,1,1,1,1,0,vgg3_cp,2,vgg4_1w,15,vgg4_1b,15,vgg4_1,2)
Run_Conv(conv,512,512,3,3,1,1,1,1,0,vgg4_1,2,vgg4_2w,15,vgg4_2b,15,vgg4_2,4)
Run_Conv(conv,512,512,3,3,1,1,1,1,0,vgg4_2,4,vgg4_3w,15,vgg4_3b,15,vgg4_3,5)
Run_Pool(pool,dma,512,2,2,vgg4_3,vgg4_p)
#layer 5
Run_Conv(conv,512,512,3,3,1,1,1,1,0,vgg4_p,5,vgg5_1w,15,vgg5_1b,15,vgg5_1,6)
Run_Conv(conv,512,512,3,3,1,1,1,1,0,vgg5_1,6,vgg5_2w,15,vgg5_2b,15,vgg5_2,7)
Run_Conv(conv,512,512,3,3,1,1,1,1,0,vgg5_2,7,vgg5_3w,15,vgg5_3b,12,vgg5_3,7)
Run_Pool_Soft_padding(512,3,3,vgg5_3,vgg5_p)
#exter 1 dilation
Run_Conv(conv,512,1024,3,3,1,1,1,1,1,vgg5_p,7,ex1_1w,15,ex1_1b,15,ex1_1,9)
Run_Conv(conv,1024,1024,1,1,1,1,0,1,0,ex1_1,9,ex1_2w,15,ex1_2b,15,ex1_2,11)
#exter 2
Run_Conv(conv,1024,256,1,1,1,1,0,1,0,ex1_2,11,ex2_1w,15,ex2_1b,15,ex2_1,12)
Run_Conv(conv,256,512,3,3,2,2,1,1,0,ex2_1,12,ex2_2w,15,ex2_2b,15,ex2_2,11)
#exter 3
Run_Conv(conv,512,128,1,1,1,1,0,1,0,ex2_2,11,ex3_1w,15,ex3_1b,15,ex3_1,11)
Run_Conv(conv,128,256,3,3,2,2,1,1,0,ex3_1,11,ex3_2w,15,ex3_2b,15,ex3_2,10)
#exter 4
Run_Conv(conv,256,128,1,1,1,1,0,1,0,ex3_2,10,ex4_1w,15,ex4_1b,15,ex4_1,10)
Run_Conv(conv,128,256,3,3,1,1,0,1,0,ex4_1,10,ex4_2w,15,ex4_2b,15,ex4_2,10)
#exter 5
Run_Conv(conv,256,128,1,1,1,1,0,1,0,ex4_2,10,ex5_1w,15,ex5_1b,15,ex5_1,10)
Run_Conv(conv,128,256,3,3,1,1,0,1,0,ex5_1,10,ex5_2w,15,ex5_2b,15,ex5_2,9)
第二步.對特定檢測層卷積得到分類預測和回歸預測數(shù)據(jù)
#Loc
Run_Conv(conv,1024,24,3,3,1,1,1,0,0,ex1_2,11,l2,15,l2b,15,L2,12)
Run_Conv(conv,512,24,3,3,1,1,1,0,0,ex2_2,11,l3,15,l3b,15,L3,12)
Run_Conv(conv,256,24,3,3,1,1,1,0,0,ex3_2,10,l4,15,l4b,15,L4,12)
Run_Conv(conv,256,16,3,3,1,1,1,0,0,ex4_2,10,l5,15,l5b,15,L5,12)
Run_Conv(conv,256,16,3,3,1,1,1,0,0,ex5_2,9,l6,15,l6b,15,L6,12)
#Conf
Run_Conv(conv,1024,126,3,3,1,1,1,0,0,ex1_2,11,c2,15,c2b,15,C2,10)
Run_Conv(conv,512,126,3,3,1,1,1,0,0,ex2_2,11,c3,15,c3b,15,C3,10)
Run_Conv(conv,256,126,3,3,1,1,1,0,0,ex3_2,10,c4,15,c4b,15,C4,10)
Run_Conv(conv,256,84,3,3,1,1,1,0,0,ex4_2,10,c5,15,c5b,15,C5,10)
Run_Conv(conv,256,84,3,3,1,1,1,0,0,ex5_2,9,c6,15,c6b,15,C6,10)
第三部分 完成情況及性能參數(shù) /Final Design & Performance Parameters
(作品已實現(xiàn)的功能及性能指標)
目前作品在功能上已經(jīng)完成了所預定的功能:實現(xiàn)SSD目標檢測網(wǎng)絡(luò)在PYNQ上的部署,能夠做到輸入一幅圖像,輸出圖中的目標,并找到目標所在的位置。




因為對特征權(quán)重數(shù)據(jù)使用了量化的方法,大幅度減少了資源的消耗。下圖對比了將部分輸入?yún)?shù)改為int類型后消耗的資源情況,可以看到消耗的DSP資源是定點數(shù)的一倍多。
雖然項目達到了部分預期的效果,但也存在著一些問題,目前雖然對FPGA模塊設(shè)計了并行計算,但是工作時鐘頻率卻沒有達到預期的100MHz,只使用了50MHz,計算一幅圖像需要花費好幾分鐘的時間。下一步的工作希望能夠繼續(xù)學習如何能夠提高HLS電路的工作頻率,同時進一步提高數(shù)據(jù)并行的數(shù)量,以此來提高目標檢測的速度。
-
FPGA
+關(guān)注
關(guān)注
1660文章
22412瀏覽量
636364 -
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4838瀏覽量
107797 -
目標檢測
+關(guān)注
關(guān)注
0文章
233瀏覽量
16495
原文標題:基于 FPGA 及神經(jīng)網(wǎng)絡(luò)SSD算法目標檢測系統(tǒng)設(shè)計
文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
PowerPC小目標檢測算法怎么實現(xiàn)?
基于YOLOX目標檢測算法的改進
基于SSD網(wǎng)絡(luò)模型的多目標檢測算法
一種改進的單激發(fā)探測器小目標檢測算法
基于多尺度融合SSD的小目標檢測算法綜述
基于Grad-CAM與KL損失的SSD目標檢測算法
淺談紅外弱小目標檢測算法
基于強化學習的目標檢測算法案例
基于Transformer的目標檢測算法
基于FPGA的SSD目標檢測算法設(shè)計
評論