李悅言,程培濤,杜淑幸
(西安電子科技大學 機電工程學院,陜西 西安 710071)
近年來,基于深度學習的目標檢測取得了突破性的進展,成為目標檢測研究的主流方向[1]?;谏疃葘W習的目標檢測算法可以分為基于候選區(qū)域的算法和基于回歸的算法[2]。基于候選區(qū)域的算法因為有區(qū)域建議網(wǎng)絡指導錨框的生成,所以檢測精度較高,代表算法有基于區(qū)域的卷積神經(jīng)網(wǎng)絡算法(R-CNN)[3]、基于區(qū)域的快速卷積神經(jīng)網(wǎng)絡算法(Fast R-CNN)[4]、基于區(qū)域的全卷積神經(jīng)網(wǎng)絡算法(R-FCN)[5]和基于區(qū)域建議網(wǎng)絡的實時目標檢測算法(Faster R-CNN)[6]等?;诨貧w的算法因為既沒有區(qū)域建議網(wǎng)絡,也沒有預設的錨框,所以檢測精度比基于候選區(qū)域的算法低,但檢測速度相對占優(yōu)。另外,基于候選區(qū)域的目標檢測算法在一定程度上依賴于預先設定的錨框,這些錨框可以涵蓋大部分目標,但對于形變較大或者形狀不規(guī)則的目標檢測誤差較大;而基于回歸的算法不依賴于預先設定的錨框,通過對預測框進行分類和回歸得到最終的邊界框,能夠準確檢測不規(guī)則的目標,代表算法有YOLO[7]、單步多框目標檢測算法(SSD)[8]、全卷積一階段目標檢測算法(FCOS)[9]、基于角點對的目標檢測算法(CornerNet)[10]和基于關(guān)鍵點三元組的目標檢測算法(CenterNet)[11]等。
在機器人、自動駕駛和移動端等實際應用領(lǐng)域中,目標檢測任務需要在資源有限的平臺上即時執(zhí)行,對目標檢測算法的參數(shù)量和檢測速度有較高的要求。針對這些問題,F(xiàn)ORREST等[12]提出了SqueezeNet。該算法用1×1卷積核替換3×3卷積核,將參數(shù)量減少為原來的1/9,并將下采樣操作置后,以獲取更大的特征圖,保留更多信息,提高了分類的準確率。ANDREW等[13]提出了MobileNet。該算法使用3×3的深度可分離卷積代替3×3的標準卷積,大幅降低了網(wǎng)絡的參數(shù)量和計算量,實現(xiàn)了移動端的目標檢測。HEI等[10]提出了基于角點對的CornerNet算法,通過選取目標的左上角點和右下角點來確定邊界框,最后利用非極大值抑制對邊界框進行篩選。該算法在MS-COCO test-dev數(shù)據(jù)集上檢測精度達到了約37.8%,但其參數(shù)量大,對于密集目標檢測效果不理想,而且檢測速度較慢。針對這一問題,HEI等[14]又提出了一種輕量級算法ConrerNet_Squeeze,降低了CornerNet的參數(shù)量,實現(xiàn)了實時目標檢測,但檢測精度有所降低。為了解決CornerNet對密集目標檢測結(jié)果不理想的問題,DUAN等[11]提出了CenterNet,解決了CornerNet產(chǎn)生無效錨框的問題,改進了角點池化層并加入了中心池化層分支,在MS-COCO test-dev數(shù)據(jù)集上檢測精度達到了約41.6%。但該算法依然存在參數(shù)量大、檢測速度慢的問題。針對這一問題,筆者提出了一種基于改進CenterNet的輕量化目標檢測算法CenterNet-encoder,大幅降低了算法的參數(shù)量,提高了算法的檢測速度,算法的主要創(chuàng)新點如下:
(1) 對沙漏網(wǎng)絡進行了優(yōu)化設計。受CornerNet-Lite的啟發(fā),在沙漏網(wǎng)絡中引入使用3×3深度可分離卷積的fire模塊,降低了算法參數(shù)量,提高了算法的檢測速度。另外,通過去除沙漏網(wǎng)絡中的最大池化層來抑制空洞卷積產(chǎn)生的棋盤效應。
(2) 在head和backbone之間加入由一個卷積核為3×3的空洞卷積、BN層以及激活函數(shù)組成的編碼層,在增大感受野的同時,降低參數(shù)量。
(3) 使用4×4反卷積替換上采樣,減少內(nèi)存占用并提升算法精度。
為了評估CenterNet-encoder的性能,筆者選擇MS-COCO train2014作為訓練集,test-dev作為測試集進行了實驗驗證。實驗結(jié)果表明,相比于其他算法,筆者提出的算法在大幅減少參數(shù)量的基礎上提高了算法的推理速度和檢測精度。
CenterNet是一種基于回歸的目標檢測算法,其架構(gòu)如圖1所示。該算法選用沙漏網(wǎng)絡作為backbone,將沙漏網(wǎng)絡輸出的特征圖分別輸入級聯(lián)角點池化層和中心點池化層,得到一對角點和中心點來表示目標。與CornerNet不同的是,CenterNet為中心點嵌入特征熱圖并且預測其偏移,根據(jù)得分選取前k個中心點,并設定一個中心區(qū)域,如果中心區(qū)域中沒有中心點存在,則認為該邊界框是不可取的;通過柔性非極大值抑制算法去除篩選過的邊界框。
圖1 CenterNet算法架構(gòu)圖
CenterNet對CornerNet算法的角點池化層進行了改進,提出了由左上角點池化層和右下角點池化層組成的級聯(lián)角點池化層。圖2(a)為左上角點池化層的結(jié)構(gòu)圖,為了找到目標的左上角點,左上角點池化層在上池化層前加入一個左池化層;同理,為了找到目標的右下角點,在右下角點池化層中的下池化層前加入右池化層。疊加兩個角點池化層得到的左上角點特征熱圖和右下角點特征熱圖,即可得到檢測目標的角點熱圖。為了找到物體的幾何中心,CenterNet算法提出了另一個分支——中心池化層分支,中心池化有助于更好地檢測中心點,其結(jié)構(gòu)如圖2(b)所示。要確定特征圖中的一個像素是否為中心點,CenterNet只需要串聯(lián)左池化層和右池化層以在水平方向取得最大值,串聯(lián)上池化層和下池化層以在垂直方向取得最大值。
(a) 左上角點池化層
CenterNet雖然在檢測效果上取得了不錯的成績,但其參數(shù)量達到了210×106,檢測速度較慢,處理一張圖片平均需要166 ms,無法滿足輕量化目標檢測的需求。針對這一問題,筆者提出了一種輕量化目標檢測算法CenterNet-encoder,其網(wǎng)絡架構(gòu)如圖3所示。該算法使用一個104層的沙漏網(wǎng)絡作為backbone,并將沙漏網(wǎng)絡中的殘差模塊替換為CornerNet-Lite中的fire模塊,以降低算法的參數(shù)量,提高檢測速度。在沙漏網(wǎng)絡中使用4×4的反卷積代替上采樣操作,并去除了最大池化層來減少空洞卷積帶來的棋盤效應,為了解決輸入圖像在經(jīng)過沙漏網(wǎng)絡時會造成部分信息丟失的問題,在backbone和head之間加入了編碼層,在不損失分辨率的前提下增大感受野。
圖3 CenterNet-encoder網(wǎng)絡架構(gòu)圖
算法的工作原理如下:首先對輸入圖像進行預處理,將圖像下采樣兩次后輸入沙漏網(wǎng)絡,提取圖像的特征熱圖;CenterNet-encoder然后將特征熱圖輸入編碼層,在不損失分辨率的前提下增大其感受野;接下來利用角點預測分支通過級聯(lián)角點池化層預測目標的左上角點和右下角點,利用中心點預測分支通過中心點池化層預測目標的中心點,通過中心點是否在中心區(qū)域內(nèi)對邊界框進行篩選;最后,使用柔性非極大值抑制算法去除冗余的邊界框,得到最終的檢測結(jié)果。
為了在降低算法參數(shù)量的同時保證其效果不會大幅降低,引入了CornerNet-Lite中的fire模塊。與CenterNet中的殘差模塊相比,fire模塊將殘差模塊中的3×3標準卷積替換為1×1標準卷積,卷積核尺寸從3×3降低到1×1,大幅降低了算法的參數(shù)量,另外,fire模塊還使用深度可分離卷積來進一步降低算法的參數(shù)量,提高算法的處理速度,其結(jié)構(gòu)如圖4所示。首先是一個1×1標準卷積和批量歸一化層,接著進入兩個分支,分別是帶有批量歸一化層的1×1標準卷積分支和3×3深度可分離卷積分支,將上述兩個分支級聯(lián)起來,經(jīng)過一個批量歸一化層,最后引入跳躍連接和Relu激活函數(shù)進行連接。
圖4 Fire模塊結(jié)構(gòu)
筆者提出的算法在輸入圖像進入沙漏網(wǎng)絡之前對其進行預處理,經(jīng)過兩次下采樣,將圖像分辨率從511×511下降至64×64。因此輸入圖像在經(jīng)過沙漏網(wǎng)絡后會丟失部分特征信息,導致特征圖細節(jié)不足,影響角點預測分支和中心點預測分支對角點和中心點的預測。為了解決這一問題,在backbone和head之間加入了編碼層,結(jié)構(gòu)如圖5所示。編碼層由一個卷積核為3×3、擴張率為2的空洞卷積、批量歸一化層和Relu激活函數(shù)組成,通過對編碼層中空洞卷積的擴張率進行調(diào)節(jié),使3×3的卷積核得到恰當?shù)母惺芤埃饶茏屳敵瞿依ǜ喑叨鹊男畔?,減少局部信息的丟失,又能抑制棋盤效應。筆者參考文獻[15],將擴張率設置為2。
圖5 編碼層結(jié)構(gòu)
(1)
其中,α、β和γ分別表示Lpull、Lpush和Loff的權(quán)重。參考CenterNet,將超參數(shù)設置為α=β=0.1,γ=1,使用Focalloss來計算角點和中心點的熱圖損失,設置pull損失和push損失訓練網(wǎng)絡對角點進行匹配和分離。
與CenterNet中使用SmoothL1loss對邊界框進行回歸不同,使用MSEloss對候選框角點和中心點的偏移量進行回歸,以加快損失函數(shù)的收斂。中心點的偏移損失公式如下:
(2)
(3)
為了驗證筆者提出算法的有效性,將該算法與YOLOv3[16]、CornerNet_Squeeze、CornerNet和CenterNet算法進行了對比實驗。實驗是在Ubuntu18.04.5操作系統(tǒng)下進行的,硬件配置為AMD5900X CPU,32 GB內(nèi)存,兩張GeForce RTX 3090顯卡,運行庫版本為Cuda11.2,軟件環(huán)境為Pytorch1.8.0。
實驗采用的數(shù)據(jù)集是MS-COCO數(shù)據(jù)集[17]。該數(shù)據(jù)集包含80類、150萬個目標實例,包含了大量的小目標,而且類別分布不均衡,是一個非常具有挑戰(zhàn)性的數(shù)據(jù)集。使用trainval35k[18]數(shù)據(jù)集進行訓練,它包含8 000個訓練圖像和3 500個驗證圖像。選擇平均精確率(Average Precision,AP)來評價檢測算法的性能,平均精確率主要包含10個不同的交并比閾值,從0.50到0.95,步長設置為0.05。使用MS-COCO test-dev數(shù)據(jù)集作為最終測試集,設置的置信度閾值為0.5。
訓練模型時,batch size設置為32,總迭代次數(shù)為8.4×105,前7.2×105次迭代學習率設置為2.5×10-4,后1.2×105次迭代學習率設置為2.5×10-5,輸入圖像的分辨率為511×511。在進入沙漏網(wǎng)絡之前進行圖像預處理,將分辨率降低為64×64后輸入到沙漏網(wǎng)絡中。
筆者的backbone是堆疊沙漏網(wǎng)絡[19],包括52層沙漏網(wǎng)絡和104層沙漏網(wǎng)絡,前者只有1個沙漏模塊,而后者有兩個沙漏模塊,從熱圖中選擇前70個中心點、70個左上角點和70個右下角點去檢測邊界框,并使用柔性非極大值抑制[20]來消除冗余的邊界框,最終根據(jù)它們的置信度得分[21]選擇前100個邊界框作為最終的檢測結(jié)果。
將筆者的CenterNet-encoder算法與YOLOv3和CornerNet_Squeeze這兩種輕量化目標檢測算法進行了對比實驗,實驗結(jié)果如表1所示。從表1可以看出,CenterNet-encoder與YOLOv3相比,雖然檢測速度相差不大,但參數(shù)量相比YOLOv3下降了約24%,檢測精度提升了約18.5%;與CornerNet_Squeeze相比,雖然檢測速度變慢,參數(shù)量有所增加,但平均檢測精度比CornerNet_Squeeze高約6.1%。
表1 文中法與YOLOv3、CornerNet_Squeeze參數(shù)量、速度和精度比較
由于文中提出的CenterNet-encoder算法是在CenterNet算法的基礎上進行的改進,所以將CenterNet-encoder算法與其他基于角點對的算法進行了對比實驗,實驗結(jié)果如表2所示。從表2中可以看出,筆者提出的CenterNet-encoder算法無論是參數(shù)量、速度還是精度都要優(yōu)于backbone為Hourglass-52的CornerNet算法。與CenterNet算法以及backbone為Hourglass-104的CornerNet算法相比,雖然CenterNet-encoder算法的檢測精度略有下降,但其參數(shù)量大幅下降,檢測速度也大幅提升。
表2 文中算法與基于角點對的算法參數(shù)量、速度和精度比較
另外,為了驗證MSEloss的有效性,通過實驗對比了SmoothL1loss和MSEloss對算法平均檢測精度的影響[22],實驗結(jié)果如表3所示。從表3中可以看出,使用SmoothL1loss計算角點和中心點的偏移時,最終得到的AP、AP50和AP75值分別為39.4%、58.4%和43.0%,對小目標、中目標和大目標的檢測精度分別為19.5%、42.6%和55.4%;而使用MSEloss時,AP、AP50和AP75分別提升了約1.1%、1.1%和1.3%,對于小目標、中目標和大目標的檢測精度分別提升了約1.2%、1.9%和0.9%。
表3 不同偏移損失有效性的對比
圖6和圖7給出了不同算法檢測結(jié)果的主觀質(zhì)量對比圖。由圖6可以看出,YOLOv3算法和CornerNet_Squeeze算法漏檢了手提包、花盆等目標,而且CornerNet_Squeeze算法的檢測結(jié)果中冗余邊界框較多,CornerNet算法和CenterNet算法雖然沒有漏檢手提包和花盆等目標,但其檢測結(jié)果中存在較多的冗余邊界框,而文中算法不但準確地檢測出了更多目標,而且冗余邊界框比其他算法都少。由圖7可以看出,YOLOv3算法和CornerNet_Squeeze算法只能檢測出兩個人,漏檢了照相機、牙刷等目標,CornerNet算法雖然檢測出了瓶子,但對于人的檢測邊界框不精確;CenterNet算法漏檢了一個牙刷、相機和瓶子,對于人的檢測也不精確;而筆者提出的算法不僅很好地檢測出兩個人,而且也準確地檢測出了更多的目標。
(a) 原圖
(a) 原圖
綜上所述,筆者提出的CenterNet-encoder算法對于密集目標的處理以及復雜環(huán)境的處理[23]優(yōu)于YOLOv3、CornerNet和CornerNet_Squeeze,在檢測速度上優(yōu)于CenterNet和CornerNet。
筆者提出了一種基于CenterNet的輕量化目標檢測算法CenterNet-encoder。該算法將沙漏網(wǎng)絡中的殘差模塊替換為fire模塊,并在fire模塊中引入深度可分離卷積,降低了算法的參數(shù)量;為了在不損失分辨率的前提下擴大感受野,在backbone和head之間設計了新的編碼層,編碼層使用3×3的空洞卷積,并用4×4的反卷積代替上采樣操作;最后,使用MSEloss對邊界框進行回歸,加快算法的收斂速度,并進一步提升了算法的檢測精度。實驗結(jié)果表明,雖然文中算法與原算法相比,檢測精度稍有降低,但文中算法的參數(shù)量僅為47×106,相比CenterNet的210×106下降了約77.6%,檢測一張圖片平均耗時57 ms,相比CenterNet,檢測速度提升約59%。然而,該算法的檢測精度特別是對小目標的檢測效果還有進一步提升的空間,未來將朝著這一方向進行改進,并且進一步提升算法的檢測速度,力爭實現(xiàn)實時目標檢測。