付佐毅,周世杰,李頂根
1.華中科技大學 能源與動力工程學院,武漢 430074
2.華中科技大學 中歐清潔與可再生能源學院,武漢 430074
近年來,深度卷積神經網絡成為計算機視覺的主流技術手段,正在被廣泛應用到各個領域。然而深度學習模型所設計和使用的神經網絡通常是為了追求性能而忽略模型的體積和速度[1]。在將目標識別深度神經網絡應用到各領域時,視覺目標識別的各個功能模塊對神經網絡的速度要求非常高,一些業界領先的深度神經網絡并不能達到這種要求。RCNN 系列網絡模型(包括fast RCNN,faster RCNN)[2-4]不斷將識別的準確率進行了提升,但都對幀速度沒有做很大的關注(幀速值較低)。Liu等人[5]提出的SSD模型具有較高的識別準確率(74%map)以及幀速(TitanX GPU 上為59 幀/s),但沒有考慮模型的體積問題。YOLO[6-8]系列網絡模型在具備較高的識別準確率的同時達到了較高的幀速(70 幀/s 左右,在不同的數據集有不同的表現),但沒有考慮網絡模型的體積問題。吳進等[9]設計了一種緊湊型卷積神經網絡,使用多個小型卷積層,減少了網絡的參數量并得到較高的準確率。本文使用輕量化措施設計一種輕量級的深度卷積網絡,并將其應用到智能駕駛領域。輕量級深度卷積神經網絡具有在保證準確率的前提下,內存占用小、模型體積小、運算速度快等特點,適合應用于智能駕駛的目標感知。
在智能駕駛汽車的檢測系統中,目標檢測需要使用車上攝像頭捕獲汽車周圍環境,識別出障礙物,并利用雷達等傳感器確認障礙物的空間,然后路徑規劃決策系統再給出合理的路徑,使得智能駕駛汽車在行駛中繞開障礙物。受限于硬件性能和實時性等因素,在智能駕駛系統中使用的深度學習模型的體積不能太大,推理速度也不能太慢。所以此次設計方案設計的模型體積不能太大,推理速度必須足夠快。本文在設計網絡時采用單次檢測器的設計方式。
目標檢測網絡按照功能可分為兩個子網絡,一個是主干網絡(另稱backbone),主要功能是提取圖像特征;另一個是檢測網絡(另稱fronthead),主要功能是從主干網絡提取的特征中提取目標的坐標框和類別置信度。
在本文中,主干網絡自行設計,利用一系列輕量化措施設計輕量級的網絡;檢測網絡前端獲取預測坐標和置信度部分主要參照SSD網絡[5],充分利用卷積神經網絡不同尺度的信息。
卷積神經網絡中存在大量的參數,前向推理時涉及大量的運算。其中,全連接層包含大量的參數,計算量相對于其參數量比較??;池化層不包含參數,由于池化層通常用來降低特征圖分辨率,在網絡中使用的數目不多,所以運算量相對比較??;卷積神經網絡的運算量主要集中在卷積層。為了使網絡體積變小,應當少使用全連接層,使用小尺寸卷積核。為了提升模型速度,應當降低模型的運算量。網絡的運算量除了與卷積核本身相關外,還與輸入特征圖的尺寸相關,在單層卷積運算中,特征圖尺寸減半,運算量將降低至原來的1/4。
全連接層占有大量參數,訓練時容易過擬合,且包含全連接層的網絡對數據輸入尺寸敏感;另外,相關研究表明,去掉部分全連接層,對模型的準確率影響不大。所以在設計的網絡中,不使用全連接層。
卷積層提取特征時會產生大量運算,為了降低模型的運算量,在網絡的前幾層充分降低特征圖的分辨率尺寸,然后在小尺寸特征圖上進行大量卷積操作,來避免模型運算量過多。
在網絡中,包含有大量的模型參數設置,為了便于設計,設計幾個簡單的最簡模塊,然后使用這些模塊堆疊得到最終模型。設計的基本卷積模塊見圖1。在圖中,左圖為對特征圖進行不變分辨率提取特征,即特征圖通過卷積模型后,特征圖尺寸和深度都不發生變化。右圖為對特征圖進行下采樣,經過下采樣后,特征的尺寸減半,通道數加倍。

圖1 降采樣模塊和不變分辨率模塊
不變分辨采樣模塊中使用殘差連接[10]來提升模型性能和加速訓練過程,并且使用深度分離卷積來降低參數量和運算量;另外,還使用1×1卷積調整數據通道數,控制運算規模。在下采樣模塊中,同樣使用深度分離卷積[11]和1×1卷積控制數據維度,與不變分辨率模塊不同的是,模塊輸入和輸出的特征圖分辨率發生了變化,不能簡單地使用殘差連接,所以使用卷積來替代原有的殘差連接,以控制數據分辨率。
主干網絡設計如表1。在表中,Output Size表示數據經過每個卷積模塊后的分辨率,Output Channel表示數據的通道數;Stride表示卷積或池化的滑動步長,步長為1 表示經過該層后數據分辨率不變,步長為2 表示數據經過該層后分辨率減半。Repeat 表示該模塊的堆疊次數,只有不變分辨率卷積模塊的Repeat次數不是1,在網絡中,通過控制模塊重復次數來控制網絡的參數規模。

