戴雷燕,馮 杰,董 慧,楊小利
(浙江理工大學 信息學院,杭州 310018)
物體檢測是計算機視覺領域的一個重要問題,物體檢測算法從傳統的人工特征(如梯度方向直方圖,SIFT 角點)和經典的統計機器學習方法(如支持向量機,樸素貝葉斯)[1-5]發展到現今的基于卷積神經網絡的物體檢測算法,物體檢測效果令人驚嘆.2014年,R.Girshick 等人將卷積神經網絡應用到物體檢測中,提出了基于區域的卷積神經網絡(R-CNN)算法[6],使得檢測效果遠遠優于當時的傳統物體檢測算法.隨后的Fast R-CNN[7]和Faster R-CNN[8]等都在檢測準確率和定位精度上不斷突破,而2015年Joseph Redmon 等提出的YOLO[9]算法和2016年Wei Liu 等提出的SSD[10]算法都是在算法速度上進行突破.在物體檢測算法不斷突破的同時,神經網絡架構也在不斷更新.
最早的卷積神經網絡LeNet[11]是Yann LeCun 在1998年設計并提出的,它一開始是針對識別手寫數字問題,網絡結構較為簡單,但是包含了卷積神經網絡的基本單元,是以后各種模型的始祖.2012年,在ImageNet比賽上大放異彩的AlexNet[12]雖然只比LeNe 多了幾層,但效果遠遠優于最早的LeNet,AlexNet 將激活函數由Sigmoid 換成了ReLU,解決了因為網絡層更深時的梯度彌散問題,還加入了dropout 層,有效解決過擬合問題.2014年出現的VGG[13]相較于AlexNet 而言網絡層越來越深,整個網絡層全部使用3×3 大小的小卷積核和2×2 的最大池化核,使得整個網絡結構簡潔,具有更好的泛化性.Network in Network[14]模型的亮點在于1×1 卷積核和全局平均池化層(Global Average Pooling)的應用,使得整個網絡模型的參數規模銳減,有利于網絡的加深,訓練時間也得到提升.2014年的GoogLeNet[15]中使用了基礎卷積塊Inception,最后的全連接層借用NiN 模型思想換成Global Average Pooling,整個模型的參數量大大減小,效果更好.2015年的ResNet[16]中包含了Residual 單元,允許原始輸入信息直接傳遞到后面的網絡層中,解決了因為網絡層過深而梯度消失,無法反向傳播的問題.2017年谷歌公司提出的MobileNets使用深度分離卷積[17],進一步減小計算量,壓縮模型,可以滿足嵌入式設備的需求.
隨著硬件計算能力的快速發展,深度學習技術已經應用到很多便攜式嵌入設備中,比如各種刷臉支付、相冊智能分類、圖片風格遷移等,但是目前一大挑戰是如何將龐大深度模型移植到資源有限的嵌入式設備上[18].
本文針對嵌入式設備進行的深度學習物體檢測優化算法研究主要在PC 端和嵌入式平臺ARM 上完成.首先,準備好訓練數據,選擇合適的物體檢測框架和神經網絡架構進行構建;然后在此網絡結構下,對訓練數據進行模型訓練,得出原始物體檢測模型;接著對原始物體檢測模型進行模型剪枝,以上過程都是在PC 端上完成.將PC 端上完成模型剪枝的物體檢測模型移植到嵌入式設備ARM 平臺上,針對該物體檢測模型的各個網絡層進行運算代價計算,根據計算結果,對運算代價較高的網絡層進行匯編優化.匯編優化后的物體檢測模型在ARM 平臺上對冰箱內采集到的視頻內容進行前向推理,在ARM 平臺上顯示檢測結果,上述過程在ARM平臺上完成,圖1為整個物體檢測優化算法的流程圖.
本文整體網絡架構選用MobileNets,MobileNets中的深度可分解卷積是將標準卷積分解成一個深度卷積和一個點卷積.
假設輸入F的維度為DF×DF×M,其中DF為輸入F的寬和高,M為輸入層的通道數.標準卷積時,卷積K的參數量表示為DK×DK×M×N,其中DK為卷積K的維度,N為輸出通道數,則此時的計算代價為C:

深度可分解卷積時,將標準卷積K拆分為深度卷積DK×DK×1×M和點卷積1×1×M×N,計算代價為C’:

將深度可分解卷積的計算代價C’與標準卷積的計算代價C相除,進行比較:

在ImageNet 數據集上,深度分離卷積的參數量約是標準卷積參數量1/7,而準確率只下降了不到1%[17].
深度分離卷積在網絡結構上的變化如圖2所示,將標準卷積拆分成深層卷積和點卷積,在每層卷積后面都有BN 層和激勵函數ReLU.

