張利紅 吳柔莞 蔡敬菊
1.中國科學(xué)院光電技術(shù)研究所 四川 成都 610209;2.中國科學(xué)院大學(xué)電子電氣與通信工程學(xué)院 北京 100049
隨著物聯(lián)網(wǎng)、5G應(yīng)用的發(fā)展,終端的目標(biāo)檢測算法落地需求不斷增強(qiáng)。自2012年以來,以AlexNet[1]網(wǎng)絡(luò)為代表的深度學(xué)習(xí)算法成為研究主流;2013年Girshick提出基于區(qū)域卷積網(wǎng)絡(luò)的RCNN框架獲得更好的特征提取能力[2],隨后在RCNN框架上誕生了SPPNet[3]、Faster-RCNN[4];近兩年Joseph Redmon[5-7]等人提出的YOLO系列算法解決了不同尺度的目標(biāo)檢測問題,基本上保證檢測的實(shí)時性。但基于深度學(xué)習(xí)的目標(biāo)檢測算法參數(shù)量過大和網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜,受限于終端設(shè)備的硬件資源無法直接運(yùn)行未經(jīng)優(yōu)化的模型[8-10]。為了盡量減小在嵌入式平臺上實(shí)際應(yīng)用中的功耗和性能開銷,嵌入式系統(tǒng)上部署目標(biāo)檢測算法需要從核心算法和硬件開發(fā)平臺兩方面進(jìn)行選取。
在硬件平臺方面,長期以來國外廠商在芯片的研發(fā)應(yīng)用上占據(jù)優(yōu)勢,國內(nèi)嵌入式設(shè)備的開發(fā)環(huán)境尚不完備。當(dāng)前科研常用設(shè)備也多為ARM的big.LITTLE系列,Xilinx的FPGA或NVIDIA的Jetson TX1、TX2系列。為發(fā)展自主可控的技術(shù)平臺,在國產(chǎn)嵌入式平臺進(jìn)行深度學(xué)習(xí)算法的部署落地也成為重要的課題[11-12]。rk3399pro是瑞芯微電子開發(fā)的專門針對AI終端推理的國產(chǎn)芯片,采用大小核處理器內(nèi)嵌NPU神經(jīng)網(wǎng)絡(luò)處理器的方案換取高性能、低功耗和高擴(kuò)展性,兼具高速總線PCIE和超強(qiáng)的視頻編解碼能力。以上特點(diǎn)使其適用于目標(biāo)檢測領(lǐng)域,2020年6月山東大學(xué)的丁月[13]利用Yolov3 tiny在640*480的圖像中實(shí)現(xiàn)30幀/秒的檢測速度。
近年學(xué)者在算法方面主要提出兩種方案:一是從算法結(jié)構(gòu)進(jìn)行改進(jìn),采用可分離卷積、分組卷積等方式降低參數(shù)量和計算成本。這類方案以谷歌提出的MobileNet[14]、斯坦福提出的SqueezeNet[15]為代表。二是對已有模型進(jìn)行剪枝壓縮剔除對檢測效果影響較小的參數(shù)結(jié)構(gòu),比如8位定點(diǎn)量化、模型蒸餾等。兩者衍生的大量改進(jìn)的輕量化神經(jīng)網(wǎng)絡(luò)部署到終端設(shè)備上的檢測精度已基本達(dá)到標(biāo)準(zhǔn),但如何針對特定平臺的進(jìn)行算法改進(jìn),以更少的資源占用率實(shí)現(xiàn)檢測速度和精度的平衡尚未被系統(tǒng)研究[16-19]。
目前關(guān)于深度學(xué)習(xí)的目標(biāo)檢測算法主要分為以下兩類:基于深度學(xué)習(xí)的雙階段檢測算法和基于深度學(xué)習(xí)的單階段檢測算法。其中,Yolo系列[5-7]算法將候選區(qū)域生成階段省略掉,直接將檢測任務(wù)視為回歸問題進(jìn)行端到端的檢測,檢測速度和精度相對其他深度目標(biāo)檢測算法在終端設(shè)備上進(jìn)行部署更占優(yōu)勢。Yolov4[20]算法在yolov3的基礎(chǔ)上通過替換主干特征提取網(wǎng)絡(luò)、Mosaic數(shù)據(jù)增強(qiáng)、更換激活、損失函數(shù)、標(biāo)簽平滑等方式,利用圖形處理器(GPU)進(jìn)行訓(xùn)練推理工作,取得了權(quán)重參數(shù)量和性能最佳平衡。但在部署至終端時,如果不針對應(yīng)用平臺進(jìn)行改進(jìn),硬件推理仍會耗時過長。
本文選定Yolov4 tiny為模型結(jié)構(gòu)基礎(chǔ),針對國產(chǎn)rk3399pro芯片架構(gòu)特點(diǎn)對算法進(jìn)行改進(jìn),并對算法在平臺上的運(yùn)行方式進(jìn)行優(yōu)化,提供了一種Yolov4 tiny算法在瑞芯微平臺上實(shí)時目標(biāo)檢測的較優(yōu)方案。
瑞芯微提供的RKNN工具鏈可支持對深度學(xué)習(xí)算法的快速移植和應(yīng)用開發(fā)。該工具鏈通過調(diào)用API(Application Programming Interface,應(yīng)用程序接口)接口的方式對硬件寄存器、MAC(Multiply Accumulate,乘數(shù)累加器)等電路單元進(jìn)行控制,省去復(fù)雜的底層芯片處理工作,支持將訓(xùn)練的caffe、Tensorflow等主流模型轉(zhuǎn)換為RKNN模型,進(jìn)而使瑞芯微平臺能夠加載推理。
瑞芯微RKNN工具鏈的應(yīng)用開發(fā)流程如圖1所示,主要分為模型訓(xùn)練、模型轉(zhuǎn)換、模型推理三部分。通過主流的深度學(xué)習(xí)模型框架對目標(biāo)檢測算法進(jìn)行訓(xùn)練,得到較好的MAP(Mean Average Precision,全類平均精度)和recall(召回率);導(dǎo)出模型的參數(shù)權(quán)重至RKNN Toolkit中轉(zhuǎn)換為RKNN模型;通過調(diào)用API接口在瑞芯微平臺上加載運(yùn)行RKNN模型,對模型輸出張量進(jìn)行后處理輸出目標(biāo)檢測類別和位置。
圖1 瑞芯微平臺開發(fā)應(yīng)用流程圖
Yolov4 tiny算法是Yolov4目標(biāo)檢測算法的精簡版,它采用CSPDarkNet53-tiny作為主干特征提取網(wǎng)絡(luò)提取圖像的淺層特征,跨層利用FPN結(jié)構(gòu)作為頸部進(jìn)行低層和高層特征的特征融合與加強(qiáng),對輸出的兩個特征層沿用yolov3檢測頭部進(jìn)行分類與回歸預(yù)測。圖2是當(dāng)輸入為416×416的RGB圖像時,Yolov4 tiny的特征結(jié)構(gòu),將輸入的圖像均分為N×N個網(wǎng)格,若檢測目標(biāo)的中心坐標(biāo)在某個網(wǎng)格中,則該網(wǎng)格對應(yīng)完成對此目標(biāo)的檢測,輸出B個邊界框的模型預(yù)測中心坐標(biāo)、寬高和置信度預(yù)測值。在模型訓(xùn)練類別為C類時,Yolov4 tiny輸出N×N(5×B+C)大小的張量。
圖2 Yolov4 tiny網(wǎng)絡(luò)結(jié)構(gòu)
相對于Yolov4而言,精簡版的Yolov4的參數(shù)量縮小為十分之一;但在前期開發(fā)測試中發(fā)現(xiàn) Yolov4 tiny直接部署到瑞芯微平臺上的速度僅在3~4幀/秒,難以滿足實(shí)時性需求需要進(jìn)行改進(jìn)。
Yolov4 tiny參數(shù)較多、神經(jīng)網(wǎng)絡(luò)算子占用硬件資源較大,在實(shí)際應(yīng)用場景下的檢測實(shí)時性無法被滿足。本文結(jié)合瑞芯微平臺的rk3399pro芯片資源和算法結(jié)構(gòu)特征,從以下方面對Yolov4 tiny算法進(jìn)行優(yōu)化。
KITTI數(shù)據(jù)集[21]是目前國際上最大的自動駕駛場景下的計算機(jī)視覺算法評測數(shù)據(jù)集。原始數(shù)據(jù)集部分類別在圖片中像素過小、標(biāo)注模糊不清,需要對原有的類別標(biāo)簽進(jìn)行處理,將不需要的類別標(biāo)簽舍棄。在將其歸一化為416×416大小時,為避免檢測目標(biāo)的長寬比發(fā)生畸變,即圖片產(chǎn)生拉伸形變,采用背景填充的方式對訓(xùn)練和測試的圖片進(jìn)行壓縮。
Yolov4 tiny原模型中的先驗(yàn)框由coco數(shù)據(jù)集訓(xùn)練而來,對于應(yīng)用在自動駕駛場景的數(shù)據(jù)集而言并不具有普適性。
K-means是一個迭代型的算法距離公式定義為:
其中,A-聚類框大??;B-樣本庫大??;C-聚類中心;IOU表示A、B交互比。
對標(biāo)簽處理后的KITTI數(shù)據(jù)集使用K-means算法對目標(biāo)標(biāo)注框進(jìn)行聚類,分析聚類結(jié)果后將占比最大的Anchor值作為檢測目標(biāo)先驗(yàn)框類別,Anchor與標(biāo)注框的平均IOU為67.47%。使用聚類后的標(biāo)注框進(jìn)行訓(xùn)練,重復(fù)訓(xùn)練5次平均檢測精度有了0.56%的提升,如表1所示。
表1 不同anchor box性能對比
深度目標(biāo)檢測算法中的卷積層主要由大量的矩陣乘加運(yùn)算實(shí)現(xiàn),導(dǎo)致終端推理耗時過多。rk3399pro中有可用于乘加運(yùn)算加速的專用NPU:支持8bit/16bit運(yùn)算,運(yùn)算性能最高可達(dá)3Tops,功耗不到GPU所需要的1%。利用NPU對卷積層進(jìn)行并行計算加速,分析NPU中固定MAC結(jié)構(gòu)特點(diǎn),在程序編譯芯片進(jìn)行加速運(yùn)算時,采用3×3的卷積核更有利于實(shí)現(xiàn)最高的MAC利用率?;诖?,將卷積輸出通道數(shù)均改為3的倍數(shù)。
卷積運(yùn)算只是將輸入圖像特征與卷積核做乘加操作,如果不引入激活函數(shù)將無法解決線性不可分問題,造成模型的特征擬合能力不足。除了考量非飽和性、參數(shù)少、單調(diào)性等要求,還要在終端設(shè)備構(gòu)造實(shí)現(xiàn)激活函數(shù)時計算量少、函數(shù)簡單尤為重要。
ReLU函數(shù)[22-23]的數(shù)學(xué)表達(dá)式如公式(2)所示:
相較于sigmod函數(shù)與tanh函數(shù),它的優(yōu)點(diǎn)在于輸入為正數(shù)時,不存在梯度飽和;又由于將矩陣內(nèi)所有負(fù)值都設(shè)為零,訓(xùn)練傳播速度極快。Leaky Relu函數(shù)是ReLU的變體,將函數(shù)輸出負(fù)值給予了一個小坡度;雖然這能減少靜默神經(jīng)元的出現(xiàn),但同時會引入更多的計算量拖延設(shè)備檢測時間?;诖?,將Yolov4 tiny激活函數(shù)由Leaky Relu替換為ReLU函數(shù)。
NPU會對卷積層、ReLU及MAX Pooling層進(jìn)行融合,融合示意圖如圖3所示,使其在硬件加速時被優(yōu)化融合為一個整體的op (operators,神經(jīng)網(wǎng)絡(luò)計算的基本單元) 算子,進(jìn)而減少計算帶寬。
圖3 NPU融合op算子加速示意圖
圖4 改進(jìn)前后特征提取網(wǎng)絡(luò)復(fù)雜度對比
改進(jìn)的模型在KITTI數(shù)據(jù)集上的map下降了2.29%變?yōu)?9.56%,但參數(shù)計算量下降使得在GPU上的運(yùn)行速度從169幀/秒提升為225幀/秒。改進(jìn)后的模型部署到rk3399pro上單核檢測速度也僅每秒6幀左右,仍需要對算法運(yùn)行方式進(jìn)行優(yōu)化。
文中模型訓(xùn)練均采用GPU:RTX 2060 SUPER,CPU:i5-10400,內(nèi)存16G;python:3.6;CUDA10.1,cuDNN7.6.5,opencv:3.4.5;終端設(shè)備:瑞芯微rk3399pro。為防止單次模型訓(xùn)練中存在的誤差,文中數(shù)據(jù)均是經(jīng)過5次平均后的結(jié)果。
在rk3399pro中調(diào)用運(yùn)行Yolov4 tiny需要操作系統(tǒng)同應(yīng)用軟件配合。操作系統(tǒng)需移植debian系統(tǒng)、裁剪后的ARM-linux內(nèi)核,安裝NPU支持的固件版本、深度學(xué)習(xí)網(wǎng)絡(luò)需要的開發(fā)環(huán)境和庫文件。應(yīng)用軟件方面需建立和PC間的交叉編譯環(huán)境,安裝Opencv、Qt、Cmake-gui,使用minicom傳輸模型文件。
終端設(shè)備系統(tǒng)環(huán)境就緒后,將目標(biāo)檢測算法模型按照RKNN模型移植的步驟創(chuàng)建RKNN對象,啟動設(shè)備載入RKNN模型,調(diào)用接口初始化RKNN SDK開發(fā)環(huán)境對輸入的圖像預(yù)處理后進(jìn)行推理計算,對模型輸出張量后處理得出檢測目標(biāo)和類別。
rk3399pro支持的模型量化方法有非對稱量化(asymmetric_quantized-u8)、動態(tài)定點(diǎn)量化(dynamic_fixed_point-8)和dynamic_fixed_point-16)三種。前兩種量化方式屬于計算公式不同的8位量化,但對大部分網(wǎng)絡(luò)而言非對稱unit8量化對網(wǎng)絡(luò)精度損失最小[24]。
上述公式(3)中,xf代表float32類型數(shù)據(jù),n表示量化數(shù)據(jù)的bit,xq表示最終量化值。
當(dāng)對8位定點(diǎn)的精度損失過大時,也可利用NPU中的300Gops int16的計算單元對dynamic_fixed_point-16量化而來的卷積層進(jìn)行加速。
對模型采用不同的量化方式可以發(fā)現(xiàn),不同量化方式轉(zhuǎn)換后的模型大小如圖5所示,使用8位定點(diǎn)量化的模型大小將減至原模型的1/4。將FP32的浮點(diǎn)數(shù)張量轉(zhuǎn)化為uint8張量,有助于減少內(nèi)存帶寬和存儲空間,并進(jìn)一步提高系統(tǒng)吞吐量降低系統(tǒng)延時。
圖5 Our yolov4 tiny模型不同量化參數(shù)比較
rk3399pro采用big.LITTLE大小核CPU架構(gòu),擁有雙核A72加四核A53,四核GPU Mail-T860。本文采用CPU-GPU-NPU多線程協(xié)同計算方案優(yōu)化算法運(yùn)行速度,即:①圖像獲取與預(yù)處理;②數(shù)據(jù)推理;③數(shù)據(jù)后處理與顯示。以上三種分支結(jié)構(gòu)中計算復(fù)雜度最高的就是數(shù)據(jù)推理,數(shù)據(jù)推理中的卷積計算占到整個目標(biāo)檢測系統(tǒng)90%的計算量,應(yīng)交由NPU工作;其余兩個分支結(jié)構(gòu)都與圖像處理相關(guān),交由GPU實(shí)現(xiàn)。而CPU則負(fù)責(zé)系統(tǒng)調(diào)度,協(xié)調(diào)各個預(yù)算單元降低GPU功耗和NPU負(fù)載。在開發(fā)測試過程中發(fā)現(xiàn),NPU專注推理加速時整個模型推理過程耗時將極小,而圖像預(yù)處理和后處理時間較長。本文將利用兩個大核分時復(fù)用NPU對GPU預(yù)處理的圖像數(shù)據(jù)進(jìn)行推理,隨后小核調(diào)用GPU進(jìn)行數(shù)據(jù)后處理和顯示,如圖6所示。
圖6 CPU-GPU-NPU協(xié)同計算圖
并在平臺上進(jìn)行驗(yàn)證不同的量化方式與是否使用線程在不同模型上的檢測速度。
實(shí)驗(yàn)證明采用不同的優(yōu)化方式在rk3399pro中的檢測效果差距極大,檢測結(jié)果如圖7所示。本文使用8位定點(diǎn)量化后的Our yolov4 tiny模型在rk3399pro的理論推理性能達(dá)到80幀/s,比不量化的模型提升了12.7倍。在實(shí)際檢測應(yīng)用時,由于實(shí)驗(yàn)室攝像頭最高只能輸入每秒60幀的圖像,使用python的多進(jìn)程推理速度接近59幀/s,使用c接口的多線程推理速度接近60幀/s。
圖7 不同優(yōu)化方式檢測效果對比
綜上所述,本文提出的CPU-GPU-NPU多線程協(xié)同計算方案可以有效提升硬件加速效率減少數(shù)據(jù)傳輸耗時。
rk3399pro等終端AI芯片為實(shí)現(xiàn)低功耗低成本的推理加速,MAC等電路單元會對神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行優(yōu)化。因此往往在GPU端訓(xùn)練的模型部署至終端設(shè)備時會存在精度和性能損失的問題。
驗(yàn)證精度損失的方法主要是對轉(zhuǎn)換后的RKNN模型在開發(fā)板上進(jìn)行推理后,打印出每層網(wǎng)絡(luò)結(jié)構(gòu)輸出的tensor值,與在GPU端推理輸出的tensor值進(jìn)行比較歐式距離或余弦距離,進(jìn)而判斷模型轉(zhuǎn)換的精度損失。但由于在終端設(shè)備部署的模型種類繁雜,實(shí)際檢測中還要考量光線強(qiáng)弱、設(shè)備成像等因素,很難具體驗(yàn)證每個模型在實(shí)際檢測中的精度損失。
在本文中,為將訓(xùn)練的模型具體的部署到rk3399pro平臺實(shí)際使用;對采用不同量化方式的模型測試單純在KITTI數(shù)據(jù)集上的map損失,實(shí)驗(yàn)數(shù)據(jù)可見表2。
表2 不同模型性能對比
將經(jīng)過改進(jìn)后的模型與官方的Yolov4 tiny模型在rk3399pro端檢測靜態(tài)圖像中的效果進(jìn)行對比,可以發(fā)現(xiàn)在設(shè)置將經(jīng)過改進(jìn)后的模型與官方的Yolov4 tiny模型在rk3399pro端檢測靜態(tài)圖像中的效果進(jìn)行對比,可以發(fā)現(xiàn)在設(shè)置同樣的目標(biāo)檢測閾值和NMS閾值時,本文訓(xùn)練的模型可以實(shí)現(xiàn)對目標(biāo)更精確的定位,在真實(shí)道路場景中會遇到的遮擋和截斷以及模糊不清等問題都能予以正確識別。
圖8 原Yolov4 tiny模型在rk3399pro端檢測結(jié)果圖
圖9 Our yolov4 tiny模型在rk3399pro端檢測結(jié)果圖
而在動態(tài)的視頻檢測中,對改進(jìn)后模型在終端設(shè)備上的運(yùn)行方式進(jìn)行優(yōu)化后,采用CPU-GPU-NPU多線程協(xié)同計算方案模型在攝像頭采集的實(shí)時視頻檢測速度有了大幅提升,從單線程的15幀/秒提升至60幀/秒。
圖10 Our yolov4 tiny模型在rk3399pro端單線程攝像頭檢測結(jié)果圖
圖11 Our yolov4 tiny模型在rk3399pro端多線程攝像頭檢測結(jié)果圖
為了實(shí)現(xiàn)Yolov4 tiny模型在瑞芯微平臺中部署應(yīng)用,針對原模型存在的參數(shù)過多問題,采用修改網(wǎng)絡(luò)和量化相結(jié)合的方式去除數(shù)據(jù)冗余,并驗(yàn)證不同的優(yōu)化方式在設(shè)備上檢測KITTI數(shù)據(jù)集的精確度。
實(shí)驗(yàn)證明:Yolov4 tiny模型經(jīng)過非對稱8位量化后雖然map精度從PC端的79.56%降至終端端的65.81%,但網(wǎng)絡(luò)大小可從原始的16.8MB減少至4.3MB大小,理論模型推理速度從6.3fps/s提升至80fps/s;在瑞芯微平臺上取得了理論檢測速度和精度的較優(yōu)平衡。
同時為了驗(yàn)證本文提出的算法改進(jìn)和模型運(yùn)行優(yōu)化的方式具有一定普適性,在yolo系列的其他輕量化網(wǎng)絡(luò)進(jìn)行相同的實(shí)驗(yàn)。
數(shù)據(jù)結(jié)果如表3所示,證明以上改進(jìn)方式在國產(chǎn)rk3399pro平臺上部署輕量化目標(biāo)檢測算法提供了理論和技術(shù)支持。
表3 改進(jìn)yolo系列輕量化模型前后檢測效果對比
本文針對rk3399pro芯片結(jié)構(gòu)特點(diǎn)對Yolov4 tiny 模型在卷積核通道數(shù)、激活函數(shù)等處進(jìn)行改進(jìn);改進(jìn)后的模型與原模型精度相近但檢測速度大幅提升。同時搭建了交叉編譯環(huán)境,將GPU端訓(xùn)練的模型通過工具鏈轉(zhuǎn)換為RKNN模型;并探索了不同的量化方案、多核并行等優(yōu)化方式對于代碼運(yùn)行的速度提升效果,優(yōu)化方法在不同模型上的通用性等。研究可得,針對本文的目標(biāo)檢測算法,采用非對稱8位量化、多線程并行、神經(jīng)網(wǎng)絡(luò)算子融合等方式可以大幅提升終端設(shè)備端的檢測速度,實(shí)現(xiàn)魯棒精確的檢測效果。
本文針對Yolov4 tiny這一模型進(jìn)行改進(jìn)并實(shí)際應(yīng)用在rk3399pro上,但對除了yolo系列之外的輕量化深度目標(biāo)檢測模型的通用改進(jìn)方式并未做研究,日后將在這方面進(jìn)行探索。