表1 網絡結構示意表
在主干網絡中,接近輸入端的幾個卷積、池化和下采樣單元直接使特征圖分辨率下降到輸入圖像的1/8左右,充分降低了特征圖的分辨率,也預先降低了模型的運算量規模。降低特征圖尺寸后,進入每個分辨率前,首先使用下采樣模塊降低數據的分辨率,然后使用多個堆疊的不變分辨率卷積模塊提取特征。在網絡中,設計好不變分辨率卷積模塊和下采樣模塊后,模型中的超參數僅包括每個分辨率中模塊的堆疊次數,輸出通道數等少量參數。
在檢測部分需要將主干網絡提取的特征轉化為預測的類別置信度和坐標框。在這部分,主要參照SSD網絡結構,將多個分辨率的特征納入轉換范圍中(見圖2)。選取分辨率列表中每個分辨率的最后一個輸出進行轉換。假定某一層的分辨率為M×M。網絡為特征圖上每個特征像素點設置一系列預設目標包圍框,這些包圍框以該像素為中心,擁有不同的高寬比,預設目標數目和長寬比另設超參數,通常稱這些包圍框為default box或anchor box。網絡在預測時,預測與這些預設目標一一對應的可能類別和偏置。將預測坐標問題轉化為預測與預設包圍框的偏置問題。

圖2 目標檢測網絡中的坐標提取示意圖
網絡每個階段的數據分辨率用N×N來表示,網絡一共進行了7 次下采樣,其中,只有第二次使用池化層進行,其余地方均用滑動步長為2 的卷積來完成,這是為了避免過多的使用池化層,造成小目標信息丟失的問題。
網絡在預測時,使用one hot編碼處理類別信息;預測目標包圍盒時,預測包圍框與預設目標框之間的偏置。圖中每條連接的實際意義見圖。每個轉換包含有對目標類別的預測和坐標框偏置的預測。由于檢測時使用了多個分辨率的特征圖,在訓練時,圖像特征相當于以不同的尺度被檢測器訓練,可看作同時完成了多尺度訓練。
如圖3所示,每個坐標轉換分支使用兩個卷積來完成,一個是類別置信度卷積,另一個是物體坐標卷積。圖中,M×M×C某個特征圖的分辨率;mbox表示該分辨率的特征圖中使用的不同長寬比的anchor box 的數目;Ncls表示數據集中包含的類別數目。類別置信度卷積的輸出通道數由訓練數據集的類別數目和該分辨率特征圖使用的不同長寬比的anchor box 數目共同決定;位置坐標卷積的輸出通道數由該分辨率特征圖使用的anchor box數目決定。

圖3 每個坐標轉換分支的實際過程
在訓練時,首先要判定每個預測是否正確,然后依此訓練檢測器,判定過程稱為匹配。在訓練階段,網絡首先尋找與每個anchor box的IoU最大的標簽目標(IoU閾值通常設置為0.5)。如果一個anchor box 找到了匹配的標簽目標,則該default box 就是正樣本,該anchor box 的類別就是該ground truth 的類別,如果沒有找到,該anchor box就是負樣本。匹配完成后,獲得每個預測的正確性,然后就可以計算損失函數,利用反向傳播算法進行訓練。本文中損失函數與SSD相似,公式如下:

損失函數包含兩部分,一部分是分類預測損失,另一部分是坐標預測損失。假定預測坐標框為l,真實坐標框為g;將預測的坐標框轉換為中心寬高表示方式,即每個坐標框用(cx,cy,w,h)表示。式中各項參數計算公式見表。其中,Pos 和Neg 分別表示匹配后的正樣本和負樣本。在訓練時,類別損失使用交叉熵函數。坐標預測損失使用Smooth L1函數,計算預測坐標和真實坐標的偏差時,為了避免差值過大造成損失函數出現大波動,中心坐標歸一化到0~1 區間;寬高使用對數函數進行歸一化。α的取值一般為1,但在一些特定的實驗中,會進行另外設置。
視覺識別模型設計好后,可以使用剪枝方法進一步優化網絡內部結構,壓縮模型體積和運算量,提升模型運行速度。本章中主要采用結構化剪枝,為了便于實驗和分析,將主干網絡在CIFAR10和CIFAR100數據集上進行訓練和剪枝,再將剪枝得到的網絡用到視覺識別任務中。
剪枝的核心任務是衡量卷積核對最終結果的重要性。在本文中,主要針對網絡中卷積核尺寸為3×3的卷積層進行分析和裁剪,裁剪完成后,調整特征提取模塊內其他層的通道數來匹配剪枝結果。主要利用卷積層后的Batch Normalization 內的訓練參數來評估卷積核的重要性。
Batch Normalization層[12]主要作用是防止數據分布在多層之間發生偏移,主要方法是將數據的分布重新歸一化到均值為0方差為1的分布。為了維持模型的表達能力,給歸一化的數據賦予偏置β和系數γ。
Batch Normalization層的前向計算過程為:

