黃靖淞,左顥睿,張建林
(1.中國科學院光電技術(shù)研究所,成都 610209;2.中國科學院大學 計算機學院,北京 100049)
近年來,卷積神經(jīng)網(wǎng)絡(luò)被廣泛地應(yīng)用到計算機視覺、自然語言處理等領(lǐng)域,各種新的檢測算法被不斷提出,然而設(shè)計的深度學習模型多數(shù)是為了追求更高的精度[1]和更好的性能,而忽略了模型的大小和推理速度。
在目標檢測領(lǐng)域,REDMON 等提出了YOLOv1[2]、YOLOv2[3]、YOLOv3[4]系列算法。因其在速度和精度之間實現(xiàn)了較好的權(quán)衡,而引起了學術(shù)界和工業(yè)界的廣泛關(guān)注。以Faster R-CNN[5]為代表的雙階段網(wǎng)絡(luò)先生成候選區(qū)域,再提取特定的特征進行目標檢測,雖然精度較高,但計算復雜度也很高,難以在有限算力的情況下實現(xiàn)實時檢測。以YOLO 為代表的單階段目標檢測算法將生成候選區(qū)和檢測合二為一,直接得到最終的檢測結(jié)果,使得網(wǎng)絡(luò)結(jié)構(gòu)變得簡單,檢測速度較Faster R-CNN 有近10 倍的提升,這使得深度學習目標檢測算法滿足實時檢測條件成為可能。
MobileNet 是由谷歌在2017 年提出的,是一款專注于在移動設(shè)備和嵌入式設(shè)備上的輕量級卷積神經(jīng)網(wǎng)絡(luò),并逐步發(fā)展為MobileNetv1[6]、MobileNetv2[7]、MobileNetv3[8]3 個版本。相比于傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò),在準確率小幅降低的前提下,大幅減小了模型參數(shù)和運算量,其中最重要的創(chuàng)新是提出了深度可分離卷積,用深度可分離卷積替換標準卷積可以減少計算量和參數(shù)量,提升前向推理速度。
另外,網(wǎng)絡(luò)剪枝也是網(wǎng)絡(luò)壓縮和加速中一個重要的方向,剪枝就是去除網(wǎng)絡(luò)中一些不重要的神經(jīng)元,大幅降低了計算量和權(quán)重數(shù)量,提高了網(wǎng)絡(luò)運行效率[9]。目前剪枝主要分權(quán)重剪枝和濾波器剪枝兩種。濾波器剪枝相對于權(quán)重剪枝具有一系列優(yōu)點,包括它可以得到規(guī)則的模型、減少內(nèi)存消耗、加速網(wǎng)絡(luò)推理等。
本文在YOLOv3 目標檢測算法的基礎(chǔ)上,使用輕量級的Mobilenet 基礎(chǔ)網(wǎng)絡(luò),將深度可分離卷積替換為標準卷積,并在此基礎(chǔ)上對網(wǎng)絡(luò)進行剪枝,以在不損失檢測精度的情況下提升檢測速度。
YOLOv3 網(wǎng)絡(luò)以Darknet53 網(wǎng)絡(luò)為backbone,因其有52 個卷積層外加1 個全連接層,所以命名為Darknet53。其中卷積層是由1×1 和3×3 的卷積層組成,每個卷積層后都會有1 個BN 層和1 個LeakyReLU 層。YOLOv3 主體是由許多殘差結(jié)構(gòu)[10]組成,減少了梯度爆炸的風險,加強了網(wǎng)絡(luò)的學習能力,Concatenate 層用于將當前層的多個輸入進行拼接,UpSample 層表示上采樣,每進行一次上采樣操作,輸出特征層就擴大1 倍。YOLOv3 預(yù)測的3 個特征層大小由淺到深分別是輸入特征圖的1/32、1/16、1/8,對3 個不同尺度的特征圖進行檢測,因而實現(xiàn)了多尺度檢測[11]。另外由于淺層網(wǎng)絡(luò)提取到的邊緣、紋理等幾何特征較多,感受野較小,對小目標敏感,而深層網(wǎng)絡(luò)提取到的語義信息較多,感受野較大,對大目標敏感,所以淺層輸出適合檢測小型目標,中層輸出適合檢測中型目標,最深層輸出適合檢測大型目標。每個預(yù)測的輸出可以表示為S×S×3×(5+類別數(shù))。YOLO 將圖像劃分為S×S的網(wǎng)格,當目標中心落在某個網(wǎng)格中時,即用該網(wǎng)格去檢測,另外每個網(wǎng)格需要檢測3 個尺度的anchorbox,5 表示的是(x,y,w,h)以及置信度5 種位置信息。最后3 個輸出經(jīng)過非極大抑制[12]得到最終的坐標信息和類別的預(yù)測值。YOLOv3 算法網(wǎng)絡(luò)結(jié)構(gòu)如圖1 所示。
圖1 YOLOv3 算法網(wǎng)絡(luò)結(jié)構(gòu)Fig.1 Network structure of YOLOv3 algorithm
本文借鑒了Mobilenetv1 網(wǎng)絡(luò)深度可分離卷積的思想[13],將YOLOv3 的backbone 由Darknet53 替換為Mobilenetv1,并將YOLO head 網(wǎng)絡(luò)中的部分3×3標準卷積替換為深度可分離卷積,深度可分離卷積包括深度卷積和逐點卷積兩部分[14],其在盡量提取特征的同時減少了計算量。標準卷積和深度可分離卷積的結(jié)構(gòu)如圖2 所示。
圖2 標準卷積和深度可分離卷積結(jié)構(gòu)Fig.2 Structure of standard convolution and depthwise separable convolution
假設(shè)輸入的特征圖大小為Wi×Hi×C,分別代表輸入特征圖的寬、高、通道數(shù),標準卷積大小為Wc×Hc×C×N,分別代表標準卷積的寬、高、通道數(shù)、濾波器個數(shù),輸出特征圖大小為Wo×Ho×N。那么標準卷積的計算量如下:
相應(yīng)的深度可分離卷積是用Wc×Hc×1×C(分別表示寬、高、通道數(shù)、組數(shù))的卷積先進行逐通道卷積,再用1×1×C×N的卷積進行逐點卷積,其計算量如下:
兩者之比為:
Amount(dw)/Amount(Conv)=1/N+1/(Wc×Hc)
若輸入3×608×608 的特征圖,經(jīng)過256×3×3×3的卷積核,那么計算量的比值為1/256+1/(3×3),也就是說將標準卷積替換為深度可分離卷積后,計算量會減少8~9 倍。
基礎(chǔ)網(wǎng)絡(luò)Mobilenetv1 輸入為1×3×608×608 的圖片,網(wǎng)絡(luò)參數(shù)如表1 所示。網(wǎng)絡(luò)包括1 層標準卷積,后面接13 層深度可分離卷積,每1 層卷積后都跟1 個Batch_norm 層 和Relu 層。其中,Conv3_2、Conv4_2、Conv6 層深度可分離卷積的3 個輸出分別作為YOLO_head 網(wǎng)絡(luò)部分的3 個輸入,另外YOLO_head 網(wǎng)絡(luò)中只包含1×1 和3×3 的卷積,將其中部分3×3 卷積也改為深度可分離卷積。表1 是Mobilenetv1 的網(wǎng)絡(luò)結(jié)構(gòu)。
表1 Mobilnetv1 網(wǎng)絡(luò)結(jié)構(gòu)Table 1 Structure of Mobilenetv1 network
網(wǎng)絡(luò)剪枝的目的是減掉對檢測結(jié)果貢獻不大的網(wǎng)絡(luò)層,以提升前向推理的速度[15],由于大量的運算量都在卷積層部分,因此本文主要討論對卷積層濾波器個數(shù)的剪枝,對于某一層卷積層,對其所有filter進行重要性排序,將排在后面不重要的filter減掉,這樣能在減少整體運算量的同時,對檢測精度沒有太大影響。
對濾波器重要性排序的方法如下:
1)以filter 非零權(quán)重值的個數(shù)為基準進行排序,即權(quán)重L0 范數(shù)[16]。
2)對filter 每個權(quán)重值求絕對值之和進行排序,即權(quán)重L1 范數(shù)[17]。
3)基于幾何中心的卷積核剪枝方法FPGM[18]。
L0范數(shù)以當前卷積層的每個濾波器矩陣非零元素個數(shù)為排序依據(jù),非零元素個數(shù)越多就越重要,對檢測結(jié)果的貢獻也越大。L1范數(shù)以當前卷積層的每個濾波器矩陣元素絕對值之和為排序依據(jù),絕對值之和越大,該濾波器就越重要。文獻[18]提出了基于幾何中心的濾波器評價指標FPGM(Filter Pruning via Geometric Median),認為很多方法都是基于“較小范數(shù)不重要”的準則進行剪枝,其有效性依賴于2個要求:卷積核的范數(shù)值分布偏差必須大,即方差大;卷積核中的最小范數(shù)必須足夠小。為解決在不滿足上述2個要求的情況下也能壓縮網(wǎng)絡(luò),該方法的思想是計算每個filter與其他所有filter的歐式距離之和作為得分,得分越低表示該濾波器信息跟其他濾波器重合度越高,可以用其他濾波器替代該濾波器。
本文依據(jù)L1 范數(shù)對濾波器進行重要性排序,只對YOLO_head 網(wǎng)絡(luò)進行剪枝,保持基礎(chǔ)網(wǎng)絡(luò)Mobilenetv1的完整性。剪枝率取0.1~0.9、步長為0.1 的一系列剪枝比率,然后對所需要剪的每一層卷積層按不同剪枝率進行剪枝,分析不同剪枝情況下檢測精度的損失情況,并繪制敏感度曲線。卷積層敏感度曲線如圖3 所示,如果曲線上升很快,則表示當前卷積層比較敏感,如果剪枝率過大會有較大的精度損失,否則如果曲線上升平緩,則表示該卷積層對檢測結(jié)果的貢獻不大,可以采用較大的剪枝率。據(jù)此對于給定的可接受的精度損失來確定每個層的剪枝率。
圖3 卷積層敏感度曲線Fig.3 Sensitivity curve of convolution layer
從圖3 可以看出,某些卷積層比如yolo_block.0.0.1_sep_weights、yolo_block.0.1.1_sep_weights、yolo_block.0.tip_sep_weights等層上升曲線很快,對檢測結(jié)果的貢獻很大,所以只剪很少比例的filter數(shù)目,而對于例如yolo_block.2.1.1_sep_weights、yolo_block.2.2.conv.weights、yolo_block.2.tip_sep_weights等層,當剪枝率達到0.9 時也幾乎不丟失精度,本文實驗以剪枝率0.7 作為剪枝上限。
對于標準卷積(Conv)和逐點卷積(sep),給定剪枝率后,其filter 的個數(shù)會相應(yīng)減少,而深度卷積(dw)的組數(shù)等于輸入特征圖的通道數(shù),所以不需給出剪枝率,其組數(shù)會隨上一層卷積層濾波器的個數(shù)而變化。表2 是剪枝前后YOLO_head 的網(wǎng)絡(luò)結(jié)構(gòu)。
表2 剪枝前后YOLO_head 網(wǎng)絡(luò)結(jié)構(gòu)Table 2 YOLO_head network structure before and after pruning
本文實驗訓練平臺是遠程云端GPU Tesla V100,顯存16 GB,推理部署平臺是英偉達嵌入式GPU Jetson TX2,該平臺擁有256 顆Pascal 架構(gòu)CUDA 核心,6 顆CPU 核心[19-20]。所用訓練集和測試集來自VOC2007、VOC2012,模型的評估指標mAP。所使用深度學習框架為百度飛槳Paddle[21]框架、PaddleSlim 壓縮框架以及Paddle Inference C++推理預(yù)測庫,并用CMake 管理項目文件,CMake全稱為Cross platform Make,是一個跨平臺的構(gòu)建系統(tǒng),可以編寫一個與平臺無關(guān)的CMakeLists.txt 文件定制整個編譯流程,然后再進一步生成所需的Makefile 和工程文件[22]。使用pycharm 作為python 集成開發(fā)環(huán)境,clion 作為C++開發(fā)環(huán)境。
在進行訓練時,與預(yù)訓練模型相匹配的層直接加載該部分網(wǎng)絡(luò)的參數(shù),不匹配的部分則讀取程序中定義的網(wǎng)絡(luò)結(jié)構(gòu)。訓練的最大batch 數(shù)設(shè)置為28 萬,batch_size 為16,初始學習率為0.000 5,在batch 數(shù)為11 萬和12.4 萬的地方學習率變?yōu)橹暗?.1 倍。
表3 是在Tesla V100 顯卡上進行測試的結(jié)果,可以看出在YOLOv3_MobileNetV1 網(wǎng)絡(luò)基礎(chǔ)上,將YOLO_head 網(wǎng)絡(luò)部分卷積改為深度可分離卷積之后再進行剪枝,在幾乎不損失精度的前提下,使得FPS 分別提升了25.9%和40.8%。實驗結(jié)果表明:單純增大batch_size 后速度并不一定會比減小batch_size 快,并且GPU 利用率也會明顯增加,這可能跟CPU 與GPU 之間的數(shù)據(jù)傳輸、硬盤的讀寫速度等因素有關(guān)。
表3 Tesla V100 測試結(jié)果Table 3 Test results of Tesla V100
如果將訓練好的模型用到實際工程中,需要在一些嵌入式硬件平臺進行部署,以達到項目落地的效果。將訓練好的模型導出為推理模型,并在嵌入式GPU TX2 平臺以C++進行前向推理,并用CMake管理頭文件和庫文件。除Paddle 本身的依賴庫之外,還用到了第三方開源庫gflags,gflags 是Google的一個命令行參數(shù)處理的開源庫,用于將命令行參數(shù)傳入到程序中,另外還有yaml-cpp 開源庫,用于對yaml 文件的讀取,兩者也都是用CMake 來進行構(gòu)建和編譯的。在TX2 上的部署流程如圖4 所示,首先通過命令行判斷讀取磁盤圖片或者板載攝像頭讀取視頻幀,然后進行目標檢測,最后將檢測結(jié)果進行顯示,并不斷重復。
圖4 TX2 推理流程Fig.4 TX2 inferential procedure
表4 是在嵌入式GPU TX2 平臺上的測試結(jié)果,計算4 952 張VOC 測試數(shù)據(jù)集的網(wǎng)絡(luò)前向推理幀率。YOLOv3_MobileNetV1 的幀率是5.0 frame/s,將YOLO_head 網(wǎng)絡(luò)中部分卷積層改為深度可分離卷積后的幀率為9.6 frame/s,在此基礎(chǔ)上進行剪枝后幀率達到了12.0 frame/s,分別實現(xiàn)了1.92 倍和2.4 的加速,模型規(guī)模分別減小了67.9%和78.5%,有效提升了嵌入式設(shè)備上目標檢測的推理速度。這是在盡可能不丟失精度的前提下的實驗結(jié)果,如果實際情況對速度有更高的要求,則還可以提高剪枝率,進一步加速前向推理。
表4 TX2 測試結(jié)果Table 4 TX2 test results
本文在YOLOv3 目標檢測算法的基礎(chǔ)上,采用輕量級的Mobilenet 分類網(wǎng)絡(luò)作為backbone,并將深度可分離卷積替換YOLO_head 網(wǎng)絡(luò)部分標準卷積,在此基礎(chǔ)上通過L1 范數(shù)對卷積層filter 打分,并以此作為排序依據(jù)對網(wǎng)絡(luò)做剪枝。測試結(jié)果表明,改進算法在檢測精度丟失很少的前提下,較大地提高了算法的檢測速度,并實現(xiàn)了算法在嵌入式平臺上的部署。由于該算法具有通用性,下一步將研究算法在其他不同平臺的部署,以實現(xiàn)諸如手機移動端等硬件平臺的目標檢測。