張 蓮 余松林
(重慶理工大學(xué)電氣與電子工程學(xué)院 重慶 400054)
深度卷積神經(jīng)網(wǎng)絡(luò)無論是在圖像識別、目標(biāo)檢測或是語義分割上均有不錯的表現(xiàn)。傳統(tǒng)的CNN達(dá)到良好的性能往往是基于大量的參數(shù)和浮點(diǎn)運(yùn)算(Floating point operations,FLOPs)才能實(shí)現(xiàn)的。但是隨著計算機(jī)視覺任務(wù)的發(fā)展,以及各種人工智能行業(yè)(智能手機(jī)、無人駕駛汽車等)的興起,深度神經(jīng)網(wǎng)絡(luò)的設(shè)計更加趨于可移動設(shè)備所需求的高效小型網(wǎng)絡(luò)模型,但目前所存在的問題是便攜式設(shè)備被應(yīng)用在了工業(yè)的各個環(huán)節(jié),輕量化網(wǎng)絡(luò)模型的發(fā)展跟不上便攜式設(shè)備的應(yīng)用需求。
近些年來,眾多學(xué)者已經(jīng)對緊湊型神經(jīng)網(wǎng)絡(luò)進(jìn)行了一系列研究,并取得了可觀的成就。MobileNet是Google公司公布在CVPR2017上的一款輕量型網(wǎng)絡(luò),提出了一種新的卷積方式來設(shè)計網(wǎng)絡(luò),其特點(diǎn)是引入了深度可分離卷積。首先利用逐通道卷積獲取特征圖,一個卷積核負(fù)責(zé)一個通道,其次用逐點(diǎn)卷積串聯(lián)特征圖,避免輸出特征圖中只包含了局部特征的問題,取得了較好的效果[1]。不久之后由Face++團(tuán)隊在arXiv上公開的ShuffleNet也用了類似的方式進(jìn)行了網(wǎng)絡(luò)設(shè)計,采用了分組卷積對特征圖進(jìn)行獲取,再用Shuffle操作打亂各個特征圖的通道以構(gòu)成新的特征圖,解決由分組卷積所帶來的信息交流不通暢的問題[2]。可以看出,輕量化模型目前主要得益于使用深度可分離卷積和分組卷積來減少參數(shù),再解決信息交流不通暢的問題從而完成網(wǎng)絡(luò)設(shè)計。雖然都取得了不錯的成果,但網(wǎng)絡(luò)設(shè)計目前還停留在互相借鑒的階段,輕量化網(wǎng)絡(luò)沒有什么突破性進(jìn)展。而且MobileNet和ShuffleNet大量使用1×1卷積,依然會產(chǎn)生較大的計算量,這與網(wǎng)絡(luò)設(shè)計的初衷相悖。
直到華為諾亞方舟實(shí)驗(yàn)室在CVPR2020公布了一篇輕量級網(wǎng)絡(luò)論文GhostNet,其核心思想為利用線性變換來生成新的特征圖,從而達(dá)到減少計算量的目的[3]。本文借助該思想設(shè)計了一個輕量級角點(diǎn)檢測的特征提取網(wǎng)絡(luò),網(wǎng)絡(luò)通過Ghost Bottleneck與堆疊沙漏相融合,較目前主流輕量級角點(diǎn)檢測網(wǎng)絡(luò)而言,無論是在準(zhǔn)確性和快速性上都具有一定的提升。由于本模型相當(dāng)于CornerNet的新型輕量級改進(jìn)網(wǎng)絡(luò),故將其命名為CornerNet-Ghost。
為了保證對輸入圖像的充分學(xué)習(xí),訓(xùn)練好的網(wǎng)絡(luò)中含有豐富的特征圖,其中不乏有兩幅相似的特征圖,將這兩幅圖設(shè)為對方的幽靈(Ghost)。文獻(xiàn)[3]認(rèn)為這些冗余的特征圖是網(wǎng)絡(luò)進(jìn)行目標(biāo)檢測的關(guān)鍵因素之一,所以與其去除它們,不如以一種廉價且高效的方式來獲取這些特征圖。Ghost Module正是在做這個工作,如圖1所示。
(a) 普通卷積工作方式
常規(guī)卷積操作如圖1(a)所示,輸入特征圖為X∈Rc×h×w(c表示輸入通道數(shù),h和w分別為輸入的高和寬),卷積操作如式(1)所示,Y∈Rh′×w′×n為輸出的n維特征圖,f∈Rc×k×k×n(k為卷積核大小)為該層的卷積核,b為偏置,由此可得該層的計算量如式(2)所示的OFLPs1,由于n和c通常都會很大,因此計算量和參數(shù)量會相應(yīng)的更大。
Y=X*f+b
(1)
OFLPs1=n·h′·w′·c·k·k
(2)
(3)
因此,上述兩種方式計算量之比如式(4)所示。
(4)
與主流輕量級模型卷積相比,Ghost Module有以下不同點(diǎn):
(1) 無論是MobileNet、ShuffleNet還是SqueezeNet,都大量使用1×1的逐點(diǎn)卷積,而Ghost Module中卷積核大小能夠自定義。
(2) 主流的大部分方法都是采用深度可分離卷積進(jìn)行降維以及特征提取,Ghost Module先是進(jìn)行原始卷積操作,再通過簡單的線性變換來獲取更多的特征。
(3) Ghost Module采用線性變換處理特征圖,可以有很大的多樣性。
(4) Ghost同樣使用了Identity mapping來保持原有特征。
Ghost Bottleneck是基于Ghost Module設(shè)計而來,如圖2所示,模型設(shè)計思路來自于輕量型網(wǎng)絡(luò)MobileNet V2,采用反殘差結(jié)構(gòu)。傳統(tǒng)的殘差結(jié)構(gòu)設(shè)計思路是先將特征用1×1的卷積核降維,其次采用3×3卷積核進(jìn)行濾波,最后再用1×1卷積升維并與Short Connection相加。而反殘差結(jié)構(gòu)反其道而行之,先升維再降維[4]。采用這種結(jié)構(gòu)是因?yàn)槟K的輸入包含了整體特征的必要信息,升維會讓信息更加豐富甚至冗余,再進(jìn)行降維,如此理論上可以保證信息不丟失從而保證檢測精度。具體結(jié)構(gòu)如圖2所示。
(a) (b)
Ghost Bottleneck分為步長(stride)為1和2兩種情況,分別如圖2(a)和圖2(b)所示。利用第一個Ghost Module升維,升維后的通道數(shù)與輸入通道數(shù)的比值稱為擴(kuò)展比,第二個Ghost Module降維,然后與Short Connection相加。除此之外在stride=2的模塊中,為保證信息處理的快速性,兩個Ghost Module間插入了stride為2的深度卷積。
沙漏網(wǎng)絡(luò)最初是Newell等[5]提出的一種用于檢測人體關(guān)鍵點(diǎn)的特征提取網(wǎng)絡(luò),在當(dāng)時取得了顛覆性的成就,因?yàn)槠鋸?qiáng)大的性能,一直到今天各個基于角點(diǎn)的目標(biāo)檢測模型仍然沿用沙漏網(wǎng)絡(luò)及其變體作為骨干網(wǎng)絡(luò),本文同樣采用兩個四階沙漏網(wǎng)絡(luò)堆疊再融合Ghost Bottleneck作為特征提取網(wǎng)絡(luò)。單個四階網(wǎng)絡(luò)模型如圖3所示。
圖3 沙漏網(wǎng)絡(luò)結(jié)構(gòu)
向下箭頭表示進(jìn)行一次下采樣,本文不采用池化方式,而是用步長為2的卷積來降低分辨率,每次下采樣之前設(shè)計一次跳連接保留原尺度信息。一共進(jìn)行四次下采樣,之所以使用多次是由于對不同尺度的特征進(jìn)行提取可以彌補(bǔ)下采樣導(dǎo)致的信息丟失,保證檢測精度。每次下采樣后通道數(shù)變成(256,256,384,512)。向上箭頭表示上采樣用于恢復(fù)分辨率保持輸入與輸出的特征圖分辨率一致,本文不使用近鄰插值法,而是用4×4卷積進(jìn)行升維。
實(shí)際上一個沙漏網(wǎng)絡(luò)就已經(jīng)可以實(shí)現(xiàn)特征提取,但是本文采用了兩個沙漏網(wǎng)絡(luò)堆疊而成的模型,因?yàn)楦鱾€點(diǎn)的位置是可以相互參考的。比如在人體姿態(tài)估計中,知道腰部位置后可以更好地預(yù)測膝蓋位置,知道膝蓋位置后又可以更好地預(yù)測踝關(guān)節(jié)位置。因此將第一個沙漏網(wǎng)絡(luò)提取的特征作為第二個沙漏網(wǎng)絡(luò)的輸入,實(shí)際上是在給第二個沙漏網(wǎng)絡(luò)提供關(guān)鍵點(diǎn)相互參考的預(yù)測信息,也就意味著第二個沙漏網(wǎng)絡(luò)在使用關(guān)鍵點(diǎn)的相互關(guān)系,能進(jìn)一步提升預(yù)測精度。
兩個沙漏網(wǎng)絡(luò)之間引入了中繼監(jiān)督對每個網(wǎng)絡(luò)進(jìn)行預(yù)測[5],即對中間輸出的熱點(diǎn)圖(Heatmap)計算損失。將第一個沙漏網(wǎng)絡(luò)輸出的特征先經(jīng)過一個1×1的全卷積網(wǎng)絡(luò),再分為兩個分支,上半分支在經(jīng)過1×1的卷積后輸入下一個沙漏網(wǎng)絡(luò)。下半分支生成與輸入相同尺寸的Heatmap,最后經(jīng)過1×1的卷積進(jìn)入下一個網(wǎng)絡(luò)。
另外設(shè)計采用了一些小細(xì)節(jié)上的處理,假設(shè)網(wǎng)絡(luò)輸入大小為512×512,由于輸入圖像的分辨率都較大,如果直接輸入網(wǎng)絡(luò)的話會導(dǎo)致計算了太大致使推理速度很慢,因此圖像在輸入沙漏網(wǎng)絡(luò)之前都先經(jīng)過一個7×7的卷積將圖像分辨率縮小為原來的四分之一,后面添加兩個Ghost Module進(jìn)行降采樣且將通道數(shù)增加至256,也就是說在輸入沙漏網(wǎng)絡(luò)之前已經(jīng)對圖像進(jìn)行了三次降采樣,相當(dāng)于對圖像進(jìn)行預(yù)處理。最后,將該特征提取網(wǎng)絡(luò)命名為Hourglass-Ghost。
網(wǎng)絡(luò)模型可細(xì)分為特征提取模塊與預(yù)測模塊,特征提取模塊如前文設(shè)計所示,預(yù)測模塊借助了Cornernet的結(jié)構(gòu),因此整體網(wǎng)絡(luò)類似于一個Cornernet的改進(jìn)版本。在骨干網(wǎng)絡(luò)后面設(shè)置了兩個預(yù)測模塊,一個負(fù)責(zé)左上角點(diǎn)的預(yù)測,另一個負(fù)責(zé)右下角點(diǎn)的預(yù)測,與CornerNet一樣有Heatmaps、Embeddings和Offsetss三個輸出[6]。整體模型如圖4所示。
圖4 網(wǎng)絡(luò)整體模型
輸出處理流程與文獻(xiàn)[6]相同:先對Heatmaps進(jìn)行非極大值抑制,取Top70的左上角點(diǎn)和Top70的右下角點(diǎn)。隨后用Offset矯正角點(diǎn)位置,在尺寸的縮放過程中運(yùn)用了取整操作,造成精度丟失,因此需要位置矯正。然后在Embeddings中找到同一物體的兩個角點(diǎn)進(jìn)行配對和畫框。
除了骨干網(wǎng)絡(luò)不同以外,本文改進(jìn)了CornerNet中采用的角點(diǎn)池化(Corner Pooling)。改進(jìn)如圖5所示。
鑒于要使用左上角點(diǎn)和右下角點(diǎn)以矩形的方式完全包圍待檢測物體,因此角點(diǎn)一般都會在物體之外,CornerNet使用Corner Pooling來尋找角點(diǎn),即通過沿邊界最大值來確定角點(diǎn),原理如圖5(a)所示。但這種方式使網(wǎng)絡(luò)只關(guān)注了外部信息,對待測物體全局信息獲取能力較弱,也就是說這樣會導(dǎo)致算法對目標(biāo)框過于敏感,在選取關(guān)鍵點(diǎn)和畫框的時候容易出現(xiàn)誤選或者漏選等問題。因此為了獲取更多待測目標(biāo)的內(nèi)部信息,本文在Corner Pooling的基礎(chǔ)上進(jìn)行改進(jìn),稱之為級聯(lián)角點(diǎn)池化(Cascade Corner Pooling)[7],原理如圖5(b)所示,沿邊界尋找最大值,根據(jù)邊界沿物體內(nèi)部方向?qū)ふ易畲笾?將兩個最大值相加。通過這樣的改進(jìn)獲取的角點(diǎn)帶有邊界信息和內(nèi)部信息,能有效地避免畫框失敗,提升算法檢測準(zhǔn)確率。
由于結(jié)構(gòu)上的類似,Loss計算以及一些超參數(shù)設(shè)置方面仍然沿用了CornerNet的設(shè)計。
實(shí)驗(yàn)數(shù)據(jù)來自BUERHOP_LUTZ[8]等公開的太陽能電池缺陷數(shù)據(jù)集,對這些圖像進(jìn)行篩選,去除無法進(jìn)行檢測的圖像,最后選出有缺陷以及正常圖像2 000幅,大小為300×300,缺陷種類分為裂紋、斷柵、缺角和黑斑等,并進(jìn)行標(biāo)注,制作成JSON格式的數(shù)據(jù)集。為了解決缺陷分布不均勻造成檢測效率降低的問題,采用隨機(jī)翻轉(zhuǎn)以及垂直翻轉(zhuǎn)的方法對數(shù)據(jù)集進(jìn)行擴(kuò)充,保證檢測的準(zhǔn)確性。
實(shí)驗(yàn)所采用的計算機(jī)內(nèi)存為16 GB,顯存為6 GB,運(yùn)行環(huán)境為Windows 10 64位系統(tǒng),GPU為NVIDIA 1660s,在Anaconda虛擬環(huán)境下環(huán)境配置為:Python 3.7.4,CUDA10.0.0,PyTorch 1.0.0。
實(shí)驗(yàn)數(shù)據(jù)集分為訓(xùn)練集、驗(yàn)證集以及測試集,劃分占比為70%、15%和15%。采用批量訓(xùn)練的方法,由于設(shè)備限制,采取batch=4的方式訓(xùn)練,初始學(xué)習(xí)率設(shè)定為0.000 5,每迭代3萬次下降為原來的十分之一,使用Adam優(yōu)化訓(xùn)練損失。
由于CornerNet也是采用堆疊沙漏網(wǎng)絡(luò)作為骨干網(wǎng)絡(luò)的目標(biāo)檢測算法,CornerNet-Squeeze是基于CornerNet的輕量級網(wǎng)絡(luò)改進(jìn),精度較CornerNet較差但是檢測速度快。因此與這兩種網(wǎng)絡(luò)做對比實(shí)驗(yàn),驗(yàn)證融合Ghost Bottleneck的沙漏網(wǎng)絡(luò)以及Cascade Corner Pooling的性能到底如何。
由文獻(xiàn)[3]可知,當(dāng)d=3且s=2時Ghost Module處于最佳性能點(diǎn)。因此本文沿用了原文的d與s,比較了CornerNet-Ghost、CornerNett、CornerNet-Squeeze的精度與效率權(quán)衡曲線,這種方式開始是在CornerNet-Lite中提出的[9],即在原始圖像分辨率的不同單尺度下進(jìn)行評估,包括0.5、0.6、0.7、0.8、0.9和1.0(原始圖像分辨率),從而找出網(wǎng)絡(luò)的最佳性能點(diǎn)。由圖6可知CornerNet-Ghost的最佳性能點(diǎn)為(50.0 ms,78.2%),即網(wǎng)絡(luò)整體檢測精度能達(dá)到78.2%的測試AP值,且檢測每幅圖像的平均推理時間為50.0 ms。而Cornernet和CornerNet-Squeeze分別達(dá)到了(230.1 ms,79.1%)和(59.3 ms,72.6%)。
圖6 精度與效率權(quán)衡曲線
由于算法設(shè)計的初衷是適用于便攜設(shè)備,因此模型除了對算法的準(zhǔn)確性有要求以外,更看重算法檢測的實(shí)時性。常用的目標(biāo)檢測算法分為單階段和二階段算法,單階段算法實(shí)時性高但準(zhǔn)確性一般,同時根據(jù)畫框方式可分為基于anchors和基于角點(diǎn)兩種,Cornernet-Ghost為基于角點(diǎn)的單階段檢測算法;二階段準(zhǔn)確性高但是耗時太長。因此前者一般用于在線實(shí)時檢測,后者用于離線檢測。
因此本文在同一數(shù)據(jù)集下,除了將前文提到的三種算法的檢測結(jié)果進(jìn)行了對比以外,還另外引進(jìn)了經(jīng)典的基于anchors的單階段算法YOLO v3和RetinaNet,與CornerNet-Ghost做對比分析,檢測結(jié)果如表1所示。
表1 檢測結(jié)果
由表1可知,AP為目標(biāo)檢測評價指標(biāo),APs、APm、APl分別對應(yīng)小(較長邊小于32)、中(較長邊介于32-192之間)、大(較長邊大于192)目標(biāo)。在同為輕量級檢測網(wǎng)絡(luò)的基礎(chǔ)上,CornerNet-Ghost相較于CornerNet-Squeeze而言,推理時間減少了9.1 ms,而AP卻增長了5.8%,且無論大、中、小目標(biāo)的檢測精度都是CornerNet-Ghost更高。此外,在CornerNet-Ghost與CornerNet的對比中可以發(fā)現(xiàn)前者AP值略低于后者,原因是后者所采用的骨干網(wǎng)絡(luò)是未經(jīng)輕量化改進(jìn)的堆疊沙漏網(wǎng)絡(luò),性能強(qiáng)大,但缺點(diǎn)是計算量較大,檢測時間較長,而CornerNet-Ghost只用了CornerNet所花時間的21%就能達(dá)到與其相接近的效果。在與基于anchors的單階段算法對比中可以得出,CornerNet-Ghost的綜合性能要強(qiáng)于YOLO v3與RetinaNet。綜上可知,CornerNet-Ghost是一款性能領(lǐng)先于當(dāng)前主流單階段算法的目標(biāo)檢測模型。
由上文所示,單階段目標(biāo)檢測模型可分為基于anchors和基于角點(diǎn)兩種,因此將Hourglass-Ghost作為骨干網(wǎng)絡(luò),應(yīng)用于YOLO v3和CornerNet-Squeeze中觀察其性能,實(shí)驗(yàn)結(jié)果如表2所示。
表2 Hourglass-Ghost對不同算法的影響
由表2可知,Hourglass-Ghost的應(yīng)用讓CornerNet-Squeez的性能得到提升,應(yīng)用于YOLO v3卻造成了準(zhǔn)確性降低,說明其更適用于角點(diǎn)檢測網(wǎng)絡(luò)中。究其原因在于Hourglass-Ghost采用的堆疊沙漏網(wǎng)絡(luò)結(jié)構(gòu)與中繼監(jiān)督設(shè)計,在角點(diǎn)檢測任務(wù)中具有很大的優(yōu)勢,但在基于anchors的算法中相當(dāng)于無用操作,直接影響檢測的準(zhǔn)確率。
FLOPs(Floating point operations)意思是指浮點(diǎn)運(yùn)算數(shù),可以理解為計算量,常用來衡量一個算法/模型的復(fù)雜度[10]。計算方法是由NVIDIA公司發(fā)表文章提出的[11],具體如式(5)所示。
OFLPs=2HW(CinK2+1)Cout
(5)
式中:H、W和Cin指輸入的高、寬和通道數(shù),K指卷積核的大小,Cout指輸出通道數(shù)。由于CornerNet網(wǎng)絡(luò)較為復(fù)雜,計算量與參數(shù)量遠(yuǎn)大于另外兩個網(wǎng)絡(luò),因此本文將兩種輕量級模型CornerNet-Ghost和CornerNet-Squeeze的FLOPs做對比,如表3所示。
表3 計算量對比
由表3可知,相比于CornerNet-Squeeze,CornerNet-Ghost的計算量更小,模型更簡單,卻能達(dá)到更好的效果,充分說明了本文設(shè)計網(wǎng)絡(luò)的優(yōu)越性。
前文已經(jīng)論證了CornerNet-Ghost與同類型網(wǎng)絡(luò)相比擁有更優(yōu)秀的性能。為了明確各個網(wǎng)絡(luò)模塊對推理時間的影響,通過控制不同模塊的添加觀察其對性能的影響。實(shí)驗(yàn)結(jié)果如表4所示。
表4 檢測時間影響因素
在CornerNet中,進(jìn)入沙漏網(wǎng)絡(luò)前會有7×7的卷積和殘差模塊對輸入進(jìn)行兩次降采樣,相對應(yīng)的在CornerNet-Ghost中設(shè)置了7×7卷積以及兩個Ghost Module,一共進(jìn)行了三次降采樣。如此可將檢測時間減少58.9 ms。此外Hourglass-Ghost的采用減少了123.8 ms,充分說明了輕量級改進(jìn)的有效性。最后引進(jìn)Cascade Corner Pooling,是對原來Corner Pooling的改進(jìn),雖然會增加模型的復(fù)雜度,增加了少量的檢測時間,但是卻對AP有不小的提升。
針對現(xiàn)有輕量型目標(biāo)檢測網(wǎng)絡(luò)較少的情況,本文通過改進(jìn)CornerNet,設(shè)計出其輕量化改進(jìn)模型CornerNet-Ghost。設(shè)計采用了自主設(shè)計輕量型特征提取網(wǎng)絡(luò):Hourglass-Ghost,并通過基于角點(diǎn)的方式對目標(biāo)進(jìn)行檢測。模型仍在角點(diǎn)池化中做出改進(jìn)。最后,通過對比效率與精度權(quán)衡曲線、目標(biāo)檢測結(jié)果與計算量等指標(biāo),證明CornerNet-Ghost擁有更優(yōu)秀的性能。此外,本文還驗(yàn)證了Hourglass-Ghost只對基于角點(diǎn)的目標(biāo)檢測網(wǎng)絡(luò)有提升作用,并對算法進(jìn)行消融實(shí)驗(yàn)分析,明確了各個模塊對檢測時間與檢測精度的影響。在后續(xù)研究中,將會加強(qiáng)算法的泛化能力和可遷移性,使其能適用于更多目標(biāo)檢測的任務(wù)中。