張利紅,蔡敬菊
(1.中國科學院 光電技術研究所,四川 成都 610209;2.中國科學院大學,北京 100049)
目標檢測是計算機視覺的重要研究領域之一,要求能對圖像中的目標位置進行精準定位、種類精確識別。隨著深度學習和智能互聯技術的發展,將目標檢測算法應用至終端的需求不斷增強,但受限于嵌入式設備的內存和算力資源,參數量多、結構復雜的模型部署時的計算開銷和通信耗時是個亟待解決的問題。
近年來,對模型進行輕量化改進主要分為兩類:網絡結構壓縮、權重數值壓縮。前者以SqueezeNet[1]、MobileNet[2]、ShuffleNet[3]等輕量化模型結構系列為代表,后者中網絡減枝和量化是應用最廣泛的兩種方法。
自2012年以后,基于深度學習的目標檢測算法成為主流研究方向,并分為單階段和雙階段兩類。雙階段檢測算法以R-CNN[4-5]系列為代表,需要先獲取目標區域隨后進行候選框的選取,檢測精度較高的同時計算量大又比較復雜;不適合進行終端部署。單階段檢測算法以Yolo[6-9]系列為代表,將候選區域生成階段省略掉,直接將檢測任務視為回歸問題進行端到端的檢測,檢測速度和精度相對其他深度目標檢測算法在嵌入式設備上進行部署更占優勢。
Rk3399pro是福州瑞芯微電子開發的專門針對終端推理的國產AI芯片,芯片架構采用大小核處理器內嵌NPU神經網絡處理器的方案換取高性能、低功耗和高擴展性,兼具高速總線PCIE和超強的視頻編解碼能力,以上特點使其適用于目標檢測算法部署。
該文以Yolov5s算法為模型結構基礎,對其Backbone特征提取層使用mobilenetv2[10]進行替換,并通過網絡模型稀疏化獲得縮放因子,根據縮放因子的分布對卷積核做重要性排序,并考慮到Rk3399pro芯片架構特點進行卷積通道數裁剪約束。其次通過對減枝后的模型通過將32位浮點數據進行非對稱8位量化減少權重參數,并充分考慮到平臺的多核處理器資源,使用CPU-GPU-NPU多線程協同計算。對圖像前后處理和硬件推理時間模糊后,實現了實時的魯棒目標檢測系統。
Yolo系列算法將檢測任務統一為回歸問題,省去Region proposal階段,直接可從一張圖像中預測出bouning box的坐標及目標各類別概率。
Yolov5是由Uitralytics公司發布的單階段算法,基于pytorch訓練而成,并按模型大小排序為yolov5x、yolov5l、yolov5m、yolov5s四個模型,其中v5s網絡模型相較于yolov1-v4系列,在檢測精度相仿的基礎上,實現了寬度深度、權重參數更小,更適合部署至嵌入式平臺中。
Yolov5可以分為Input輸入端、Backbone、Neck、Head輸出端四個部分,如圖1所示。Yolov5在Input輸入端對圖像進行自適應填充預處理,對不同數據集自適應計算anchor大小,并采用Mosaic數據增強的方法,將四張圖片進行隨機非對稱縮放、裁剪和排布組合,實現對目標樣本大小和背景豐富;同時Yolov5相比v4增加了正樣本的anchor數目,顯著增加訓練速度,減少收斂時間。Backbone中的focus模塊主要用于將輸入的圖片數據進行切片,即將原本圖像的高、寬轉化為了特征信息通道,對矩陣進行卷積后就得到了下采樣的特征圖,從而減少前向計算中特征提取的時間花銷。Backbone中主要分為瓶頸跨階段局部結構BottleneckCSP和空間金字塔池化模塊SPP,實現了對不同尺度的特征提取。其中Neck中采用了特征金字塔FPN自底向上傳遞語義特征,與路徑聚合結構PAN自上向下傳遞位置特征相結合。Neck實現不同網絡層的信息融合,在Head輸出端可實現更精準的預測。
Yolov5中的Focus模塊在平臺部署的時候并不能帶來更高的精度提升,甚至略微增加了模型參數量,于是用Conv卷積模塊進行替代。同時將Backbone中復雜的BottleneckCSP模塊替換為MobileNetv2。
MobileNetv1使用深度可分離卷積的堆疊替代標準卷積,其包括深度卷積和逐點卷積兩部分,可在同等卷積輸入下減少模型參數量和計算開銷。
假設標準卷積與深度可分離卷積的輸入特征圖寬為Wc、高為Hc、卷積核數為M、通道數為N,輸出特征圖大小為Wo×Ho×N,如圖2所示。而深度卷積在標準卷積的基礎上將卷積核數改為1后,并與送入1×1逐點卷積模塊后的卷積結果相加。兩者的計算和參數量相比均如式(1)所示:
(1)
Mobilenetv2在其基礎上除了沿用深度可分離卷積外還加入了Expansion layer和線性連接的Bottleneck layer,分別實現高維特征與低維特征之間的映射,模型體積僅為mobilev1的1/4。該文將原yolov5s的特征提取層中的BottleneckCSP替換后,可實現網絡結構輕量化。
網絡減枝被廣泛應用于卷積網絡壓縮中,可以有效地降低網絡復雜度和緩解過擬合,并提高前向推理速度。基于卷積核的結構化減枝指從卷積核層面進行考慮,在初始時正常訓練網絡,隨后將權重鏈接低于判斷閾值的卷積核或通道進行移除,最后對稀疏后的網絡進行微調即可在輕微損失精度時獲得輕量化模型。
在對卷積核重要性的判斷中,Li等[11]使用卷積核權重的L1范數值作為判斷標準,He[12]則以卷積核的非零權重值個數及L0范數為標準進行判斷。Ye[13]則考慮到了較小范數對提取特征準確度的影響,Hu[14]則以卷積核權重的稀疏程度排序作為減枝標準。此外還有些學者研究通過集成減枝的方法,綜合多種參數排序依據進行模型減枝[15-16]。
該文對網絡BN層中可學習的參數進行L1正則化稀疏訓練,得到接近0的稀疏縮放因子,并采用L1范數對卷積核重要性進行評價的方式進行減枝,流程如圖3所示。即按照遞減順序將每個卷積層的濾波器矩陣絕對值總和排列,設定一個閾值將低于此閾值的卷積核去除。
為了避免單一閾值參數的評價方式造成誤減、結構通道數發生巨變或檢測精度下降過多,并且考慮到嵌入式平臺MAC硬件單元對優化模型加速時對卷積通道數要求最好為3的倍數,在剪枝時設計判斷函數(如式(2)),進一步抑制減枝通道數范圍。
(2)
其中,N表示網絡減枝后的通道數,x表示原網絡卷積核通道數,f(x)表示經減枝后小于x且是9的倍數的最大值。
模型量化指將32位浮點運算轉化為定點計算,可以有效壓縮參數、降低內存占用,但也會略微降低檢測精度。目前常用的量化方法分為三類:二三值化、線性量化以及對數量化。二三值化過于簡單的位運算操作會帶來極大的精度損失,而對數運算將同底的冪指數相乘的復雜操作不利于AI芯片底層加速實現。因此該文考慮使用線性量化中非對稱和對稱量化兩種方案驗證擇優選取。
根據近幾年的量化模型研究8位量化能夠盡量在損失精度較小的情況下實現模型大小的壓縮,并分為對稱量化和非對稱量化兩種。根據谷歌對量化研究的白皮書指導可知,對大部分網絡而言非對稱(unit8)量化對網絡精度損失最小[17]。其二者區別在于計算公式中是否存在零點值的漂移,同時還根據不同網絡權重參數值在壓縮后的分布相關。因此,該文分別對兩種量化方式都進行精度損失測驗。
兩種量化方式屬于32位浮點數據映射到8位定點的不同計算方式,區別在于是否存在零點值Z的偏移。
(3)
其中,xf表示輸入的float32類型數據,n表示量化后數據的bit位數,Q表示量化后數值。
對模型采用不同的量化方式可以發現(見圖4),使用8位定點量化的模型大小將減至量化前的1/4,將FP32的浮點數張量轉化為unit8張量,有助于減少內存帶寬和存儲空間,并進一步提高系統吞吐量,降低系統延時。
實驗選擇目標檢測常用的PASCAL VOC數據集進行訓練,包括常見的vehicle、household、animal、person四個大類及20個小類。檢測目標樣本豐富,特征背景不一,可用于訓練測試在不同環境需求下的深度目標檢測算法。對數據集中少部分標注不清或目標重疊或較小的圖片進行篩選和數據增強操作。
未移植前模型以pytorch為框架,訓練硬件環境設置為GPU:RTX 2060 SUPER,CPU:i5-10400,內存16 G;python:3.6;CUDA10.1,cuDNN7.6.5,opencv:3.4.5;移植后以RKNN為框架,嵌入式設備:Rk3399pro。在PC機上安裝交叉編譯環境,通過ssh協議遠程登錄到板端,將在PC端編寫的程序用CMake工具編寫Cmakelist.txt配置文件實現跨平臺的編譯和管理。在pycharm上進行python代碼的編寫訓練,在VScode進行C++程序的部署落地。
評價模型精確度指標采用mAP(mean average precision),其由模型訓練中每一類檢測目標的精確率(Precision)對應的召回率(Recall)在0至1的范圍內進行積分后求和,再除以總的檢測目標類別數得到。
(4)
其中,TP表示檢測目標被模型正確識別為正例的個數,FP表示被模型錯誤識別為正例的個數,FN表示被錯誤識別為負例的個數,N值為20。
為防止單次模型訓練中存在的誤差,文中數據均是經過五次平均后的結果。
在原yolov5s的網絡結構上進行輕量化改進,輸入圖像大小為416×416,分別就替換特征提取網絡、網絡減枝、量化后的網絡與原網絡進行性能對比。在PC端的模型對比為Pytorch框架下,在Rk3399pro端的對比在RKNN框架下,從pt模型轉換為RKNN模型需要模型訓練的框架版本及神經網絡op算子能被RKNN Toolkit識別進而才能被硬件支持,而原yolov5s導出的pt模型并不滿足條件。RKNN模型開發應用流程如圖5所示。
在原版yolov5s模型基礎上,通過更改模型訓練框架版本、使用常規op替換特殊op算子以及編寫能被硬件支持的op算子解決硬件支持問題后,且未進行文中的模型輕量化改進直接導出的模型標注為yolov5s.RKNN。
由表1中數據可見,與原yolov5s.pt模型相比,改進特征提取網絡和進一步剪枝后的模型在PC端的推理耗時大幅減少,檢測速度從140 fps/s提升至370 fps/s,模型精度在參數量降低了17.1%的基礎上損失了6.74%。而將兩種離線模型轉換為Rk3399pro支持的RKNN框架下進行部署后,論文提供了無量化、非對稱及對稱8位量化三種不同精度和運行速度的模型方案,供不同檢測性能需求的應用場景下進行選擇。其中對稱與非對稱8位量化模型參數量大小相同時,非對稱8位量化對yolov5s及文中模型均損失精度更低。

