鄧新龍,張會兵,徐 智,首照宇,劉明政
(1.桂林電子科技大學 計算機與信息安全學院,廣西 桂林 541004;2.桂林電子科技大學 信息與通信學院,廣西 桂林 541004;3.軍事科學院 系統工程研究院后勤科學與技術研究所,北京 100071)
近年來,將基于深度學習的目標檢測模型部署在現實環境中一直是一個挑戰,其中一種解決方式是通過邊緣設備采集圖像,經過壓縮傳輸到計算能力較強的服務器上,邊緣設備使用服務器提供的服務資源來完成模型的推理,但是該方式會因為網絡帶寬、訪問流量等元素導致無法實時獲取服務,甚至可能因為網絡故障導致邊緣設備無法工作。另一種是將模型直接部署到嵌入式設備上,可以避免網絡延遲甚至網絡故障等問題,然而該方式受限于嵌入式設備的算力和存儲,導致部署之后模型的檢測速度較低[1]。為了將模型部署到嵌入式設備上,需要對模型進行壓縮。目前主要設計精簡的網絡結構[2-6]、剪枝[7-12]和量化[13,14]。設計精簡的網絡結構通過設計結構更加緊湊、計算量更少的網絡來提高模型的檢測速度;剪枝通過某種評判手段對現有效果顯著的模型進行裁減來降低模型的冗余,比如利用熵值來判斷卷積核的重要性;量化則將模型的輸入、參數和偏置從FP32(32位單精度浮點數)類型轉換為FP16(16位半精度浮點數)或者INT8(8位定點整數)類型,從計算效率角度來提高模型的檢測速度。然而上述方法大多針對圖像分類任務和網絡結構來進行模型壓縮,沒有考慮聯合使用不同類型的模型壓縮方法來最大程度降低模型的計算復雜度。因此,本文以SSD檢測模型為基礎,采用輕量化網絡結構和多尺度特征融合機制以及結合量化壓縮方法來平衡模型的檢測速度和檢測精度,構建了一個改進的SSD檢測模型,使得模型在嵌入式設備達到實時檢測效果的同時保證檢測精度。
當下基于深度學習的目標檢測模型受限于嵌入式設備算力和存儲的問題,無法達到實時檢測的效果,因此需要對模型進行一定程度的壓縮,在保證對模型檢測精度無明顯影響的前提下,降低模型的計算復雜度和網絡參數。目前主要分為設計精簡的網絡結構、剪枝和量化。Howard等[2]提出了MobileNetV1輕量化網絡,使用深度可分離卷積代替標準卷積提取一幅圖像的特征,降低了特征提取網絡的計算復雜度和網絡參數。然而,通過深度可分離卷積較容易得到特征為零的輸出,使得輸出的特征中存在較多的無效值。為此,Sandler等[3]提出了MobileNetV2,通過引入ResNet的殘差結構并重新設計了“瓶頸殘差模塊”,先通過1×1卷積降低輸入特征圖的通道數,然后再使用深度可分離卷積,避免特征圖從高維轉化成低維時信息的丟失。Howard等[4]基于NetAdapt算法[15]設計了MobileNetV3網絡,通過引入SE結構來賦予每個特征通道不同權重,提升有用的特征并抑制對當前任務價值不大的特征,同時設計了新的非線性激活函數h-swich,優化激活函數在嵌入式設備上的計算效率。Xiangyu Zhang等[5]基于ResNet網絡進行改進,提出了ShuffleNet網絡,通過引入分組卷積并對得到的特征進行通道重排,在降低計算復雜度的同時增加模型的學習能力,使學習到的特征更加豐富。然而,ShuffleNet網絡并沒有考慮到嵌入式設備內存使用量的特點,Ningning Ma等[6]在ShuffleNet的基礎上結合硬件平臺的特點提出了4條指導原則并設計了ShuffleNetV2網絡,進一步提高了檢測速度。
基于模型裁剪的方法是剪枝的主要方法,對已訓練好的模型進行裁剪,通過尋找一種有效的評判手段來判斷參數的重要性,將不重要的卷積核和連接進行裁剪來降低模型的冗余。Luo等[7]認為通過卷積核的權重大小很難評估其重要性,因此提出了基于熵值的裁剪方式,通過計算每一個卷積核的熵值來判斷其重要性。但是,這些方法往往沒有考慮到模型的帶寬和能量消耗,Yang等[8]采用Eyeriss計算模型中每一層的能量消耗,提出了基于能量效率的裁剪方法。徐夢婕[9]通過提出基于注意力機制的輕量化算法對網絡進行剪枝,使得模型中的冗余參數得到了有效的降低,模型尺寸相比原始模型減小了約75%且檢測精度相差不大。同年,Sanh等[10]提出將微調訓練過程中遠離零的參數通過再訓練的方式來完成剪枝。之后,Lin等[11]指出通過卷積神經網絡得到的特征圖中存在對最終影響很小的低秩特征圖。當下很多卷積神經網絡都是基于殘差結構來進行搭建,但是在對這些網絡進行剪枝時,殘差結構往往較為復雜,因此,Luo等[12]提出了基于KL散度的剪枝算法。
現有的大多數目標檢測模型的參數和計算都是基于32位浮點數,模型量化的基本思想是用更低精度的數值代替原浮點精度數值,將實數域中某一段映射到整數中,使得推理全部以整型來進行計算。Krishnamoorthi[13]則通過后訓練量化方式將模型的參數從FP32轉換為FP16,降低了模型的精確度損失。Jacob等[14]提出在訓練過程中模擬量化帶來的影響,進一步降低模型準確率的損失,缺點是需要重新訓練模型,不能基于現有已訓練好的模型進行量化。
SSD檢測模型首先使用VGG16作為模型的主干網絡,提取每一張圖像的特征。然后將VGG16中的Conv4_3層作為第一個預測輸出層,同時在此基礎上添加6個卷積層,選取最后的5個卷積層作為預測輸出層,總共6個預測輸出層。針對單幅圖像,通過VGG16提取特征后,使用這6個預測特征層來完成目標的分類和定位,最后通過NMS來選取最終結果。SSD檢測模型將特征提取網絡中的某些層抽取出作為多尺度特征預測來提高小尺寸目標的檢測精度。將SSD檢測模型部署到嵌入式設備上,對該模型不做任何改進將導致模型的檢測速度較慢,無法達到實時檢測的效果。考慮到模型的耗時主要體現在特征提取部分,因此,將MobileNetV3作為SSD檢測模型的主干網絡,丟棄MobileNetV3網絡的最后三層結構(池化層+2層1×1卷積),將此時的MobileNetV3的最后一層作為第一個預測輸出層,再額外添加5個“瓶頸殘差模塊”作為預測輸出層,得到SSDLite-MobileNetV3檢測模型;在此基礎上,引入特征融合思想[16],將第六個預測輸出層和第五個預測輸出層按照逐元素相加的方式融合。類似的,將剩余的預測輸出層經過同樣的方式處理,此時得到輸出用于后續的分類和回歸,將該模型命名為SSDLite-MobileNetV3(FPN);考慮到嵌入式設備的計算效率,對SSDLite-MobileNetV3(FPN)模型進行量化處理,得到SSDLite-tiny模型。通過將輕量化網絡和模型量化這兩種不同的模型壓縮方法融合在一起,極大降低了檢測模型的計算復雜度和網絡參數,從而平衡檢測模型的檢測速度和檢測精度。
2.2.1 SSDLite-MobileNetV3
MobileNetV3是為了部署在移動端上所提出的一種輕量化卷積神經網絡,主要基于深度可分離卷積。深度可分離卷積將標準卷積分解為兩個步驟:①逐通道卷積(Depthwise conv),一個卷積核對輸入的一個通道進行卷積,一個通道層只能由一個卷積來提取特征;②逐點卷積(Pointwise conv),使用M個1×1的卷積核,將上一步中獲取的特征層在深度方向上進行加權組合,得到新的特征層。深度可分離卷積結構如圖1所示。