圖2 網絡結構變化
在物體檢測算法方面,R-CNN 系列都是物體定位和物體分類分開進行的物體檢測方法,雖然準確率很高,但是速度較慢;而YOLO 和SSD 則都是一步完成物體定位和物體分類,其中YOLO 的速度很快,但是準確率不盡人意,而SSD 綜合了Faster R-CNN 的高準確率和YOLO 的快速率優點,使得物體檢測方法更加適合應用在嵌入式設備上,故選擇SSD 作為本次面向嵌入式設備的深度學習物體檢測優化算法研究的物體檢測框架.
在PC 端上的模型剪枝流程圖如圖3所示.
首先,對MobileNets-SSD 網絡進行神經元重要性的評估,然后根據評估結果將其中最不重要的神經元置零,對部分神經元置零后的網絡進行微調,判斷微調后的網絡是否達到預定標準,如果達到預定的標準,則可以停止剪枝;如果未到到預定的標準,則需要重復神經元重要性評估、不重要神經元置零、微調等步驟.
本文在模型剪枝過程中采用了一種基于一階泰勒展開的新的神經元重要性評估準則[19].該準則中對神經元的評估公式為:

上式中,D表示訓練樣本集,W表示未修剪前的權重參數,W’表示修剪后的權重參數,C(D|W)為修剪后的代價函數,而C(D|W’)表示的是修剪后的代價函數,最優化的剪枝就是使得修剪后的代價函數C(D|W’)盡可能地逼近修剪前的代價函數C(D|W).將剪枝前后的代價函數差值賦值給|ΔC(hi)|,找出令式(4)中|ΔC(hi)|值最小的非零權重參數,將該參數置零,即完成一次剪枝.又因為C(D|hi)=C(D|(w,b)i),所以式(4)可以變換為式(5):

在式(5)中的C(D,hi=0)部分引入一階泰勒展開式,如式(6)所示:

其中,R1(hi=0)為高階項,因為ReLU 激活層中含有高階信息,同時為了避免復雜的計算,高階項R1(hi=0)可以忽略不計.

圖3 模型剪枝流程圖
綜合式(5)和式(6)可得式(7):

將特征圖看作變量的向量表示,當有M個變量時,剪枝前后的損失函數差值可表示為:

嵌入式設備主要由嵌入式處理器、相關支撐硬件和嵌入式軟件系統組成,而樹莓派是一款基于ARM 的微型電腦主板,是作為學習計算機編程的首選嵌入式設備.本文使用的是樹莓派3 B,它有1.2 GHz 和64 位處理器,滿足物體檢測模型匯編優化和前向推理的性能需求.
在該ARM 平臺上,通過對表1模型剪枝對比中各個網絡層的耗時比較,決定針對其中卷積層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 進行匯編優化,主要策略分為指令調整、寄存器分配和條件執行[20].

表1 模型剪枝對比(單位:ms)
(1)指令調整:通過展開循環對裝載指令進行人工優化,仔細安排裝載指令的時間次序,防止流水線終止.
(2)寄存器分配:限制局部變量的個數;把多個局部變量存放在一個寄存器中.
(3)條件執行:使用ARM 處理器特有的條件執行指令來減少判斷跳轉和分支等對流水線影響較大的操作.
通過以上策略最大程度地利用平臺資源,發揮處理器最大效能,來滿足物體檢測模型直接在嵌入式設備上快速前向推理的需求.
通過冰箱內的USB 攝像頭對總共76 種蔬菜水果飲料等冰箱常見食材進行訓練樣本采集,一共采集5 萬張圖片,最后挑選出45 488 張作為訓練樣本,如圖4所示.

圖4 訓練樣本

圖5 數據標注
利用網上標注系統對挑選出的訓練樣本進行數據標注,網上標注系統的界面如圖5所示,可以對物體進行種類選擇和位置定位.
訓練時采用MobileNets 作為本次實驗的基礎網絡架構,其中總共有35 層卷積層,在Conv_11、Conv_13、Conv_14_2、Conv_15_2、Conv_16_2 和Conv_17_2后進行物體檢測方法SSD 的分類器分類、位置回歸和錨框的生成.最后,將以上6 個卷積層生成的類別特征、位置特征和anchor box 信息進行concat、Softmax和flatten.MobileNets 的網絡層與本文的MobileNets-SSD 網絡層如表2所示.相比于MobileNets,本文的MobileNets-SSD 多8 層卷積層,且最后的平均池化層、全連接層和Softmax 變成了conf_reshape、conf_softmax 和conf_flatten.對訓練集進行訓練后,最終本文的MobileNets-SSD 模型的mAP 達到84.7%.

