魏志飛,宋泉宏,李 芳,楊擎宇,王愛華
(上海機(jī)電工程研究所,上海 201109)
近年來,計(jì)算機(jī)視覺領(lǐng)域的專家學(xué)者在目標(biāo)檢測(cè)領(lǐng)域[1]所做的工作逐漸增多,使得卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)應(yīng)用在該領(lǐng)域獲得了非凡的成果;隨著網(wǎng)絡(luò)模型層數(shù)、結(jié)構(gòu)、體積不斷提升,模型的計(jì)算量也隨之增加,所依賴的計(jì)算資源也在不斷提高。卷積神經(jīng)網(wǎng)絡(luò)的實(shí)際應(yīng)用場(chǎng)景變得越來越廣泛,但在許多實(shí)際應(yīng)用中,部署深度卷積神經(jīng)網(wǎng)絡(luò)很大程度上受計(jì)算資源限制,深度學(xué)習(xí)模型因無法達(dá)到實(shí)時(shí)性效果難以在嵌入式設(shè)備中部署。針對(duì)深度學(xué)習(xí)模型在嵌入式系統(tǒng)中計(jì)算資源相比較于服務(wù)器資源有限的難題[2],本文開展了基于神經(jīng)網(wǎng)絡(luò)模型壓縮算法的目標(biāo)檢測(cè)算法研究。
網(wǎng)絡(luò)模型在嵌入式設(shè)備中部署主要受限于3個(gè)因素;①模型體積,CNN 模型中包含著數(shù)以百萬計(jì)的訓(xùn)練參數(shù),這些參數(shù)以及模型結(jié)構(gòu)等運(yùn)行過程中的相關(guān)信息都需要儲(chǔ)存在磁盤當(dāng)中,這些參數(shù)對(duì)存儲(chǔ)資源有限的嵌入式設(shè)備來講是非常大的挑戰(zhàn);②運(yùn)行時(shí)所需內(nèi)存,模型在前向傳播過程中,即便設(shè)置批量大小為1,運(yùn)行過程當(dāng)中可能會(huì)產(chǎn)生非常龐大的中間參數(shù),或許會(huì)比存儲(chǔ)模型的參數(shù)還要多,這對(duì)于許多內(nèi)存有限的設(shè)備而言是無法承受的運(yùn)算載荷;③運(yùn)行時(shí)的計(jì)算量,在圖像上進(jìn)行卷積操作,該過程計(jì)算量是非常龐大的,這可能導(dǎo)致高性能的深度學(xué)習(xí)算法模型處理單張圖片就需要幾十秒甚至幾分鐘的運(yùn)算時(shí)間,那么將該算法應(yīng)用于嵌入式設(shè)備是不切實(shí)際的。
模型壓縮算法有很多,如低秩分解、參數(shù)量化等,需要為其編制特定的軟件和設(shè)計(jì)相關(guān)的硬件方案來實(shí)現(xiàn)加速。而通過模型剪枝對(duì)網(wǎng)絡(luò)進(jìn)行模型壓縮,無需特定的軟件及硬件設(shè)計(jì),就可對(duì)模型進(jìn)行優(yōu)化,是一種非常有效、便捷的方案。本文采用的是一種基于通道因子對(duì)網(wǎng)絡(luò)模型進(jìn)行結(jié)構(gòu)剪枝的方法,這是一種簡(jiǎn)單而有效的壓縮策略,它可以解決在資源有限的條件下應(yīng)用網(wǎng)絡(luò)模型所面臨的問題,可以在保證算法精度損失較小的情況下提高網(wǎng)絡(luò)模型的運(yùn)行效率。
YOLO 算法一共有五種系列,分別為YOLOv1~YOLOv5。YOLO 算法是基于單階段的目標(biāo)檢測(cè)算法,將特征提取、錨框回歸和分類融合在一個(gè)模型當(dāng)中,與兩階段目標(biāo)檢測(cè)算法相比,有著運(yùn)行速度快的優(yōu)點(diǎn)。
YOLOv1(you only look once)算法,只需一次神經(jīng)網(wǎng)絡(luò)的前向傳播運(yùn)算就可以進(jìn)行目標(biāo)檢測(cè)任務(wù)。YOLOv1 算法的主要思想是先把輸入圖像分成S×S個(gè)網(wǎng)格單元,每個(gè)單元承擔(dān)對(duì)落入該區(qū)域內(nèi)目標(biāo)進(jìn)行檢測(cè)的任務(wù);每個(gè)單元分別預(yù)測(cè)B個(gè)包圍框(bounding boxes)、包圍框的置信度及C種類別的概率。
YOLOv2 算法引入了R-CNN 算法中錨框(anchor boxes)的策略,采用錨框來提高目標(biāo)定位的準(zhǔn)確度,同時(shí),采用ImageNet 分類數(shù)據(jù)集和COCO 檢測(cè)數(shù)據(jù)聯(lián)合訓(xùn)練的方式,來提高算法的分類和檢測(cè)性能。
YOLOv3 算法為了讓檢測(cè)性能得到進(jìn)一步提高,在YOLOv2 的基礎(chǔ)上,借鑒了ResNet 中的殘差結(jié)構(gòu)的思路,使得網(wǎng)絡(luò)的深度進(jìn)一步得到加深,將原來的Darknet19 網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化成Darknet53 網(wǎng)絡(luò)結(jié)構(gòu),這樣可使網(wǎng)絡(luò)模型能更好地提取高層結(jié)構(gòu)中的語義特征,同時(shí),該算法采用了特征金字塔網(wǎng)絡(luò)(feature pyramind network,F(xiàn)PN)算法的策略,生成3 個(gè)不同維度的特征張量,進(jìn)行多尺度預(yù)測(cè),從而使得該算法適應(yīng)于不同尺度大小的目標(biāo)檢測(cè)任務(wù)。
YOLOv4 算法在YOLOv3 的基礎(chǔ)上采用了CSPDarknet53 和空間金字塔池化(spatial pyramid pooling,SPP)結(jié)構(gòu),提高了檢測(cè)器的檢測(cè)精度能力。
YOLOv5 算法采用了Focus、PANet 等模型結(jié)構(gòu),同時(shí)采用了自適應(yīng)特征池化的方法,用于聚合多特征層上的信息路徑,從而提高了模型預(yù)測(cè)的準(zhǔn)確性。
就算法主體的網(wǎng)絡(luò)構(gòu)建而言,YOLOv3 算法與YOLOv4/YOLOv5 算法基本相同,算法的核心思想沒有太大變化;就參數(shù)量而言,YOLOv3 算法參數(shù)量相對(duì)較少,具有運(yùn)算速度更快的優(yōu)勢(shì),故本文選擇對(duì)YOLOv3算法進(jìn)行相應(yīng)的改進(jìn)和優(yōu)化。
本文主要是在YOLOv3 算法網(wǎng)絡(luò)基礎(chǔ)上進(jìn)行兩方面的優(yōu)化和改進(jìn),如圖1 所示。第一,采用Kmeans++聚類算法對(duì)訓(xùn)練集的先驗(yàn)框進(jìn)行聚類,使得深度學(xué)習(xí)算法訓(xùn)練速度更快,便于網(wǎng)絡(luò)模型收斂;第二,對(duì)YOLOv3 算法網(wǎng)絡(luò)結(jié)構(gòu),采用模型壓縮算法中的模型剪枝技術(shù)進(jìn)行裁剪,使得網(wǎng)絡(luò)能夠在不損失較大算法精度條件下,提高算法的運(yùn)行速率。
圖1 YOLOv3的模型優(yōu)化Fig.1 Optimization of YOLOv3
在Faster R-CNN 算法[3]當(dāng)中,錨框的初始值是人為設(shè)定的,而初始值會(huì)影響算法訓(xùn)練的收斂效果,所以根據(jù)應(yīng)用場(chǎng)景中的目標(biāo)尺寸來設(shè)定網(wǎng)絡(luò)模型中錨框的初始值是非常必要的。因此,針對(duì)錨框的初始值設(shè)定,使用聚類算法對(duì)數(shù)據(jù)集當(dāng)中的目標(biāo)相關(guān)信息進(jìn)行錨框聚類,以便獲取比較好的初始值設(shè)定。
聚類算法[4],是一種無監(jiān)督的策略,一般而言,數(shù)據(jù)的聚類中心選擇得越好,算法訓(xùn)練效果就越佳。本文使用K-means++算法進(jìn)行數(shù)據(jù)集的聚類。聚類數(shù)據(jù)為目標(biāo)的檢測(cè)數(shù)據(jù),數(shù)據(jù)格式為(xj,yj,wj,hj),j=1,2,…,N,其 中(xj,yj)是錨框的左下角坐標(biāo)值,(wj,hj)是錨框的寬度和高度,N是錨框的數(shù)量。
首先,隨機(jī)選取k個(gè)樣本點(diǎn)數(shù)據(jù),由于錨框的坐標(biāo)值是確定的,因此本文采用錨框的寬度和高度作為樣本數(shù)據(jù),接著計(jì)算其他數(shù)據(jù)從而獲取其他聚類中心。
在初始化樣本點(diǎn)以后,計(jì)算其他點(diǎn)到聚類中心的距離,選取距離最近點(diǎn)成為自身的聚類中心,所有點(diǎn)分配完成以后,對(duì)樣本點(diǎn)形成的簇重新更新聚類中心,更新的計(jì)算形式為Wi=∑wi Ni和Hi=∑hi Ni,其中Ni為第i簇的樣本點(diǎn)個(gè)數(shù);不斷迭代上述計(jì)算過程,直到值的改變量幾乎不變的時(shí)候,便獲取到最終的聚類中心,進(jìn)而確定錨框的初始大小。
聚類算法中,樣本點(diǎn)間的距離一般使用歐氏距離來評(píng)估,數(shù)據(jù)集中目標(biāo)尺度的大小可以分為:大尺度、中尺度和小尺度。采用歐氏距離計(jì)算時(shí),會(huì)使得大的錨框比小的錨框誤差更大。因而采用錨框和真實(shí)框有更大的重疊度(intersection over union,IOU)來評(píng)估樣本點(diǎn)之間的間距,從而避免受到錨框大小的影響,所以算法改進(jìn)時(shí)采用Jake 距離,可適應(yīng)不同目標(biāo)的尺度,如式(1)所示。
式中:Bbb為樣本的錨框;Ccc為聚類中心;IOU(Bbb,Ccc)為錨框與聚類值的重疊度。IOU 如式(2)所示,表示預(yù)測(cè)的準(zhǔn)確度。
式中:Bgt表示真實(shí)框;Bdt表示預(yù)測(cè)框。
結(jié)合式(1)和(2),最終距離可由式(3)計(jì)算。
采用聚類算法以后,算法訓(xùn)練過程收斂變得更快。根據(jù)實(shí)際應(yīng)用領(lǐng)域?qū)λO(shè)計(jì)的網(wǎng)絡(luò)進(jìn)行重新聚類。
本文中,模型壓縮算法主要采用模型通道剪枝[5]的方法,該方法分5 個(gè)步驟執(zhí)行,如圖2 所示。第一步,初始化網(wǎng)絡(luò),可選擇高斯初始化或全零初始化等方案,本文采用隨機(jī)初始化方案;第二步,基于通道稀疏正則化的方法進(jìn)行訓(xùn)練,在網(wǎng)絡(luò)中加入通道因子用于識(shí)別作用較小的通道(或神經(jīng)元),這有利于在下面的流程中對(duì)網(wǎng)絡(luò)進(jìn)行通道級(jí)別的裁剪;第三步,裁剪網(wǎng)絡(luò),采用通道因子加入到網(wǎng)絡(luò)層當(dāng)中對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行剪枝,從而稀疏稠密的網(wǎng)絡(luò)結(jié)構(gòu)[6];第四步,微調(diào)網(wǎng)絡(luò),重新訓(xùn)練被裁剪后的網(wǎng)絡(luò)結(jié)構(gòu)中剩余神經(jīng)元連接的權(quán)值,不斷迭代訓(xùn)練,直到滿足網(wǎng)絡(luò)模型準(zhǔn)確度等指標(biāo)要求后,便得到最終壓縮后的網(wǎng)絡(luò)模型;最后,將壓縮后的網(wǎng)絡(luò)模型輸出。
圖2 模型剪枝流程Fig.2 Process of model pruning
這種方法的主要實(shí)現(xiàn)途徑是對(duì)網(wǎng)絡(luò)模型中的批量歸一化(batch normalization,BN)層中的通道因子γ加入正則化約束[7]。
每個(gè)通道因子γ對(duì)應(yīng)特定的網(wǎng)絡(luò)層通道,通過L1正則化能夠辯知作用較小的通道(或神經(jīng)元)。這有助于開展后續(xù)模型裁剪。當(dāng)作用較小的通道被裁剪的時(shí)候,可能會(huì)暫時(shí)使網(wǎng)絡(luò)性能變?nèi)?,但后續(xù)可對(duì)裁剪后的網(wǎng)絡(luò)進(jìn)行微調(diào)用于彌補(bǔ)裁剪的影響。相比較于起始的網(wǎng)絡(luò)結(jié)構(gòu),裁剪后的網(wǎng)絡(luò)結(jié)構(gòu)在模型大小、運(yùn)行時(shí)內(nèi)存和計(jì)算量等方面更加輕量化[8]。
圖3 為通道裁剪示意圖,當(dāng)通道因子γ的值幾乎等于0時(shí),就斷開網(wǎng)絡(luò)層之間相應(yīng)輸入和輸出的連接,反之,保留網(wǎng)絡(luò)層之間的連接。如圖3所示,當(dāng)通達(dá)因子γ為橙色顯示的極小值時(shí),相關(guān)連接就被刪除,而藍(lán)色表示的網(wǎng)絡(luò)連接就會(huì)被保留[9]。由于通道因子與網(wǎng)絡(luò)權(quán)重是共同訓(xùn)練的,這就使得該策略能夠在保留原模型性能的同時(shí)對(duì)通道進(jìn)行裁剪。
圖3 通道裁剪示意圖Fig.3 Diagram of channel pruning
對(duì)模型中的通道進(jìn)行裁剪,會(huì)降低網(wǎng)絡(luò)模型的準(zhǔn)確度,因此,需對(duì)訓(xùn)練后的模型進(jìn)行微調(diào)[10]。采用整個(gè)數(shù)據(jù)集對(duì)裁剪后的模型再一次進(jìn)行網(wǎng)絡(luò)訓(xùn)練,恢復(fù)起始模型的準(zhǔn)確度;最后,便產(chǎn)生了一個(gè)裁剪后性能基本不變的網(wǎng)絡(luò)模型。
本文的試驗(yàn)環(huán)境為:①處理器型號(hào),AMD Ryzen5 2600X@3.6GHz;②存儲(chǔ)配置,16GRAM,512G SSD;③顯卡配置,NVIDIA GTX1080Ti;④操作系統(tǒng),Windows 10(64 位);⑤軟件平臺(tái),Python3.5、Pytorch1.3.0(GPU版)。
本文采用KITTI 公開數(shù)據(jù)集,因此,需將該數(shù)據(jù)集標(biāo)注的txt 數(shù)據(jù)格式轉(zhuǎn)化為VOC 數(shù)據(jù)集XML 格式[11];然后,采用K-means++聚類算法對(duì)6 500 張訓(xùn)練集數(shù)據(jù)進(jìn)行錨框聚類。聚類后的這九個(gè)錨框大小的結(jié)果從小到大為:(22,19),(46,29),(39,54),(86,52),(71,108),(139,86),(106,161),(231,130)和(289,188);接著,對(duì)錨框中的位置數(shù)據(jù)進(jìn)行歸一化處理,進(jìn)而提升模型的訓(xùn)練效果。
在神經(jīng)網(wǎng)絡(luò)壓縮的試驗(yàn)階段中主要包括了模型的基礎(chǔ)訓(xùn)練、稀疏訓(xùn)練、模型剪枝和模型微調(diào)4 個(gè)步驟[12]。
第一步是基礎(chǔ)訓(xùn)練,主要是為獲取一個(gè)高精度的初始化模型,它的精度和參數(shù)選擇對(duì)后續(xù)階段的訓(xùn)練有著至關(guān)重要的作用。第二步是稀疏訓(xùn)練,使用通道因子對(duì)網(wǎng)絡(luò)模型的權(quán)重分布進(jìn)行重新調(diào)整。第三步是通道剪枝,裁剪作用較小的通道或神經(jīng)單元。第四步是模型微調(diào),剪枝后的網(wǎng)絡(luò)或許會(huì)導(dǎo)致網(wǎng)絡(luò)模型的精度降低,因而對(duì)網(wǎng)絡(luò)模型進(jìn)行微調(diào),從而復(fù)原起始的網(wǎng)絡(luò)模型準(zhǔn)確度。
圖4 所示為訓(xùn)練效果,綠色線部分展現(xiàn)的是基礎(chǔ)訓(xùn)練,紅色線展現(xiàn)的是稀疏訓(xùn)練。在基礎(chǔ)訓(xùn)練過程中,訓(xùn)練的圖像批次數(shù)量(batch_size)設(shè)置為32 張,基礎(chǔ)訓(xùn)練總次數(shù)(epochs)設(shè)置為100 次。稀疏化訓(xùn)練過程中,訓(xùn)練的圖像批次數(shù)量設(shè)置為32 張,總訓(xùn)練次數(shù)設(shè)置為280 次。由圖4 可以看出YOLOv3 模型稀疏化訓(xùn)練后模型mAP的變化趨勢(shì),模型的準(zhǔn)確度在不斷地上升,平均準(zhǔn)確度mAP在0.8之后變化趨于平穩(wěn)。
圖4 基礎(chǔ)訓(xùn)練和稀疏訓(xùn)練效果Fig.4 Results of basic training and sparse training
本文的裁剪率參數(shù)設(shè)定為80%,模型微調(diào)的訓(xùn)練參數(shù)中,訓(xùn)練的圖像批次大小設(shè)為32 張,總訓(xùn)練次數(shù)設(shè)為100 次。表1 所示為模型裁剪前后的試驗(yàn)結(jié)果對(duì)比,可以看出模型的參數(shù)量、計(jì)算量都有著非常大的下降,而剪枝后算法模型的運(yùn)行速率是未剪枝算法模型的2 倍左右,而網(wǎng)絡(luò)模型的平均準(zhǔn)確度mAP 沒有太大的損失。試驗(yàn)結(jié)果顯示,對(duì)網(wǎng)絡(luò)模型進(jìn)行網(wǎng)絡(luò)剪枝,能保證原算法模型準(zhǔn)確度不損失的同時(shí),明顯加快網(wǎng)絡(luò)模型的運(yùn)行速率。
表1 YOLOv3模型剪枝前后對(duì)比Tab.1 Comparison of YOLOv3 model pruning and unpruning
為了更直觀驗(yàn)證,使用通道剪枝后的YOLOv3 算法對(duì)KITTI測(cè)試集上的圖片進(jìn)行場(chǎng)景內(nèi)的物體測(cè)試,如圖5所示。
圖5 測(cè)試效果Fig.5 Test result
由圖5 測(cè)試結(jié)果可以看出,采用通道剪枝后的YOLOv3網(wǎng)絡(luò)模型依然擁有著較好的檢測(cè)性能。
本文提出了一種基于神經(jīng)網(wǎng)絡(luò)模型壓縮技術(shù)的目標(biāo)檢測(cè)算法。先采用K-means++算法對(duì)數(shù)據(jù)集的先驗(yàn)框進(jìn)行聚類;接著采用基于模型通道剪枝的模型壓縮算法對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行模型壓縮;最后通過試驗(yàn)驗(yàn)證了使用模型通道剪枝裁剪YOLOv3 模型有良好效果。可以看出,本文在保持著高準(zhǔn)確度的情況下,能減小模型的參數(shù)數(shù)量和模型體積,也能有效提高模型的運(yùn)行速度。