圖1 深度可分離卷積[2]
深度可分離卷積通過減少通道數量來降低網絡的參數量,同時使用1×1卷積來實現跨通道的信息整合,保證算法性能不下降。與標準卷積的參數量的比值為
(1)

SSDLite-MobileNetV3模型結構如圖2所示,模型由bneck和DPConv2d模塊的堆疊而成,通過輕量化的網絡結構來壓縮模型,在對檢測精度影響不大的前提下,提高模型在嵌入式設備上的檢測速度。首先,丟棄MobileNetV3網絡最后三層結構(pool+2×conv2d),將剩余的網絡作為模型的特征提取網絡。然后,將bneck_8作為第一個預測輸出層,利用較低層中包含細粒度定位信息的特征層來提高檢測模型在小尺寸目標上的檢測精度。在原始SSD檢測模型中,添加的4個預測輸出層采用的是標準卷積,考慮到本模型面向低算力的嵌入式設備,所以將標準卷積替換為深度可分離卷積,添加的4層卷積的卷積核個數依次為:512、256、256和128。同時使用BN(Batch Normalization)正則化卷積后的特征圖,防止梯度爆炸。針對嵌入式設備的低精度數值表示,將添加的預測輸出層中的卷積從ReLu激活函數替換為ReLu6激活函數,限制ReLu激活函數的輸出范圍,使得卷積之后得到的輸出能有較好的數值分辨率。額外添加的深度可分離層結構如圖3所示,這里以Conv2d_2為例進行說明,該層輸出的特征圖的尺寸為10×10×480,首先使用1×1卷積進行降維,降低后續卷積的計算量,然后使用3×3的通道卷積完成特征提取,由于中間使用了通道卷積,使得在進行特征提取的過程中通道之間交流不足,所以最后使用1×1卷積來進行通道融合。