其中,xi為BN 層輸入數據,yi為BN 層輸出數據,BN層在計算參數的均值和方差后,然后對數據進行歸一化,為了提升模型的非線性擬合能力,引入參數γ和β。
在BN層中,γ和β都是訓練參數,經過訓練后,每個BN 層的γ和β都有具體的值,由于網絡中BN 層和卷積層通常一一對應,那么訓練得到的系數γ就可以大致表示對應卷積核的重要性。γ越大,該卷積核對輸出結果貢獻越大;因此,可以通過分析BN層中的γ參數來剔除不重要的卷積核。
對于要剪枝的主干網絡,為了便于分析,移除多余的BN層,只有3×3卷積后才配置卷積層;由于CIFAR數據集中圖像的分辨率只有32×32,不能進行過多的降采樣,所以只對主干網絡中的Feature 3 以前的階段納入剪枝網絡的范圍。在網絡的末端,加入一個卷積層、ReShape層和全連接層,卷積層的主要作用是降低數據通道數,防止全連接層參數過多;Reshape層是為了變化數據維度,便于進行全連接。剪枝網絡的結構示意見表2。
獲得剪枝網絡結構后,將網絡在CIFAR-100數據集上進行訓練。訓練時,batchsize 設置為64,初始學習速率設置為1,使用SGD 優化器控制權重參數更新,訓練的總epoch 數為160。在訓練輪數的50%和75%處,將學習速率減半。在訓練時,對數據進行的增強處理和預處理包括隨機縮放裁剪、隨機水平翻轉及歸一化等。
訓練完成后,分析網絡中的每個BN 層的參數。將每個BN層的γ參數按照絕對值進行排序,然后按照設定好預定剪枝比例獲得邊界值,參數γ低于邊界值的卷積核不納入剪枝后的網絡。剪枝后網絡中3×3 卷積層的卷積核數目見表3。在表中,layer 為每個層的索引值,對應該層在網絡中的深度;before 為初始的網絡結構設計;rate表示剪枝比例,表中后三列表示剪枝后每個卷積層應該保留的卷積核數目。

表2 剪枝網絡結構表

表3 剪枝后每個卷積層的卷積核數目
從表3可知,網絡的頭部和末端的卷積層的重要性更大,中間層次之;在每個分辨率階段,第一個特征提取層更重要,降分辨率采樣層次之,后面的其余特征提取模塊重要性更低。剪枝比例很大的時候會急劇減小模型的體積,但同時會使得識別準確率降低很多,因此在保證識別準確率的同時要盡量提高剪枝比例。剪枝實驗表明在剪枝比例為0.5 的時候,保證了較高的識別率的同時模型體積較小,若再增大剪枝比例,識別準確率將急劇減小。因此在后續訓練中,使用剪枝比例為0.5的模型進行訓練。
本章模型訓練所使用的圖片來自VOC 2007、VOC 2012、Udacity 和 KITTI 等數據集中的目標檢測部分[13],以此創建數據集(為方便,下文統稱KITTI數據集)。為了便于訓練和評估模型性能,統一將數據轉換為VOC格式,并使用VOC 的評估方式,模型的評估指標mAP。另外,Udacity 和KITTI 兩個數據集要么沒有給出測試集,要么沒有給出測試集的標簽;處理方法是將所有的帶標簽圖像按照6∶4的比例劃分訓練集和測試集。
在網絡中,包含有大量的參數,需要使用大量數據進行訓練,否則容易過擬合。數據集的采集和標注成本限制了數據集的規模,而數據增強技術能夠以極小的成本豐富數據集,有效防止過擬合。數據增強一方面能夠以極小成本增加訓練的數據量,提升了模型的泛化能力;另一方面,數據增強給圖像增加了噪聲數據,提高了模型的魯棒性。實驗中使用的數據增強方法包括光學畸變、水平翻轉、平移等。
雖然設計的模型沒有使用全連接層,對輸入尺寸并不敏感,但是,為了便于批量運算,送入網絡的圖像尺寸需要統一。在實驗中,首先對圖像進行數據增強變換,然后將數據增強后的圖像縮放至300×300,并對數據做去均值處理。
實驗中使用的硬件環境見表4。其中至強CPU 共有兩塊,每塊有 8 個核心,16 個邏輯處理器;GPU 為1080Ti,每塊GPU的顯存為11 GB;內存64 GB。

