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