熊 偉,黃 魯
(中國科學(xué)技術(shù)大學(xué) 信息科學(xué)技術(shù)學(xué)院,合肥 230027)
基于機(jī)器視覺的服裝識別主要分為兩大類,其一是采用人工提取特征進(jìn)行識別,列如基于輪廓傅里葉描述子特征的svm 分類法[1],其二是基于深度學(xué)習(xí)的方法,列如基于殘差的優(yōu)化卷積神經(jīng)網(wǎng)絡(luò)服裝分類算法[2].雖然深度學(xué)習(xí)的方法可以大大減少開發(fā)難度和周期,但是由于網(wǎng)絡(luò)模型太大,F(xiàn)PGA 因有限的片上資源無法放下大型網(wǎng)絡(luò).針對這個問題,可以通過剪枝[3],低精度權(quán)值[4]等方法壓縮模型,從而適應(yīng)FPGA 有限的片上資源.
本文采用CNN 模型對視頻流中的服裝進(jìn)行識別.該系統(tǒng)在ZYNQ 開發(fā)板上進(jìn)行開發(fā)與驗證,利用ZYNQ器件的軟硬件協(xié)同的處理能力,對計算任務(wù)進(jìn)行軟硬件劃分,在ARM 端完成圖像采集、預(yù)處理和顯示,F(xiàn)PGA端利用Verilog 語言設(shè)計卷積神經(jīng)網(wǎng)絡(luò)的硬件IP.采用AXI 總線實現(xiàn)片內(nèi)通信,提出權(quán)重數(shù)據(jù)的重加載結(jié)構(gòu).可以根據(jù)不同應(yīng)用場景選擇合適網(wǎng)絡(luò)模型重新訓(xùn)練,只需要在ARM 端傳送已經(jīng)訓(xùn)練好的權(quán)重數(shù)據(jù)而無需修改硬件.
本設(shè)計采用一種類似VGG[5]的一種自定義神經(jīng)網(wǎng)絡(luò)為基礎(chǔ),命名為Mini-VGGNet.如圖1所示,基本結(jié)構(gòu)與VGG 網(wǎng)絡(luò)十分類似,該網(wǎng)絡(luò)結(jié)構(gòu)非常簡潔,整個網(wǎng)絡(luò)都使用了同樣大小的卷積核尺寸(3×3)和最大池化尺寸(2×2).通過不斷加深網(wǎng)絡(luò)結(jié)構(gòu)來提升性能.每一層卷積或全連接層后面都使用易于在硬件上實現(xiàn)的Relu 激活函數(shù).
圖1 網(wǎng)絡(luò)模型結(jié)構(gòu)
由于傳統(tǒng)卷積神經(jīng)網(wǎng)絡(luò)的90%的參數(shù)都集中在全連接層,這里在第6 層卷積后面加入global_max_pooling[6]而不是普通的池化,使得7×7 大小的特征圖直接變?yōu)?×1,大大減少了全連接層的參數(shù).使得可以利用FPGA 的片上內(nèi)存即可儲存所有的權(quán)重參數(shù).最后在全連接層后面加上Softmax 函數(shù),實現(xiàn)11 個分類,第11 分類為未知類.
模型的時間復(fù)雜度即運算次數(shù),可用FLOPS (FLOating-Point operationS)衡量,也就是浮點運算次數(shù).公式如下:
其中,M是每個卷積核輸出特征圖的尺寸.K是每個卷積核的尺寸.Cin是每個卷積核的輸入通道數(shù).Cout是本卷積層具有的輸出通道數(shù).由表1,可以看出90%以上的運算都集中在卷積層.
綜上該網(wǎng)絡(luò)架構(gòu)的特點是:
(1) 只使用3×3 的卷積層堆疊在一起來增加深度.
(2) 使用最大池化來減小數(shù)組大小.
(3) 網(wǎng)絡(luò)末端全連接層在Softmax 分類器之前.
(4) 卷積核都是8 的倍數(shù),方便卷積核的并行化.
根據(jù)本設(shè)計提出的網(wǎng)絡(luò)結(jié)構(gòu),通過使用TensorFlow深度學(xué)習(xí)庫來進(jìn)行整體網(wǎng)絡(luò)結(jié)構(gòu)搭建,最終可以對fashion-minist[7]數(shù)據(jù)集實現(xiàn)92.39%的準(zhǔn)確率.對比多份對該數(shù)據(jù)集提交的測試模型[8].由表2可以看出,Mini-VGGNet 僅使用了大約20 K 的參數(shù),沒有復(fù)雜的預(yù)處理操作就能達(dá)到相對較高的識別率.
表1 各層參數(shù)量
表2 不同測試模型
由于CPU 平臺訓(xùn)練使用的是浮點數(shù),所以需要對網(wǎng)絡(luò)權(quán)重定點化處理.通過在軟件端對比不同權(quán)重位寬對應(yīng)的準(zhǔn)確率,在FPGA 上使用11 bit 來進(jìn)行定點化處理而不損失精度.在PC 端將權(quán)重定點化,按照網(wǎng)絡(luò)模型的順序?qū)?quán)重參數(shù)保存為頭文件,通過ARM 將權(quán)重加載到PL 端的CNN IP 中去.
本設(shè)計提出的服裝系統(tǒng)發(fā)揮了ARM+FPGA[9-12]的軟硬件協(xié)處理能力,將運算量巨大的CNN 放在FPGA端,充分發(fā)揮FPGA 并行運算能力.如圖2所示,該系統(tǒng)在ARM 端實現(xiàn)攝像頭的視頻采集和前景分割,F(xiàn)PGA 端實現(xiàn)CNN 算法的硬件加速以及HDMI 的高清顯示.
圖2 系統(tǒng)框架圖
PS 部分主要包括基于Petalinux 工具的嵌入式Linux 系統(tǒng)的構(gòu)建以及交叉編譯器的搭建,OpenCV 視覺庫和QT 庫的移植.PL 部分主要包括CNN IP 的編寫和封裝,HDMI 視頻顯示驅(qū)動.
在FPGA 上使用CNN 識別算法之前,需要將ARM端預(yù)處理的圖片加載進(jìn)來,眾所周知,AXI DMA 是PS 與PL 之間高速傳輸?shù)姆椒?,由于?shù)據(jù)量并不是很多,而且PL 與PS 之間傳輸?shù)刂凡贿B續(xù)且長度不規(guī)則的數(shù)據(jù),此時AXI DMA 便不再適用了.權(quán)衡之下,本系統(tǒng)基于BRAM 的方式,來進(jìn)行PS 和PL 之間的數(shù)據(jù)交互.
當(dāng)需要根據(jù)不同實際情況需要重新訓(xùn)練網(wǎng)絡(luò),必須經(jīng)常改變權(quán)值,因此提出權(quán)重加載結(jié)構(gòu).在將它們發(fā)送到FPGA 層之前,ZYNQ 系統(tǒng)的DDR 內(nèi)存將會保存權(quán)重.PS 通過AXI 總線把權(quán)重發(fā)給PL 端的BRAM,CNN IP 從BRAM 里面加載需要的權(quán)重數(shù)據(jù).由于需要在Linux 下完成,因此需要移植AXI_BRAM 驅(qū)動,根據(jù)Vivado 工程的地址信息,更改設(shè)備樹以將BRAM內(nèi)存范圍添加到內(nèi)存節(jié)點并添加保留的內(nèi)存節(jié)點,以便內(nèi)核不使用內(nèi)存,但會將內(nèi)存映射到內(nèi)核內(nèi)存中.設(shè)備樹添加如下:
memory {
device_type="memory";
reg=<0x0 0x40008000>;
};
reserved-memory {
ranges;
reserved {
reg=<0x40000000 0x8000>;
};
這樣就可以在用戶空間可以使用/dev/mem 去訪問物理地址(0x40000000)大小為8 K 的BRAM,不修改內(nèi)核.建立內(nèi)存映射函數(shù)如下:
BRAM64_vptr=(u64*)mmap(NULL,BRAM_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,BRAM_pbase);
由于攝像頭采集的圖像容易受光線干擾,而訓(xùn)練集的圖像背景全是0,這樣帶來的后果就是網(wǎng)絡(luò)僅對數(shù)據(jù)集比較友好,而面對實際情況就會出現(xiàn)相對較大的誤差.這里采取兩種辦法來解決這個問題,
一種是將USB 采集的真實圖像也加入到Mini-VGG Net 網(wǎng)絡(luò)進(jìn)行訓(xùn)練,這里一共拍攝了50×10=500 張,640×480 的真實圖片,利用Python 進(jìn)行預(yù)處理,這里僅僅就是利用雙線性插值法resize 到28×28 大小.
另一種因為采集的圖片是640×480,然后在ARM上對圖片進(jìn)行縮放加背景分離(為了還原和訓(xùn)練集的圖片差不多),grabCut 算法在ARM 端比較耗時,為了滿足實時性要求,即處理時間不能超過33 ms,因此系統(tǒng)采用先將圖像縮放到56×56 大小,然后進(jìn)行背景分離算法,再縮放到28×28,最后進(jìn)行形態(tài)學(xué)操作,濾波輸出28×28 的圖片.
分割流程如圖3所示,即640×480->56×56->grabCut->28×28.最后再將CNN_28×28 的圖片送給CNN IP 來計算.
圖3 背景分割流程圖
由于本系統(tǒng)的權(quán)重和圖像數(shù)據(jù)都通過ARM 傳給FPGA,圖4為ARM 和FPGA 之間的數(shù)據(jù)加載結(jié)構(gòu)圖.ARM 在DDR 中按順序保存指定層的權(quán)重.ARM 向FPGA 發(fā)送指定層的索引號、權(quán)重數(shù)量和需要在DDR中讀取權(quán)重的地址.PS 通過M_AXI_GP 口向BRAM地址依次存入32 bit (僅使用低11 bit) 的權(quán)重數(shù)據(jù).PS 每向BRAM 寫完數(shù)據(jù)后通過AXI GPIO 給出一個上升沿信號.PL 捕獲上升沿后立即將PS 寫入的32 位數(shù)據(jù)讀出,并寫入CNN IP 的database 模塊.同理,圖像數(shù)據(jù)加載也是如此工作.
圖4 PL-PS 數(shù)據(jù)加載結(jié)構(gòu)圖
通過Vivado 的ila(邏輯分析儀)抓取的波形如圖5所示.可以看出,該模塊能夠正常的把784 個圖像數(shù)據(jù)寫入database 模塊,并且拉低CNN IP 的啟動信號(低電平有效).
圖5 圖像數(shù)據(jù)加載
在系統(tǒng)框架中核心就是CNN IP 的設(shè)計.如圖6所示,這個CNN 加速IP 在開始信號(start)的上升沿到來時開始工作.ARM 通過AXI 總線,將數(shù)據(jù)寫入到CNN IP 的database 中,databae 存放CNN 需要的圖像數(shù)據(jù)還有權(quán)重參數(shù).通信是加速器的主要約束條件,在CNN 的整個前向計算過程中,數(shù)據(jù)吞吐量不斷上升,對于大的特征圖基本上都是傳到片外內(nèi)存中去,而DDR 數(shù)據(jù)交互時間對幀率的影響特別大.而本設(shè)計由于大大減少了網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù),優(yōu)化feature map 數(shù)據(jù)的存儲方式,使得所有數(shù)據(jù)可以存放在BRAM 中,避免了和DDR 之間數(shù)據(jù)交互,只需要在片上操作.這里需要兩塊片上RAM (0~28×28×8 和28×28×8+1~28×28×16) 來儲存卷積計算的中間特征圖.卷積模塊從mem0 讀取數(shù)據(jù)而計算結(jié)果寫到mem1,接著下次就從mem1 讀取數(shù)據(jù)而計算結(jié)果寫到mem0,利用乒乓操作實現(xiàn)流水線,提高了數(shù)據(jù)吞吐率.流水化的設(shè)計可以提高加速器中的計算單元利用率.
圖6 CNN IP 框架圖
卷積層計算時整個網(wǎng)絡(luò)的核心計算單元,圖7是單個處理單元的結(jié)構(gòu)圖,該結(jié)構(gòu)是由9 個乘法器和8 個加法器構(gòu)成,本文利用im2col 操作和移位寄存器將圖像和權(quán)重數(shù)據(jù)拼接成兩個99 bit 的數(shù)據(jù)矩陣,單時鐘周期可以對3×3 的特征圖計算輸出一個特征圖.而權(quán)重數(shù)據(jù)復(fù)用可以降低帶寬提高計算效率.特征數(shù)據(jù)由一個卷積窗口不斷在特征圖上滑動生成.
由于CNN 網(wǎng)絡(luò)模型的卷積核都是8 的倍數(shù),如圖8所示,這里最高可以配置為8 個卷積單元同時工作,以更多的資源來換取運算時間.所以本設(shè)計能夠?qū)崿F(xiàn)單時鐘周期72 次MAC(乘累加),工作在100 M 的頻率下,峰值運算速率最高可達(dá)7.2 GMAC/s.與普通的嵌入式設(shè)備相比,計算效率具有顯著的提高,極大地提高了數(shù)據(jù)帶寬和傳輸速率.
圖7 卷積處理單元(PE)
圖8 卷積塊處理單元(并行度為8)
卷積處理單元(PE)同樣可以用來全連接層的計算,在全連接層,每一個神經(jīng)元都與上一層相連接,網(wǎng)絡(luò)的最后一層是32 個神經(jīng)元,每8 個為一組,所以卷積處理單元在這里僅僅使用了8 個乘法器.迭代4 次,得到11 個輸出.
本文采用Softmax 函數(shù)作為分類器輸出,Softmax的公式如式(2)所示.
在布置前項傳播時,我們不需要進(jìn)行指數(shù)操作,指數(shù)在硬件上實施代價太大,而且沒有必要,我們只需要找到11 個值中最大的那一個就可以,所以只需要一個比較器即可.
整個流程通過狀態(tài)機(jī)來調(diào)度CNN 各個模塊的運算.
本文實驗使用Xilinx 公司的Vivado 進(jìn)行硬件開發(fā)和modelsim 來進(jìn)行軟件仿真.FPGA 使用ZYNQ 7000 系列AX7020 開發(fā)板.芯片為xc7z020clg400-2,該芯片擁有53 200 個LUT,106 400 個FF,140 個BRAM 36 KB (4.9 M),220 個DSP 資源,完全滿足系統(tǒng)實驗要求,將開發(fā)板和USB 攝像頭還有HDMI 顯示器連接,實驗平臺如圖9所示.
圖9 硬件開發(fā)平臺圖
將fashion-minist 數(shù)據(jù)集存放到DDR (8 GB)中去,該數(shù)據(jù)集一共有60 000 張訓(xùn)練圖片和10 000 張測試圖片,大小為28×28×1,在實驗前在PC 上利用Python將10 000 張測試集數(shù)據(jù)轉(zhuǎn)成二進(jìn)制.ARM 通過BRAM把數(shù)據(jù)加載到CNN 中,計算完成觸發(fā)中斷,在中斷里面對錯誤率進(jìn)行統(tǒng)計,對比PC 機(jī)上利用Python 處理結(jié)果,如表3,可以發(fā)現(xiàn)在FPGA 上,準(zhǔn)確率幾乎沒有下降.
表3 測試集結(jié)果
對電商網(wǎng)站上真實的圖片進(jìn)行測試,部分測試結(jié)果如圖10所示,成功完成圖像采集、預(yù)處理和識別結(jié)果的顯示.
圖10 服裝識別實際運行結(jié)果
每種服裝選取50 個樣本,通過USB 攝像頭對不同服裝進(jìn)行實時采集,利用OpenCV 進(jìn)行預(yù)處理縮放到28×28 大小,再送到CNN IP 計算,并通過QT 顯示.識別結(jié)果如表4,除了套衫是88%,其余種類識別率基本都達(dá)到90%以上.
表4 真實圖片測試準(zhǔn)確率
最終FPGA 工作于100 Mhz 時鐘頻率下.表5列出了CNN IP 在配置為不同卷積塊時的資源使用情況和計算速度.功耗由Vivado Power Report 獲取.
表5 CNN IP 資源消耗以及功耗
由表5可以看出當(dāng)卷積塊為1 時,一副圖片的識別需要9.094 ms,完全滿足實時性的要求,DSP 資源消耗8%,BRAM 使用率達(dá)21%,在一些低成本的FPGA上可以實現(xiàn),應(yīng)用在加速物聯(lián)網(wǎng)邊緣設(shè)備機(jī)器學(xué)習(xí)推理的開發(fā).在資源允許的情況下,最高可以實現(xiàn)卷積塊為8 的并行度,識別一副圖片僅需1.361 ms,DSP 資源消耗50%,BRAM 使用率達(dá)50%,速度提高了近5.68倍.在一些對時間要求非常高的場合,可以利用資源去換取時間.
本文提出一種基于ZYNQ 平臺的服裝識別系統(tǒng).采用Verilog 設(shè)計服裝識別CNN 的IP 核,留出信號接口,權(quán)重可加載,通用性好,便于移植,大大縮減了SOC的開發(fā)周期,對算法芯片化的施行也具有重要意義.
該系統(tǒng)采用軟硬件協(xié)同的方式,成功移植Linux操作系統(tǒng),利用OpenCV 和QT 將分割和識別結(jié)果通過HDMI 傳輸接口進(jìn)行實時顯示,達(dá)到有實時性好、界面友好,并且具有較高的識別率和較強(qiáng)的擴(kuò)展性.