圖2 SSDLite-MobileNetV3結構

圖3 額外添加的深度可分離層結構
2.2.2 SSDLite-MobileNetV3(FPN)
在SSDLite-MobileNetV3檢測模型中采用多尺度特征預測,沒有充分利用包含細粒度信息的低層特征,只是通過低層特征圖來進行目標的分類和回歸。為了進一步提高對小尺寸目標的檢測精度,基于多尺度特征融合(FPN)思想,將SSDLite-MobileNetV3模型的主干網絡中高層特征依次和低層特征進行融合,對高層特征中缺乏的細粒度等空間信息通過低層特征進行補足,得到了SSDLite-MobileNetV3(FPN)模型。本模型設計并輸出了多個特征層輸出,使得模型可以在不同尺度的特征圖上進行預測。
SSDLite-MobileNetV3(FPN)模型結構如圖4所示。在SSDLite-MobileNetV3模型中,采用bneck_8、Conv2d_2、DPConv2d_1、DPConv2d_2、DPConv2d_3和DPConv2d_4這6個預測輸出層進行分類和邊界框的回歸,其對應的分辨率分別為20×20×672、10×10×480、5×5×512、3×3×256、2×2×256和1×1×128。本模型直接選取這6個預測輸出層進行特征融合,由于將不同特征層進行融合時需要保證這些特征層的寬度、高度和通道數相同,所以先采用1×1卷積對高層特征進行升維,統一通道數,然后采用雙線性插值法實現上采樣,統一這些特征層的高度和寬度實現特征融合。在特征融合時,采用和FPN相同的融合方式,使用逐元素相加操作,其操作如圖5所示,通過該操作來保持融合后得到的特征層通道數,避免后續的預測由于通道數增加而導致時間消耗增加。雖然本模型采用FPN算法進行特征融合以提高模型的檢測精度,在SSDLite-MobileNetV3模型的基礎上增加了一些卷積和元素級別(特征融合逐元素相加)的操作,但是由于在后續的預測階段采用了深度可分離卷積,所以本模型的檢測速度相比SSDLite-MobileNetV3變化不大。

圖4 SSDLite-MobileNetV3(FPN)

圖5 逐元素相加操作
2.2.3 SSDLite-tiny
考慮到嵌入式設備上的ARM系列處理器在浮點型計算方面存在效率較低問題,引入如圖6所示的感知量化結構[14],對SSDLite-MobileNetV3(FPN)進行改進,將該模型的輸入和權重采用非線性量化方式得到所對應的量化值,使得輸入和權重的值類型從float32轉換為int8,最終得到SSDLite-tiny模型。

圖6 感知量化結構[17]
感知量化采用非線性量化,權重和輸入的縮放系數以及零點根據每一層的權值范圍來確定。量化公式如式(10)所示
r=S(q-Z)
(2)
式中:S為縮放系數,Z為零點,q是實際值,r為量化后的值。與傳統的一致非對稱量化不同,為了推理時做整數乘法和累加運算,這里將最小值也做了量化。
在進行感知量化訓練之前,需要對模型進行融合,即網絡層中的卷積結構:Conv2d、BN和激活函數。然而,MobileNetV3采用了hard-Swich和ReLu6激活函數,現有的感知量化方法無法對這兩類激活函數進行融合,采用的激活函數為swish和ReLU6,因此這里將ReLu6激活函數改為ReLu,從而達到模型融合的目的。
文中所提出的模型采用和原始SSD相同的損失計算方法,損失函數如式(3)所示
(3)
式中:c表示置信度,l表示預測框,g表示真實框,N表示有N對匹配的先驗框數量,Lconf為置信度損失,Lloc為定位損失,α表示二者的權重。定位損失和置信度損失如式(4)和式(5)所示
(4)

(5)
由于本文的訓練環境需要的算力較大,因此訓練采用CPU為Intel(R)Xeon(R)CPU E5-2680 v4,GPU為TITAN V,顯存為14 G的服務器。測試環境采用NVIDIA Jetson Xavier NX嵌入式設備,其CPU為6核的ARMv8.2架構,GPU有384個NVIDIA CUDA核心和48個Tensor核心,內存為8 G。所有的訓練和測試環境均在Ubuntu18.04操作系統下。

