戴雷燕,馮 杰,董 慧,楊小利
(浙江理工大學(xué) 信息學(xué)院,杭州 310018)
物體檢測(cè)是計(jì)算機(jī)視覺(jué)領(lǐng)域的一個(gè)重要問(wèn)題,物體檢測(cè)算法從傳統(tǒng)的人工特征(如梯度方向直方圖,SIFT 角點(diǎn))和經(jīng)典的統(tǒng)計(jì)機(jī)器學(xué)習(xí)方法(如支持向量機(jī),樸素貝葉斯)[1-5]發(fā)展到現(xiàn)今的基于卷積神經(jīng)網(wǎng)絡(luò)的物體檢測(cè)算法,物體檢測(cè)效果令人驚嘆.2014年,R.Girshick 等人將卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用到物體檢測(cè)中,提出了基于區(qū)域的卷積神經(jīng)網(wǎng)絡(luò)(R-CNN)算法[6],使得檢測(cè)效果遠(yuǎn)遠(yuǎn)優(yōu)于當(dāng)時(shí)的傳統(tǒng)物體檢測(cè)算法.隨后的Fast R-CNN[7]和Faster R-CNN[8]等都在檢測(cè)準(zhǔn)確率和定位精度上不斷突破,而2015年Joseph Redmon 等提出的YOLO[9]算法和2016年Wei Liu 等提出的SSD[10]算法都是在算法速度上進(jìn)行突破.在物體檢測(cè)算法不斷突破的同時(shí),神經(jīng)網(wǎng)絡(luò)架構(gòu)也在不斷更新.
最早的卷積神經(jīng)網(wǎng)絡(luò)LeNet[11]是Yann LeCun 在1998年設(shè)計(jì)并提出的,它一開(kāi)始是針對(duì)識(shí)別手寫(xiě)數(shù)字問(wèn)題,網(wǎng)絡(luò)結(jié)構(gòu)較為簡(jiǎn)單,但是包含了卷積神經(jīng)網(wǎng)絡(luò)的基本單元,是以后各種模型的始祖.2012年,在ImageNet比賽上大放異彩的AlexNet[12]雖然只比LeNe 多了幾層,但效果遠(yuǎn)遠(yuǎn)優(yōu)于最早的LeNet,AlexNet 將激活函數(shù)由Sigmoid 換成了ReLU,解決了因?yàn)榫W(wǎng)絡(luò)層更深時(shí)的梯度彌散問(wèn)題,還加入了dropout 層,有效解決過(guò)擬合問(wèn)題.2014年出現(xiàn)的VGG[13]相較于AlexNet 而言網(wǎng)絡(luò)層越來(lái)越深,整個(gè)網(wǎng)絡(luò)層全部使用3×3 大小的小卷積核和2×2 的最大池化核,使得整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)簡(jiǎn)潔,具有更好的泛化性.Network in Network[14]模型的亮點(diǎn)在于1×1 卷積核和全局平均池化層(Global Average Pooling)的應(yīng)用,使得整個(gè)網(wǎng)絡(luò)模型的參數(shù)規(guī)模銳減,有利于網(wǎng)絡(luò)的加深,訓(xùn)練時(shí)間也得到提升.2014年的GoogLeNet[15]中使用了基礎(chǔ)卷積塊Inception,最后的全連接層借用NiN 模型思想換成Global Average Pooling,整個(gè)模型的參數(shù)量大大減小,效果更好.2015年的ResNet[16]中包含了Residual 單元,允許原始輸入信息直接傳遞到后面的網(wǎng)絡(luò)層中,解決了因?yàn)榫W(wǎng)絡(luò)層過(guò)深而梯度消失,無(wú)法反向傳播的問(wèn)題.2017年谷歌公司提出的MobileNets使用深度分離卷積[17],進(jìn)一步減小計(jì)算量,壓縮模型,可以滿(mǎn)足嵌入式設(shè)備的需求.
隨著硬件計(jì)算能力的快速發(fā)展,深度學(xué)習(xí)技術(shù)已經(jīng)應(yīng)用到很多便攜式嵌入設(shè)備中,比如各種刷臉支付、相冊(cè)智能分類(lèi)、圖片風(fēng)格遷移等,但是目前一大挑戰(zhàn)是如何將龐大深度模型移植到資源有限的嵌入式設(shè)備上[18].
本文針對(duì)嵌入式設(shè)備進(jìn)行的深度學(xué)習(xí)物體檢測(cè)優(yōu)化算法研究主要在PC 端和嵌入式平臺(tái)ARM 上完成.首先,準(zhǔn)備好訓(xùn)練數(shù)據(jù),選擇合適的物體檢測(cè)框架和神經(jīng)網(wǎng)絡(luò)架構(gòu)進(jìn)行構(gòu)建;然后在此網(wǎng)絡(luò)結(jié)構(gòu)下,對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行模型訓(xùn)練,得出原始物體檢測(cè)模型;接著對(duì)原始物體檢測(cè)模型進(jìn)行模型剪枝,以上過(guò)程都是在PC 端上完成.將PC 端上完成模型剪枝的物體檢測(cè)模型移植到嵌入式設(shè)備ARM 平臺(tái)上,針對(duì)該物體檢測(cè)模型的各個(gè)網(wǎng)絡(luò)層進(jìn)行運(yùn)算代價(jià)計(jì)算,根據(jù)計(jì)算結(jié)果,對(duì)運(yùn)算代價(jià)較高的網(wǎng)絡(luò)層進(jìn)行匯編優(yōu)化.匯編優(yōu)化后的物體檢測(cè)模型在ARM 平臺(tái)上對(duì)冰箱內(nèi)采集到的視頻內(nèi)容進(jìn)行前向推理,在ARM 平臺(tái)上顯示檢測(cè)結(jié)果,上述過(guò)程在ARM平臺(tái)上完成,圖1為整個(gè)物體檢測(cè)優(yōu)化算法的流程圖.
本文整體網(wǎng)絡(luò)架構(gòu)選用MobileNets,MobileNets中的深度可分解卷積是將標(biāo)準(zhǔn)卷積分解成一個(gè)深度卷積和一個(gè)點(diǎn)卷積.
假設(shè)輸入F的維度為DF×DF×M,其中DF為輸入F的寬和高,M為輸入層的通道數(shù).標(biāo)準(zhǔn)卷積時(shí),卷積K的參數(shù)量表示為DK×DK×M×N,其中DK為卷積K的維度,N為輸出通道數(shù),則此時(shí)的計(jì)算代價(jià)為C:
深度可分解卷積時(shí),將標(biāo)準(zhǔn)卷積K拆分為深度卷積DK×DK×1×M和點(diǎn)卷積1×1×M×N,計(jì)算代價(jià)為C’:
將深度可分解卷積的計(jì)算代價(jià)C’與標(biāo)準(zhǔn)卷積的計(jì)算代價(jià)C相除,進(jìn)行比較:
在ImageNet 數(shù)據(jù)集上,深度分離卷積的參數(shù)量約是標(biāo)準(zhǔn)卷積參數(shù)量1/7,而準(zhǔn)確率只下降了不到1%[17].
深度分離卷積在網(wǎng)絡(luò)結(jié)構(gòu)上的變化如圖2所示,將標(biāo)準(zhǔn)卷積拆分成深層卷積和點(diǎn)卷積,在每層卷積后面都有BN 層和激勵(lì)函數(shù)ReLU.
圖2 網(wǎng)絡(luò)結(jié)構(gòu)變化
在物體檢測(cè)算法方面,R-CNN 系列都是物體定位和物體分類(lèi)分開(kāi)進(jìn)行的物體檢測(cè)方法,雖然準(zhǔn)確率很高,但是速度較慢;而YOLO 和SSD 則都是一步完成物體定位和物體分類(lèi),其中YOLO 的速度很快,但是準(zhǔn)確率不盡人意,而SSD 綜合了Faster R-CNN 的高準(zhǔn)確率和YOLO 的快速率優(yōu)點(diǎn),使得物體檢測(cè)方法更加適合應(yīng)用在嵌入式設(shè)備上,故選擇SSD 作為本次面向嵌入式設(shè)備的深度學(xué)習(xí)物體檢測(cè)優(yōu)化算法研究的物體檢測(cè)框架.
在PC 端上的模型剪枝流程圖如圖3所示.
首先,對(duì)MobileNets-SSD 網(wǎng)絡(luò)進(jìn)行神經(jīng)元重要性的評(píng)估,然后根據(jù)評(píng)估結(jié)果將其中最不重要的神經(jīng)元置零,對(duì)部分神經(jīng)元置零后的網(wǎng)絡(luò)進(jìn)行微調(diào),判斷微調(diào)后的網(wǎng)絡(luò)是否達(dá)到預(yù)定標(biāo)準(zhǔn),如果達(dá)到預(yù)定的標(biāo)準(zhǔn),則可以停止剪枝;如果未到到預(yù)定的標(biāo)準(zhǔn),則需要重復(fù)神經(jīng)元重要性評(píng)估、不重要神經(jīng)元置零、微調(diào)等步驟.
本文在模型剪枝過(guò)程中采用了一種基于一階泰勒展開(kāi)的新的神經(jīng)元重要性評(píng)估準(zhǔn)則[19].該準(zhǔn)則中對(duì)神經(jīng)元的評(píng)估公式為:
上式中,D表示訓(xùn)練樣本集,W表示未修剪前的權(quán)重參數(shù),W’表示修剪后的權(quán)重參數(shù),C(D|W)為修剪后的代價(jià)函數(shù),而C(D|W’)表示的是修剪后的代價(jià)函數(shù),最優(yōu)化的剪枝就是使得修剪后的代價(jià)函數(shù)C(D|W’)盡可能地逼近修剪前的代價(jià)函數(shù)C(D|W).將剪枝前后的代價(jià)函數(shù)差值賦值給|ΔC(hi)|,找出令式(4)中|ΔC(hi)|值最小的非零權(quán)重參數(shù),將該參數(shù)置零,即完成一次剪枝.又因?yàn)镃(D|hi)=C(D|(w,b)i),所以式(4)可以變換為式(5):
在式(5)中的C(D,hi=0)部分引入一階泰勒展開(kāi)式,如式(6)所示:
其中,R1(hi=0)為高階項(xiàng),因?yàn)镽eLU 激活層中含有高階信息,同時(shí)為了避免復(fù)雜的計(jì)算,高階項(xiàng)R1(hi=0)可以忽略不計(jì).
圖3 模型剪枝流程圖
綜合式(5)和式(6)可得式(7):
將特征圖看作變量的向量表示,當(dāng)有M個(gè)變量時(shí),剪枝前后的損失函數(shù)差值可表示為:
嵌入式設(shè)備主要由嵌入式處理器、相關(guān)支撐硬件和嵌入式軟件系統(tǒng)組成,而樹(shù)莓派是一款基于ARM 的微型電腦主板,是作為學(xué)習(xí)計(jì)算機(jī)編程的首選嵌入式設(shè)備.本文使用的是樹(shù)莓派3 B,它有1.2 GHz 和64 位處理器,滿(mǎn)足物體檢測(cè)模型匯編優(yōu)化和前向推理的性能需求.
在該ARM 平臺(tái)上,通過(guò)對(duì)表1模型剪枝對(duì)比中各個(gè)網(wǎng)絡(luò)層的耗時(shí)比較,決定針對(duì)其中卷積層Conv_0、Conv_1、Conv_2、Conv_3、Conv_4、Conv_5、Conv_6、Conv_7、Conv_8、Conv_9、Conv_10、Conv_11、Conv_12、Conv_13、Conv_14_1 和Conv_14_2 進(jìn)行匯編優(yōu)化,主要策略分為指令調(diào)整、寄存器分配和條件執(zhí)行[20].
表1 模型剪枝對(duì)比(單位:ms)
(1)指令調(diào)整:通過(guò)展開(kāi)循環(huán)對(duì)裝載指令進(jìn)行人工優(yōu)化,仔細(xì)安排裝載指令的時(shí)間次序,防止流水線終止.
(2)寄存器分配:限制局部變量的個(gè)數(shù);把多個(gè)局部變量存放在一個(gè)寄存器中.
(3)條件執(zhí)行:使用ARM 處理器特有的條件執(zhí)行指令來(lái)減少判斷跳轉(zhuǎn)和分支等對(duì)流水線影響較大的操作.
通過(guò)以上策略最大程度地利用平臺(tái)資源,發(fā)揮處理器最大效能,來(lái)滿(mǎn)足物體檢測(cè)模型直接在嵌入式設(shè)備上快速前向推理的需求.
通過(guò)冰箱內(nèi)的USB 攝像頭對(duì)總共76 種蔬菜水果飲料等冰箱常見(jiàn)食材進(jìn)行訓(xùn)練樣本采集,一共采集5 萬(wàn)張圖片,最后挑選出45 488 張作為訓(xùn)練樣本,如圖4所示.
圖4 訓(xùn)練樣本
圖5 數(shù)據(jù)標(biāo)注
利用網(wǎng)上標(biāo)注系統(tǒng)對(duì)挑選出的訓(xùn)練樣本進(jìn)行數(shù)據(jù)標(biāo)注,網(wǎng)上標(biāo)注系統(tǒng)的界面如圖5所示,可以對(duì)物體進(jìn)行種類(lèi)選擇和位置定位.
訓(xùn)練時(shí)采用MobileNets 作為本次實(shí)驗(yàn)的基礎(chǔ)網(wǎng)絡(luò)架構(gòu),其中總共有35 層卷積層,在Conv_11、Conv_13、Conv_14_2、Conv_15_2、Conv_16_2 和Conv_17_2后進(jìn)行物體檢測(cè)方法SSD 的分類(lèi)器分類(lèi)、位置回歸和錨框的生成.最后,將以上6 個(gè)卷積層生成的類(lèi)別特征、位置特征和anchor box 信息進(jìn)行concat、Softmax和flatten.MobileNets 的網(wǎng)絡(luò)層與本文的MobileNets-SSD 網(wǎng)絡(luò)層如表2所示.相比于MobileNets,本文的MobileNets-SSD 多8 層卷積層,且最后的平均池化層、全連接層和Softmax 變成了conf_reshape、conf_softmax 和conf_flatten.對(duì)訓(xùn)練集進(jìn)行訓(xùn)練后,最終本文的MobileNets-SSD 模型的mAP 達(dá)到84.7%.
表2 MobileNets 與本文的MobileNets-SSD
MobileNets-SSD 完成訓(xùn)練后進(jìn)行基于一階泰勒展開(kāi)的模型剪枝.控制裁剪的整體過(guò)程為:1)前向傳播2)獲取排序后的卷積窗口3)計(jì)算需要剪枝的卷積窗口個(gè)數(shù)4)裁剪.主要函數(shù)如下所示:
(1)forward
(2)compute_rank
(3)normalize_ranks_per_layer
(4)get_prunning_plan
(5)lowest_ranking_filters
其中函數(shù)(1)表示模型的前向傳播過(guò)程;函數(shù)(2)用在梯度更新時(shí),其輸出的計(jì)算值用于卷積窗口排序;函數(shù)(3)是將每層的結(jié)果歸一化;函數(shù)(4)和函數(shù)(5)表示利用最小堆方法得到N個(gè)排名最低的卷積窗口.
完成一次剪枝后,進(jìn)行模型微調(diào)和迭代.所有參數(shù)參與訓(xùn)練與學(xué)習(xí),重新訓(xùn)練模型10 個(gè)迭代.
具體實(shí)驗(yàn)時(shí),N分別設(shè)置為512 和1024,此時(shí)每層網(wǎng)絡(luò)層耗時(shí)情況如表1模型剪枝對(duì)比所示.N為512 時(shí),物體檢測(cè)模型的mAP 為85.1%;N設(shè)為1024 時(shí),物體檢測(cè)模型的mAP 為82.3%.可以看出,N為512 時(shí),物體檢測(cè)模型的mAP 有所提升;而N為1024 時(shí),物體檢測(cè)模型的mAP 有所下降,說(shuō)明N設(shè)置為512 時(shí),模型剪枝后的物體檢測(cè)模型復(fù)雜度更為適合本次實(shí)驗(yàn)訓(xùn)練數(shù)據(jù)集和測(cè)試數(shù)據(jù)集,前向推理效果更好.
所以,綜合表1模型剪枝對(duì)比中N為512 和1024 時(shí)的耗時(shí)情況以及相對(duì)應(yīng)的物體檢測(cè)模型的mAP 值,本實(shí)驗(yàn)選擇針對(duì)N為512 的模型剪枝后的MobileNets-SSD 物體檢測(cè)模型進(jìn)行匯編優(yōu)化.經(jīng)過(guò)模型剪枝后的MobileNets-SSD 模型體積由23.1 MB 縮減為20.8 MB,模型體積減小9.96%.
由表1模型剪枝對(duì)比可知,物體檢測(cè)模型中卷積層Conv_0、Conv_1、Conv_2、Conv_3、Conv_4、Conv_5、Conv_6、Conv_7、Conv_8、Conv_9、Conv_10、Conv_11、Conv_12、Conv_13、Conv_14_1 和Conv_14_2 無(wú)論是模型剪枝前還是模型剪枝后,耗時(shí)都比較久.我們通過(guò)指令調(diào)整、寄存器分配和條件執(zhí)行等手段對(duì)模型剪枝前和模型剪枝后的耗時(shí)多的網(wǎng)絡(luò)層分別進(jìn)行匯編優(yōu)化.主要應(yīng)用到的是NEON 技術(shù),它是ARM 處理器的128 位SIMD 架構(gòu)擴(kuò)展,旨在為消費(fèi)性多媒體應(yīng)用程序提供靈活、強(qiáng)大的加速功能.它具有32 個(gè)64 位寄存器和16 個(gè)128位寄存器.寄存器的具體調(diào)用代碼如下所示:
(1).macro MobileNets-SSD
(2)vldl.32 {d16-d19},[BO]!
(3)vldl.32 {d0-d3},[AO]!
(4)vldl.32 {d16-d19},[BO]!
(5)vldl.32 {d4-d7},[AO]!
(6)vmla.f32 q12,q0,d16[0]
(7)vmla.f32 q12,q2,d18[0]
(8)vmla.f32 q12,q3,d20[0]
(9)vmla.f32 q12,q4,d22[0]
(10)...
(11)vstl.32 {d24-d27},[CO]!
(12)vstl.32 {d28-d31},[CO]!
(13).endm
上述代碼(1)行,.macro 后面的字符串表示該宏的名稱(chēng),在后續(xù)的調(diào)用中可以直接利用該宏來(lái)替代內(nèi)部的具體實(shí)現(xiàn)代碼.代碼(13)行的.end 為宏的載止位置.
代碼(2)-(5)行為數(shù)據(jù)加載指令,其中A0 表示矩陣起始地址,B0 為右矩陣的起始地址,兩者均為地址寄存器.vldl,32 指令的調(diào)用可以將數(shù)據(jù)按照32 位為一個(gè)數(shù)據(jù)單位的順序加載到NEON 寄存器當(dāng)中,數(shù)據(jù)的連續(xù)性能夠減少指令的訪存時(shí)間.
代碼(6)-(9)行為結(jié)果矩陣第一列的計(jì)算過(guò)程,vmla.f32為乘加指令.
代碼(10)行表示其他幾列的計(jì)算方式.
代碼(11)-(12)行將寄存器當(dāng)中的結(jié)果矩陣的值存儲(chǔ)到內(nèi)存當(dāng)中,當(dāng)存儲(chǔ)位置是連續(xù)的情況下,指令的訪存將同樣是連續(xù)的,減少數(shù)據(jù)存儲(chǔ)所需時(shí)間.
匯編優(yōu)化后的結(jié)果如表3匯編對(duì)比所示.
由表3匯編對(duì)比可知,模型剪枝后的MobileNets-SSD 模型前向推理速率相較于未進(jìn)行模型剪枝時(shí)的速率加快了1.16 倍,而匯編前后模型的mAP 無(wú)變化;又結(jié)合表1模型剪枝對(duì)比和表3匯編對(duì)比,經(jīng)過(guò)模型剪枝和匯編優(yōu)化的MobileNets-SSD 模型前向推理速率相較于原始模型加快了8.82 倍.
本文還選擇其他兩個(gè)前向推理框架進(jìn)行了對(duì)比,使用的都是剪枝之后的網(wǎng)絡(luò)模型,如表4所示.Mini-Caffe 是對(duì)Caffe 的前向推理版本,匯編優(yōu)化比較少,Ncnn 是騰訊開(kāi)發(fā)的帶匯編優(yōu)化的前向推理框架,做了比較深度的匯編優(yōu)化.與它們相比,本文最終的前向推理時(shí)間是最低的.
表3 匯編對(duì)比
表4 與其他框架的對(duì)比
在ARM 平臺(tái)上的前向推理時(shí),測(cè)試樣本檢測(cè)結(jié)果如圖6所示.
部分物體未被檢測(cè)的原因有以下幾點(diǎn):
(1)遮擋物過(guò)多,未能檢測(cè)到整個(gè)物體;
(2)離USB 攝像頭太遠(yuǎn),暴露面積太小;
(3)只暴露物體部分特征,前向推理困難等.
前期的訓(xùn)練樣本的選擇對(duì)最后嵌入式設(shè)備上物體檢測(cè)模型的前向推理檢測(cè)結(jié)果有一定影響.整體效果較為理想.
圖6 檢測(cè)結(jié)果
本文選擇了合適的物體檢測(cè)框架SSD 和神經(jīng)網(wǎng)絡(luò)架構(gòu)MobileNets,訓(xùn)練出一個(gè)滿(mǎn)足嵌入式設(shè)備需求的物體檢測(cè)模型,并通過(guò)模型剪枝對(duì)該物體檢測(cè)模型進(jìn)行優(yōu)化,在移植到ARM 平臺(tái)上之后又進(jìn)行匯編優(yōu)化,進(jìn)一步加快前向推理速率.在準(zhǔn)確精度和模型大小方面還可以有進(jìn)一步的研究:
(1)MobileNets V2 的準(zhǔn)確率和速率都有提高,可以在此網(wǎng)絡(luò)結(jié)構(gòu)上進(jìn)行物體檢測(cè)算法優(yōu)化.
(2)因?yàn)槟P椭袇?shù)的存儲(chǔ)精度為32 位的浮點(diǎn)數(shù),可以在ARM 平臺(tái)上針對(duì)模型參數(shù)進(jìn)行量化,更大程度地壓縮模型,加快前向推理速率.
計(jì)算機(jī)系統(tǒng)應(yīng)用2019年4期