表1 不同模型性能對比
文中模型檢測精度mAP值略微低于yolov5s.RKNN,但在理論檢測速度上從18.6 fps/s大幅提升至50 fps/s。在一些要求檢測速度的特殊應用場景下,采用文中輕量化方案會更加合理,對于存在的精度損失問題,實驗中對較小或遮擋的目標也能有所檢測。
該文主要針對yolov5s在輕量化部署方向上進行探索改進,yolo其他系列算法采用Darknet網絡框架構建訓練而成,在檢測不同特征樣本的數據集時,可能相較yolov5s的適配性更高。為探索不同算法的部署效果,驗證提出的改進方案具有一定的普適性,對yolov2-v4系列在數據預處理后的KITTI數據集訓練,并同樣進行輕量化實驗,結果如表2所示。

表2 改進yolo系列輕量化模型前后檢測效果對比
由表2可見,對yolo系列而言,采用文中改進方式均可實現在Rk3399pro上進行輕量化部署,為后續進一步探索其他改進方法提供了理論和數據支持。
對算法網絡進行輕量化改進后,在實際部署至終端時需要考慮最大化利用硬件設備資源,以減少圖像數據傳輸和推理中不必要的耗時。在Rk3399pro采用CPU-GPU-NPU多線程協同計算方案(見圖6)優化算法運行速度[18],即:(1)圖像獲取與預處理;(2)數據推理;(3)數據后處理與顯示。
以上三種分支結構中計算復雜度最高的就是數據推理,數據推理中的卷積計算占到整個目標檢測系統90%的計算量應交由NPU工作。其余兩個分支結構都與圖像處理相關交由GPU實現。而CPU則負責系統調度,協調各個預算單元降低GPU功耗和NPU負載。
在開發測試過程中發現,NPU專注推理加速時整個模型推理過程耗時將極小,而圖像預處理和后處理時間較長。該文將利用兩個CPU大核分時復用NPU對GPU預處理的圖像數據進行加速推理,隨后CPU小核調用GPU進行數據后處理和顯示。
實驗證明使用8位量化后的Our mobilenetv2-yolov5s模型在Rk3399pro的理論推理性能達到50幀/s,比不進行網絡結構輕量化的8位量化yolov5s.RKNN模型的基礎上提升了近1.7倍。
為比較Rk3399pro同其他國產AI芯片平臺在目標檢測算法部署上的性能差異,同時考慮到不同國產平臺的AI算子支持和軟件開發環境差異,僅對yolov3 tiny模型進行部署,檢測速度數據比較如圖7所示。
由圖7可知,雖然不同AI芯片存在算力、軟硬件開發環境差異,但Rk3399pro由于相對而言在硬件加速的適配效果較好,對yolo系列算法而言還是比較適合做目標檢測算法應用的嵌入式平臺之一。
以yolov5s算法為基礎,使用MobileNetv2替換Backbone特征提取層中的BottleneckCSP結構、Conv替換Focus模塊達到網絡輕量化。針對Rk3399pro芯片結構特點對卷積核通道數約束后基于L1范數進行稀疏減枝,并對比了不同量化方式后模型差異,驗證文中算法采用非對稱8位量化精度損失更低、檢測速度相較原模型更快。為證明算法改進的普適性,對Yolo其他系列算法同樣進行實驗;為證明采用Rk3399pro平臺部署的合理性,對其他國產AI平臺也進行相關實驗比較。可知在使用文中模型輕量化、c++部署、多核并行等改進后,能在Rk3399pro上實現實時的目標檢測系統。