針對目標檢測領域,對于單目標檢測算法的性能衡量,通常使用AP指標,而對于多目標檢測算法的性能衡量,則使用平均精度均值(mAP)指標,表示各類別的AP均值
(6)
式中:N表示測試集中圖像數量,P(k) 表示識別k張圖像時的精度值,Δr(k) 表示識別圖像張數從k-1到k時召回率的變化情況,m為所有圖像的類別數。
各模型實驗具有較多的預設參數,這些參數在訓練時對實驗結果存在較大的影響。實驗時固定其它參數,只改變模型的網絡結構。所有實驗的輸入圖像大小為1920×1200,初始學習率為0.001,學習率調整策略采用分段常數衰減PiecewiseDecay,每批次樣本數為56,總共迭代20 000次,每3000次迭代得到一個網絡模型。
利用百度paddlepaddle深度學習框架下進行訓練和測試,在COCO數據集上的對比結果見表1。從表1可以看出,將特征提取替換為MobileNetV3的YoLoV3和Cascade RCNN檢測模型的mAP值都較高,分別達到了27.2和25.0,然而幀率只有28.5和17.0,仍沒有達到實時檢測的效果。可見,對于現有的目標檢測模型而言,僅僅只是將其特征提取網絡替換為輕量化網絡在嵌入式設備上仍然不能達到較好的實時性。

表1 各種模型在COCO數據集上的性能對比
針對上述情況,為了能在嵌入式設備上達到實時檢測并保證檢測精度的效果,選擇參數和計算量合適的現有模型較為關鍵。由于SSD檢測模型基于YoLo和RPN的思想,采用多特征圖檢測來提高模型的檢測精度。將MobileNetV3作為SSD檢測模型的主干網絡得到SSDLite-MobileNetV3,其檢測速度高達56.8幀/s,相較YoLoV3-MobileNetV3模型提高了28.3,但是檢測精度較YoLoV3-MobileNetV3降低了4%。為了進一步提高模型的檢測精度,最終將SSDLite-MobileNetV3的多尺度特征檢測改進為多尺度特征圖融合,得到SSDLite-MobileNetV3模型,mAP相較SSDLite-MobileNetV3提高了1.1。
上面是在COCO數據集上測試模型的性能,為了進一步驗證所提出模型的性能,將幾種現有的性能較佳模型在Udacity數據集上進行訓練測試比對。在本次實驗中采用了MobileNetV3網絡的預訓練權重,訓練過程中如圖7所示,模型在迭代開始時loss下降很快,這是由于采用了預訓練權重的訓練方式,使得網絡能較快提取到待訓練圖像的特征。隨著迭代次數的增加逐漸趨于平緩,但是loss依然在下降,在不斷振蕩下最終在6000次左右收斂。

圖7 模型訓練損失函數和平均精度收斂曲線
為了能充分驗證SSDLite-tiny模型在嵌入式設備上的性能,需要將SSDLite-tiny模型和待對照的模型部署在NVIDIA Jetson Xavier NX設備上。首先,將PyTorch深度學習框架部署安裝在NX設備上,然后利用PyTorch將已在服務器上訓練好的模型導出到NX設備中,最后輸入待測試的數據集進行測試。實驗測試結果見表2,基于VGG16網絡的SSD檢測模型憑借標準卷積強大的特征提起能力,mAP達到了31.6,但FPS僅為11.45,沒有達到實時的效果,這是因為模型受限于嵌入式設備低存儲和低算力的問題,無法在上面完成實時檢測。基于SSD檢測模型改進后的SSDLite-MobileNetV3檢測模型FPS達到了38.84,該模型已經能夠部署到嵌入式設備上。但是,由于輕量化網絡對圖像特征提取不夠充分,SSDLite-MobileNetV3檢測模型的mAP值相較SSD檢測模型降低了13.9。通過進一步改進得到的SSDLite-MobileNetV3(FPN)模型的mAP達到了19.4,相較SSDLite-MobileNetV3提高了1.7%。在SSDLite-MobileNetV3(FPN)模型中,由于特征融合增加了新的計算量,模型的檢測速度較SSDLite-MobileNetV3降低了3.4幀/s。為了進一步平衡模型的檢測精度和檢測速度,基于量化壓縮得到SSDLite-tiny檢測,相比未量化壓縮的SSDLite-MobileNetV3(FPN)模型,mAP值僅下降了1.3,而FPS提高了39.6幀/s。

表2 各種模型在Udacity數據集上的性能對比
在SSD檢測模型的基礎上提出了一種可以部署在嵌入式設備上的實時目標檢測模型SSDLite-tiny,通過合理搭配不同類型的模型壓縮方法,使得改進后的模型在嵌入式設備上的檢測速度與檢測精度達到一個平衡。然而,SSDLite-tiny模型對于小目標的檢測精度較低,和原始SSD模型相比差距較大,這是由于采用了原始SSD模型中的固定AnchorBox機制以及沒有充分利用獲取的特征上下文信息。下一步將會結合Anchor Free以及注意力機制來提高模型對于小目標的檢測精度。