表2 MobileNets 與本文的MobileNets-SSD
MobileNets-SSD 完成訓練后進行基于一階泰勒展開的模型剪枝.控制裁剪的整體過程為:1)前向傳播2)獲取排序后的卷積窗口3)計算需要剪枝的卷積窗口個數4)裁剪.主要函數如下所示:
(1)forward
(2)compute_rank
(3)normalize_ranks_per_layer
(4)get_prunning_plan
(5)lowest_ranking_filters
其中函數(1)表示模型的前向傳播過程;函數(2)用在梯度更新時,其輸出的計算值用于卷積窗口排序;函數(3)是將每層的結果歸一化;函數(4)和函數(5)表示利用最小堆方法得到N個排名最低的卷積窗口.
完成一次剪枝后,進行模型微調和迭代.所有參數參與訓練與學習,重新訓練模型10 個迭代.
具體實驗時,N分別設置為512 和1024,此時每層網絡層耗時情況如表1模型剪枝對比所示.N為512 時,物體檢測模型的mAP 為85.1%;N設為1024 時,物體檢測模型的mAP 為82.3%.可以看出,N為512 時,物體檢測模型的mAP 有所提升;而N為1024 時,物體檢測模型的mAP 有所下降,說明N設置為512 時,模型剪枝后的物體檢測模型復雜度更為適合本次實驗訓練數據集和測試數據集,前向推理效果更好.
所以,綜合表1模型剪枝對比中N為512 和1024 時的耗時情況以及相對應的物體檢測模型的mAP 值,本實驗選擇針對N為512 的模型剪枝后的MobileNets-SSD 物體檢測模型進行匯編優化.經過模型剪枝后的MobileNets-SSD 模型體積由23.1 MB 縮減為20.8 MB,模型體積減小9.96%.
由表1模型剪枝對比可知,物體檢測模型中卷積層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 無論是模型剪枝前還是模型剪枝后,耗時都比較久.我們通過指令調整、寄存器分配和條件執行等手段對模型剪枝前和模型剪枝后的耗時多的網絡層分別進行匯編優化.主要應用到的是NEON 技術,它是ARM 處理器的128 位SIMD 架構擴展,旨在為消費性多媒體應用程序提供靈活、強大的加速功能.它具有32 個64 位寄存器和16 個128位寄存器.寄存器的具體調用代碼如下所示:
(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 后面的字符串表示該宏的名稱,在后續的調用中可以直接利用該宏來替代內部的具體實現代碼.代碼(13)行的.end 為宏的載止位置.
代碼(2)-(5)行為數據加載指令,其中A0 表示矩陣起始地址,B0 為右矩陣的起始地址,兩者均為地址寄存器.vldl,32 指令的調用可以將數據按照32 位為一個數據單位的順序加載到NEON 寄存器當中,數據的連續性能夠減少指令的訪存時間.
代碼(6)-(9)行為結果矩陣第一列的計算過程,vmla.f32為乘加指令.
代碼(10)行表示其他幾列的計算方式.
代碼(11)-(12)行將寄存器當中的結果矩陣的值存儲到內存當中,當存儲位置是連續的情況下,指令的訪存將同樣是連續的,減少數據存儲所需時間.
匯編優化后的結果如表3匯編對比所示.
由表3匯編對比可知,模型剪枝后的MobileNets-SSD 模型前向推理速率相較于未進行模型剪枝時的速率加快了1.16 倍,而匯編前后模型的mAP 無變化;又結合表1模型剪枝對比和表3匯編對比,經過模型剪枝和匯編優化的MobileNets-SSD 模型前向推理速率相較于原始模型加快了8.82 倍.
本文還選擇其他兩個前向推理框架進行了對比,使用的都是剪枝之后的網絡模型,如表4所示.Mini-Caffe 是對Caffe 的前向推理版本,匯編優化比較少,Ncnn 是騰訊開發的帶匯編優化的前向推理框架,做了比較深度的匯編優化.與它們相比,本文最終的前向推理時間是最低的.

表3 匯編對比

表4 與其他框架的對比
在ARM 平臺上的前向推理時,測試樣本檢測結果如圖6所示.
部分物體未被檢測的原因有以下幾點:
(1)遮擋物過多,未能檢測到整個物體;
(2)離USB 攝像頭太遠,暴露面積太小;
(3)只暴露物體部分特征,前向推理困難等.
前期的訓練樣本的選擇對最后嵌入式設備上物體檢測模型的前向推理檢測結果有一定影響.整體效果較為理想.

圖6 檢測結果
本文選擇了合適的物體檢測框架SSD 和神經網絡架構MobileNets,訓練出一個滿足嵌入式設備需求的物體檢測模型,并通過模型剪枝對該物體檢測模型進行優化,在移植到ARM 平臺上之后又進行匯編優化,進一步加快前向推理速率.在準確精度和模型大小方面還可以有進一步的研究:
(1)MobileNets V2 的準確率和速率都有提高,可以在此網絡結構上進行物體檢測算法優化.
(2)因為模型中參數的存儲精度為32 位的浮點數,可以在ARM 平臺上針對模型參數進行量化,更大程度地壓縮模型,加快前向推理速率.