表4 硬件參數表
卷積網絡的前向計算和反向傳播過程都可以矩陣化表示,在訓練時可用并行計算加速訓練過程。GPU內包含有大量的并行計算單元,非常適用于訓練深度卷積神經網絡。本文在實驗中使用GPU來加速訓練過程。
本文使用的深度學習計算框架為pytorch,其余軟件工具包括opencv、pillow、matplotlib 等。相關的網絡定義代碼和訓練代碼均由Python編寫完成。
在進行遷移學習時,對于與預訓練模型對應層匹配的部分,直接利用預訓練模型進行初始化。不能直接從預訓練模型獲取的權重再使用Xavier[14]進行初始化。
在訓練時,使用隨機梯度下降算法進行訓練,即使用SGD 優化器。在訓練過程中,所有訓練參數都有SGD 優化器進行統一維護和更新,使用統一的學習速率。當訓練進行到一定階段時,損失曲線可能不再下降,參數學習過程變得艱難,需要降低學習速率,使模型損失在訓練中繼續下降。在訓練目標識別網絡時,使用SGDR來調整學習速率。
在訓練中,數據集每完成一個epoch的訓練,記錄一組損失函數的值。訓練完成后,繪制網絡損失和時間的變化關系圖,見圖4 及圖5。在圖中橫軸表示數據訓練的輪數。

圖4 置信度損失變化曲線

圖5 坐標定位損失變化曲線
從圖4 及圖5 可看出,置信度損失和坐標定位損失都隨著訓練時間的增加而不斷下降,當訓練接近終止時,損失已收斂。訓練完后,用測試數據集對網絡的性能進行評估。對于模型給出的每張測試圖片的預測結果,按照預測的置信度進行排序,然后按照預測坐標框與真實坐標框的IoU 值判定一個預測結果屬于正例還是反例,如果一個預測結果與某個真實坐標框閾值符合要求,但是已經有某個置信度更高的預測與這個真實標注坐標框匹配,那么該預測同樣屬于反例。對每個預測結果進行歸類后,計算預測的精確率向量和召回率向量。然后取不同的召回率閾值,繪制Precision-Recall曲線。模型在KITTI數據集上的PR曲線見圖6。

圖6 模型在測試集上的Percison-Recall曲線
圖6 中可知,模型在“car(汽車)”,“tram(電車)”,“truck(卡車)”中都有很好的精確率和召回率;在“van(面包車)”中的召回率一般,不是特別好。在“person(人)”和“cyclis(t騎自行車的人)”中的召回率較低,這主要是由于數據中的大多數行人和自行車在圖像中占有的像素空間太小,模型在對這類目標進行預測時很容易誤判,使得模型在追求高召回率的時候,預測精度下降。繪制好PR 曲線后,計算每個類別PR 曲線下的面積,所得面積即為模型在每個類別下的平均準確率AP,然后對所有類別的AP 取均值,即可獲得模型在測試集上的mAP,具體參數值見表5。最終,模型在KITTI測試集上獲得meanAP為0.727。作為對比,使用VGG-SSD、YOLO、MobileNet[15]網絡模型在數據集上進行實驗,最終的對比結果如表6所示。

表5 各個類別的AP值

表6 模型性能對比表
通過對比可知,本文模型在識別精度上比VGG-SSD模型相差9 個百分點;但是模型的速度是VGG-SSD 的兩倍,體積僅是VGG-SSD模型的1/5。而對比于YOLO和MobileNet來說,本文模型體積大量減少,運算速度大量提升。本文提出的模型體積僅有19 MB,處理速度可以達到66.67 幀/s,將其應用到智能駕駛時,能夠實時地對道路上的目標進行檢測識別。部分樣例識別結果見圖7。

圖7 識別結果展示
基于深度分離卷積和殘差連接等思想,設計了一個不變分辨率特征提取模塊和一個降分辨率下采樣模塊,通過堆疊設計的特征提取模塊和降分辨率下采樣模塊,獲得了主干網絡。初始主干網絡設計完成后,修改網絡的末端,加入分類器,在CIFAR100數據集上對網絡進行訓練,通過BatchNormalization 層的參數γ來衡量每個卷積核的重要性,然后將不重要的卷積核從網絡中剔除出去,進一步優化網絡的結構。對主干網絡進行剪枝后,在構建的KITTI 數據集上(由VOC 2007、VOC 2012、Udacity 和KITTI 數據集中目標識別圖片構成)對整個識別網絡進行訓練。最終,設計的模型在構建的數據集上取得了72.7%的mAP,速度為66.7 幀/s,達到實時,能夠很好地應用到智能駕駛領域。