孔維剛,李文婧,王秋艷,曹鵬程,宋慶增
(1.天津工業(yè)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,天津 300387;2.天津工業(yè)大學(xué) 電氣工程與自動(dòng)化學(xué)院,天津 300387;3.中國(guó)電子科技集團(tuán)公司信息科學(xué)研究院,北京 100086)
在計(jì)算機(jī)視覺(jué)領(lǐng)域,圖像識(shí)別算法不斷推陳出新,其在遙感監(jiān)測(cè)、醫(yī)療衛(wèi)生、軍事科技等方面取得了較大成就。從算法的角度來(lái)看,卷積神經(jīng)網(wǎng)絡(luò)憑借其卓越的特征提取能力和可擴(kuò)展性,在圖像識(shí)別領(lǐng)域表現(xiàn)優(yōu)異,使得目標(biāo)檢測(cè)不斷地從傳統(tǒng)的識(shí)別方法向基于深度學(xué)習(xí)的識(shí)別方法發(fā)展。目前的深度學(xué)習(xí)算法大致可分為二階段算法和一階段算法兩類(lèi):二階段算法先從圖像中選取候選框,然后在該候選框中得到分類(lèi)和回歸結(jié)果,該類(lèi)算法包括RCNN[1]、Fast-RCNN[2]、Faster-RCNN[3]等,算法能得到較高的準(zhǔn)確率,但訓(xùn)練步驟繁瑣,且占用了較多空間;一階段目標(biāo)檢測(cè)算法(如SSD[4]、YOLO[5-7]等)不需要候選框,它們直接通過(guò)卷積操作來(lái)進(jìn)行分類(lèi)和回歸預(yù)測(cè),進(jìn)而得到物體的類(lèi)別和坐標(biāo)信息,該類(lèi)算法的速度快、占用空間小。嵌入式平臺(tái)對(duì)低功耗和低能耗有較大需求,因此,需要一個(gè)更加輕便靈活的網(wǎng)絡(luò)結(jié)構(gòu)來(lái)完成推理工作。
本文在YOLOv4 算法[8]的基礎(chǔ)上進(jìn)行網(wǎng)絡(luò)結(jié)構(gòu)改進(jìn)和量化處理,使其滿足微算力、低功耗的需求。在特征提取層,采用更加輕便的MobileNetv3[9]設(shè)計(jì),利用深度可分離卷積(PW 和DW)降低參數(shù)量和計(jì)算量,并對(duì)MobileNetv3 進(jìn)行改進(jìn),使其更加貼合YOLOv4 的檢測(cè)層。在此基礎(chǔ)上,對(duì)網(wǎng)絡(luò)進(jìn)行8 bit的量化操作,從而在犧牲少量精確度的前提下大幅降低模型所占空間。
YOLOv4 是YOLO(You Only Look Once)系列目標(biāo)檢測(cè)算法中的第四版,相較YOLOv3 算法,YOLOv4 網(wǎng)絡(luò)結(jié)構(gòu)并沒(méi)有太大改變,但是在數(shù)據(jù)預(yù)處理層面、損失函數(shù)層面都對(duì)YOLOv3 進(jìn)行了改進(jìn),使得網(wǎng)絡(luò)在速度未降低的前提下精確度大幅提升。YOLOv4 算法流程如圖1 所示。
圖1 YOLOv4 算法流程Fig.1 YOLOv4 algorithm procedure
YOLOv4 的主要?jiǎng)?chuàng)新在于Bag of freebies[10]和Bag of specials:
1)Bag of freebies 是指目標(biāo)檢測(cè)器在不增加推理?yè)p耗的情況下達(dá)到更好的精度,通常只需轉(zhuǎn)變訓(xùn)練策略或只增加訓(xùn)練成本,如用馬賽克增強(qiáng)(Mosaic data augmentation)方法將4 張圖片拼成1 張,增加單GPU 的顯存利用率從而提升其訓(xùn)練能力,或利用自對(duì)抗訓(xùn)練在原始圖片上增加一些輕微擾動(dòng),使得在人分辨不清的情況下誘導(dǎo)模型進(jìn)行分類(lèi),或在標(biāo)簽處理中采用組內(nèi)標(biāo)簽平滑的手段,損失函數(shù)層面運(yùn)用Focal Loss 等不改變網(wǎng)絡(luò)結(jié)構(gòu)的方法,并利用模擬余弦退火的方法改進(jìn)學(xué)習(xí)率。
2)Bag of specials 是指插入模塊用來(lái)增強(qiáng)某些屬性,從而大幅提高目標(biāo)檢測(cè)的準(zhǔn)確性。
特征提取網(wǎng)絡(luò)CSPDarkNet53 中采用CSPNet,可以大幅減少計(jì)算量并提高推理速度和準(zhǔn)確性。YOLOv4 將DarkNet53 分成若干個(gè)CSPNet 進(jìn)行處理,進(jìn)而形成CSPDarkNet53 特征提取網(wǎng)絡(luò)結(jié)構(gòu)。此外,通過(guò)添加SENet[11]來(lái)學(xué)習(xí)通道之間的相互依賴(lài)關(guān)系,從而給通道間施加注意力機(jī)制,使網(wǎng)絡(luò)有主次地學(xué)習(xí)通道間的特征。
采用空間金字塔池化(Spatial Pyramid Pooling,SPP)[12]的原理是對(duì)全連接層前的卷積層,執(zhí)行3 個(gè)不同尺度的最大池化操作,然后進(jìn)行拼接形成一個(gè)一維的向量,上述過(guò)程對(duì)輸入圖片尺寸沒(méi)有要求,因此,輸入圖片的高寬比和大小可以任意取值。
本文利用Pytorch 框架,將YOLOv4 的特征提取層改為MobileNetv3-large 網(wǎng)絡(luò)結(jié)構(gòu),該網(wǎng)絡(luò)是NetAdapt算法與自動(dòng)神經(jīng)網(wǎng)絡(luò)搜索(Neural Architecture Search,NAS)的結(jié)合。
MobileNetv3 綜合了MobileNetv1[13]的深度可分離卷積、MobileNetv2[14]的具有線性瓶頸的逆殘差結(jié)構(gòu)、MnasNet 的基于SE(Squeeze and Excitation)結(jié)構(gòu)的輕量級(jí)注意力模型這3 種模型的思想,并將最后一步平均池化層前移同時(shí)移除最后一個(gè)卷積層。MobileNetv3 網(wǎng)絡(luò)結(jié)構(gòu)如表1所示,其中,k為擴(kuò)展層通道數(shù)。
表1 MobileNetv3 網(wǎng)絡(luò)結(jié)構(gòu)Table 1 MobileNetv3 network structure
表1 所述網(wǎng)絡(luò)結(jié)構(gòu)為原始MobileNetv3 網(wǎng)絡(luò),該網(wǎng)絡(luò)共20 層,其中,后3 層通過(guò)池化和卷積的方法完成圖像分類(lèi)任務(wù),由于本文面向檢測(cè)識(shí)別任務(wù),因此只取前17 層并對(duì)其進(jìn)行一些優(yōu)化處理。
本文在MobileNetv3 結(jié)構(gòu)中保留了SE 模塊,使網(wǎng)絡(luò)有主次地學(xué)習(xí)每層特征。在檢測(cè)層,輸出3 個(gè)不同尺度的分支,分別在BottleNeck 的第7 層、第13 層、第17 層進(jìn)行提取,撇棄第17 層之后的模塊,然后對(duì)這3 層分別進(jìn)行PW 卷積操作以變換維度,使其能夠與檢測(cè)層銜接。
為了能在保留高維特征的前提下縮短延時(shí),本文將平均池化前的層移除并用1×1 卷積來(lái)計(jì)算特征圖。特征生成層被移除后,先前用于瓶頸映射的層也不再需要,這將減少10 ms 的開(kāi)銷(xiāo),在提速15%的同時(shí)降低了操作量。由于后續(xù)的量化操作中不能對(duì)Leaky ReLU、h-swish 等激活函數(shù)進(jìn)行模型融合操作(感知量化操作的預(yù)處理),因此只能將MobileNetv3和YOLOv4 檢測(cè)層中的激活函數(shù)全部改為ReLU 激活函數(shù)進(jìn)行量化處理。
在經(jīng)過(guò)MobileNetv3 的特征提取后,會(huì)在YOLO頭部層輸出最終結(jié)果,圖2、圖3 中的CBL 是YOLOv4 的基本組件,即Conv+BN+Leaky ReLU。對(duì) 于YOLOv4 而 言,BN 和Leaky ReLU 是和卷積層不可分離的部分(最后一層卷積除外),它們共同構(gòu)成了最小組件,YOLOv4 采用3 個(gè)不同尺度的特征圖來(lái)進(jìn)行目標(biāo)檢測(cè)。
圖2 YOLOv4-CSPDarkNet53 整體網(wǎng)絡(luò)框架Fig.2 YOLOv4-CSPDarkNet53 overall network framework
圖3 YOLOv4-MobileNetv3 整體網(wǎng)絡(luò)框架Fig.3 YOLOv4-MobileNetv3 overall network framework
目前,支持量化訓(xùn)練的框架主要有Pytorch 1.30以上、Tensorflow 2.0 以上以及微軟的推斷框架,每種框架都有各自的優(yōu)勢(shì)。本文在嘗試這3 種框架后,最后選擇Pytorch 1.40 版本作為8 bit 量化框架。Pytorch 提供了3 種量化模型的方法:
1)訓(xùn)練后動(dòng)態(tài)量化,這是一種最簡(jiǎn)單的量化方式,其中,權(quán)重首先會(huì)被量化,激活值會(huì)在inference的過(guò)程中動(dòng)態(tài)地被量化。
2)訓(xùn)練后靜態(tài)量化,這是最常用的量化形式,其中權(quán)重提前量化,并且基于觀察校準(zhǔn)過(guò)程中模型的行為來(lái)預(yù)先計(jì)算激活張量的比例因子和偏差。訓(xùn)練后量化通常是在內(nèi)存帶寬和計(jì)算能耗都很重要的情況下進(jìn)行的,CNN 是典型的用例。
3)感知量化訓(xùn)練,在Post Training 量化不能提供足夠精度的情況下,可以使用感知量化訓(xùn)練,通過(guò)torch.quantization.FakeQuantize 來(lái)模擬量化過(guò)程。計(jì)算過(guò)程使用FP32,但是數(shù)據(jù)會(huì)通過(guò)被固定在一定動(dòng)態(tài)范圍以及依據(jù)四舍五入來(lái)模擬INT8 量化的影響[15]。
本文采用感知量化訓(xùn)練方法,將模型權(quán)重變?yōu)镮NT8 類(lèi)型,原因是采用INT8 類(lèi)型的量化最大能保留256 個(gè)值,在最大限度地保證精度的情況下對(duì)模型進(jìn)行壓縮,從而減少參數(shù)量計(jì)算。
在實(shí)現(xiàn)量化的過(guò)程中,必須能夠保持0.1×f的精度,因?yàn)? 在深層神經(jīng)網(wǎng)絡(luò)(DNN)中發(fā)揮很大作用,如果原始的0 映射到量化后的值發(fā)生改變并出現(xiàn)了精度損失,則計(jì)算過(guò)程中將會(huì)出現(xiàn)誤差。
實(shí)際值和量化值的映射關(guān)系如式(1)所示:
其中:a表示實(shí)際值;θ表示壓縮比例;q表示量化的比特?cái)?shù),如INT4 量化就是4;f表示量化后的小數(shù)位值。
量化過(guò)程中最重要的是確定合適的amax和amin。由于本文先訓(xùn)練模型,再利用訓(xùn)練好的模型進(jìn)行量化訓(xùn)練(Post Training)操作,因此不存在確定amax和amin的問(wèn)題。
在進(jìn)行量化訓(xùn)練之前,還有一個(gè)重要步驟,即進(jìn)行模型融合,將卷積層(Conv Layer)、批歸一化層(Batch Norm Layer)和激活函數(shù)層(Activate Layer)相融合,方可進(jìn)行后續(xù)的量化操作。由于MobileNetv3中的激活函數(shù)使用h-swish 和ReLU6,導(dǎo)致在進(jìn)行感知量化時(shí)無(wú)法融合這類(lèi)激活函數(shù),因此本文將其都改為ReLU 激活函數(shù),以進(jìn)行模型融合操作。
在進(jìn)行感知量化時(shí),參數(shù)優(yōu)化公式為:
其中:clamp 表示截止位數(shù);N表示量化到多少位;ain表示待量化的數(shù);β表示零點(diǎn)。式(2)即為一個(gè)位數(shù)的量化過(guò)程,若要進(jìn)行INT8 類(lèi)型的感知量化操作,則式(2)轉(zhuǎn)換如下:
本文損失函數(shù)選取YOLOv4 中最新設(shè)計(jì)的CIOU Loss 和DIOU Loss,使網(wǎng)絡(luò)預(yù)測(cè)框更加準(zhǔn)確。用IOU 代替L1 Loss 和L2 Loss,能夠?qū)崿F(xiàn)尺度統(tǒng)一[17-18]。IOU 計(jì)算公式如下:
其中:B為檢測(cè)框的面積;Bgt為真實(shí)框的面積。
DIOU 是IOU 的改進(jìn)版,用來(lái)反映檢測(cè)框之間的距離。DIOU 計(jì)算公式如下:
其中:b是中心點(diǎn);ρ是歐式距離;c是覆蓋2 個(gè)框的最小框的對(duì)角線長(zhǎng)。
CIOU 在DIOU 的基礎(chǔ)上加入影響因子,其為目前性能表現(xiàn)最好的IOU Loss。CIOU 計(jì)算公式如下:
其中:α是平衡正數(shù)的參數(shù);ν是確保長(zhǎng)寬比具有一致性的參數(shù)。
可以看出,CIOU Loss 和DIOU Loss 都是對(duì)IOU Loss的改進(jìn),使得最后得出的預(yù)測(cè)框更加貼合實(shí)際目標(biāo)。
本文激活函數(shù)采用Mish[19]非線性激活函數(shù),其在負(fù)值層面添加一段平滑點(diǎn),而非ReLU 激活函數(shù)[20]中的零邊界。平滑的激活函數(shù)允許更好的信息深入神經(jīng)網(wǎng)絡(luò),從而得到更優(yōu)的準(zhǔn)確性和泛化能力。Mish 激活函數(shù)如式(7)所示:
其中:x為經(jīng)歸一化層傳入的參數(shù)值。
本文實(shí)驗(yàn)采用Pytorch 框架進(jìn)行網(wǎng)絡(luò)結(jié)構(gòu)改進(jìn)并執(zhí)行量化操作,操作系統(tǒng)為Ubuntu 18.04.5,CPU為Inter Core i7-10875H,GPU 為NVIDIA RTX2060,在嵌入式設(shè)備上進(jìn)行推理和測(cè)試操作,設(shè)備型號(hào)為NVIDIA Jetson NX。
本文目的是在嵌入式設(shè)備上完成無(wú)人機(jī)數(shù)據(jù)集的多目標(biāo)檢測(cè)任務(wù),使用的數(shù)據(jù)集為12 分類(lèi)的VisDrone2020 無(wú)人機(jī)數(shù)據(jù)集,其訓(xùn)練和驗(yàn)證圖片共有10 890 張,測(cè)試圖片有1 030 張。
嵌入式設(shè)備使用NVIDIA 公司于2020 年最新推出的GPU 邊緣計(jì)算設(shè)備Jetson Xavier NX,如圖4 所示,它以10 W 的功耗每秒提供多達(dá)14 terra 運(yùn)算(TOPS)或以15 W 的功耗每秒提供21 terra 運(yùn)算,并行運(yùn)行多個(gè)神經(jīng)網(wǎng)絡(luò),設(shè)備運(yùn)行基于Ubuntu 的Linux 操作系統(tǒng)。本文在該嵌入式設(shè)備上安裝Ubuntu18.04 的操作系統(tǒng)鏡像,并配置Python3.6 和Pytorch 環(huán)境。
圖4 NVIDIA Jetson Xavier NX 設(shè)備Fig.4 NVIDIA Jetson Xavier NX equipment
本文實(shí)驗(yàn)輸入尺寸統(tǒng)一為1 024×1 024 像素的JPG 圖像,將CIOU Loss 作為損失函數(shù),總Batch size設(shè)置為16,每個(gè)GPU 的Batch size 為4,Epoch 設(shè)置為500,學(xué)習(xí)率設(shè)置為0.000 1,模擬余弦退火策略來(lái)調(diào)整網(wǎng)絡(luò)學(xué)習(xí)率。數(shù)據(jù)增強(qiáng)手段采用馬賽克數(shù)據(jù)增強(qiáng)方法,同時(shí)采用組內(nèi)標(biāo)簽平滑的方法優(yōu)化標(biāo)簽類(lèi)。由于原始anchor 大小相比于無(wú)人機(jī)圖像的目標(biāo)而言過(guò)于龐大,因此本文使用KNN[21]聚類(lèi)算法對(duì)輸入數(shù)據(jù)集選取最合適的9 個(gè)anchor 大小,并將其應(yīng)用到2 個(gè)網(wǎng)絡(luò)中,分別訓(xùn)練原始YOLOv4-CSPDarkNet53網(wǎng)絡(luò)、改進(jìn)YOLOv4-MobileNetv3 網(wǎng)絡(luò)以及經(jīng)過(guò)感知量化訓(xùn)練的YOLOv4-MobileNetv3 網(wǎng)絡(luò),最后將上述3 種網(wǎng)絡(luò)的結(jié)果進(jìn)行對(duì)比。
在衡量一個(gè)模型性能優(yōu)劣時(shí),通常會(huì)用準(zhǔn)確度(Prescision)和召回率(Recall)來(lái)對(duì)其網(wǎng)絡(luò)預(yù)測(cè)結(jié)果進(jìn)行分析。在目標(biāo)檢測(cè)領(lǐng)域,對(duì)于單目標(biāo)檢測(cè)算法,通常用AP(Average Precision)指標(biāo)來(lái)衡量某一類(lèi)目標(biāo)檢測(cè)的精度;對(duì)于多目標(biāo)檢測(cè)算法,通常用mAP(mean Average Precision)來(lái)衡量多類(lèi)目標(biāo)檢測(cè)的平均精度。由于本文是對(duì)12 分類(lèi)無(wú)人機(jī)數(shù)據(jù)集進(jìn)行目標(biāo)檢測(cè),因此使用mAP 衡量指標(biāo)。在嵌入式設(shè)備上進(jìn)行推理檢測(cè),本文目標(biāo)是在不降低mAP 或降低有限mAP 的前提下,最大化地壓縮模型尺寸(size),減少模型計(jì)算量(FLOPs),提高嵌入式設(shè)備上的幀率(FPS)。
圖5 所示為YOLOv4-MobileNetv3 模型在訓(xùn)練時(shí)Loss 的變化趨勢(shì)。從圖5 可以看出,當(dāng)Epoch 逐漸迭代 時(shí),Loss 在第150 個(gè)~第400 個(gè)Epoch 之間下降最快,當(dāng)Epoch 為450 時(shí),Loss 曲線逐漸平緩。
圖5 模型訓(xùn)練時(shí)Loss 的變化趨勢(shì)Fig.5 Trend of Loss during model training
傳統(tǒng)的目標(biāo)檢測(cè)數(shù)據(jù)集(如COCO 數(shù)據(jù)集、VOC數(shù)據(jù)集),它們的檢測(cè)目標(biāo)較大且單張圖片數(shù)量較少?;跓o(wú)人機(jī)數(shù)據(jù)集的多目標(biāo)多分類(lèi)目標(biāo)檢測(cè)任務(wù)的難點(diǎn)在于:在一張圖片中存在幾個(gè)或幾十個(gè)需要檢測(cè)的目標(biāo),數(shù)量不定且龐大;目標(biāo)類(lèi)別有12 種,且圖片尺寸較小,不易檢測(cè)。
如表2 所示,實(shí)驗(yàn)經(jīng)過(guò)1 024×1 024 像素大小的圖片訓(xùn)練后,分別在608×608 像素、800×800 像素、1 024×1 024 像素的圖片上進(jìn)行測(cè)試,以CSPDarkNet53為骨干網(wǎng)絡(luò)的YOLOv4 模型的檢測(cè)mAP 最高可達(dá)35.2%,改進(jìn)YOLOv4-MobileNetv3 模型在mAP 最高達(dá)33.3%的前提下,模型體積減小且檢測(cè)速度提升;經(jīng)過(guò)感知量化處理,模型更加靈巧,在嵌入式設(shè)備上能實(shí)現(xiàn)最快為73 的檢測(cè)幀率。
表2 3 種模型在2 個(gè)設(shè)備上的性能對(duì)比Table 2 Performance comparison of three models on two devices
圖6、圖7 分別為YOLOv4-CSPDarkNet53 和YOLOv4-MobileNetv3 在PC 端 對(duì)VisDrone2020 無(wú)人機(jī)數(shù)據(jù)集圖像的測(cè)試效果。從中可以看出,YOLOv4-MobileNetv3 與YOLOv4-CSPDarkNet53 具有近似的測(cè)試結(jié)果,但YOLOv4-MobileNetv3 的模型大小和測(cè)試速度比YOLOv4-CSPDarkNet53更優(yōu)。
圖6 YOLOv4-CSPDarkNet53 在PC 端的測(cè)試效果Fig.6 Test effect of YOLOv4-CSPDarkNet53 on PC
圖7 YOLOv4-MobileNetv3 在PC 端的測(cè)試效果Fig.7 Test effect of YOLOv4-MobileNetv3 on PC
圖8、圖9 分別為YOLOv4-MobileNetv3 和經(jīng)過(guò)INT8 感知量化訓(xùn)練的YOLOv4-MobileNetv3 在NX 設(shè)備上對(duì)VisDrone2020 無(wú)人機(jī)數(shù)據(jù)集圖像的測(cè)試結(jié)果。從中可以看出,量化后的模型效果略差于量化前模型。
圖8 YOLOv4-MobileNetv3 在NX 端的測(cè)試效果Fig.8 Test effect of YOLOv4-MobileNetv3 on NX
圖9 感知量化訓(xùn)練后的YOLOv4-MobileNetv3 在NX 端的測(cè)試效果Fig.9 Test effect of YOLOv4-MobileNetv3 on NX after perceptual quantization training
本文提出面向低功耗應(yīng)用場(chǎng)景的神經(jīng)網(wǎng)絡(luò)加速算法實(shí)現(xiàn)方案,以解決RCNN 系列算法、SSD 算法、YOLO 系列算法在嵌入式領(lǐng)域高計(jì)算和低功耗需求之間的矛盾。設(shè)計(jì)一種輕量化神經(jīng)網(wǎng)絡(luò),對(duì)網(wǎng)絡(luò)進(jìn)行量化處理,以在模型計(jì)算量與參數(shù)量均較小的情況下保證較高的準(zhǔn)確率。實(shí)驗(yàn)結(jié)果表明,該神經(jīng)網(wǎng)絡(luò)加速算法能夠在性能、功耗、運(yùn)行效率上達(dá)到預(yù)期,可以在低功耗場(chǎng)景中對(duì)無(wú)人機(jī)圖像進(jìn)行準(zhǔn)確識(shí)別。下一步將采用更大尺度的模型壓縮方法,如通道剪枝算法或空間剪枝算法,將其與量化算法相結(jié)合,以提升模型壓縮的效率。