郭葉軍,汪敬華,吉明明
(1.英特爾亞太研發有限公司,上海 200241;2.上海工程技術大學,上海 201620)
SSD(Single Shot Multibox Detector)算法[1]是端到端的圖像目標檢測方法,和Faster RCNN[2]相比,最主要的不同是不再需要RPN(Region Proposal Network)來生成候選區域ROIs,因此,SSD算法從輸入圖像開始,到最后的輸出結果,一氣呵成,很好地改善了檢測速度,從而更能滿足目標檢測的實時性要求。
SSD有多種網絡模型,例如SSD300和SSD500等,分別表示支持的待檢測圖像的大小是300×300和500×500。本文根據SSD作者的基于Caffe[3]的SSD實現項目[4]中的示例代碼[5-6],用SSD300的網絡模型deploy.prototxt[7],分析了SSD對圖片fish-bike.jpg[8]的推理過程(inference)。
SSD算法在訓練(train)時,固定輸入圖像的大小,因此,待檢測圖像首先要縮放到固定大小,在SSD300中,其圖像大小為300×300,即圖像的高和寬都是300像素。如圖1所示,待檢測圖像輸出為1×3×300×300,它是由Caffe定義的在層之間傳遞的基礎數據結構[3],表示1幅彩色圖像,包括紅綠藍這3個通道,圖像大小是 300×300。
SSD網絡一開始部分基于VGG16模型[4,9]來提取圖像特征,為獲取更多大尺度下的特征信息,VGG網絡模型被分成part1和part2兩部分,其中,part1輸出的feature map的尺度是 38×38(圖中的 1×512×38×38表示 batch size為 1,有 512個 feature map,每個 feature map的大小是38×38),經過規格化層后,保持尺度不變,傳遞至SSD特有網絡,記為變量conv4_3_norm;part2輸出變量 fc7,feature map的尺度是 19×19,傳遞至SSD特有網絡。為獲取更多小尺度下的圖像特征信息,在VGG網絡之后,又依次增加了卷積網絡6、卷積網絡7、卷積網絡8、卷積網絡9,這里每個網絡包括兩個卷積層和兩個RELU層。其輸出的feature map的尺度分別為 10×10、5×5、3×3和 1×1,也都傳遞至 SSD 特有網絡。補充說明:這里規格化層的引入,是為了使不同尺度下的數據具有可比性[10]。
在SSD特有網絡中,有三個生成網絡:mbox_priorbox生成網絡、mbox_loc生成網絡和mbox_conf_flattern生成網絡,它們都分別接受以上6個尺度下的特征信息,然后生成 mbox_priorbox,mbox_loc和 mbox_conf_flattern,再一起傳遞給結果整合層,由結果整合層輸出最后結果,即目標所在的位置、目標所屬的類別和置信度等信息,將在后面詳述。特別指出的是,mbox_priorbox生成網絡,除了接受6個尺度下的特征信息外,還需要將待檢測圖像的大小(即300×300)作為輸入。
目標檢測,需要確定圖像中目標所在的位置,因此神經網絡的輸出應包含目標的位置信息,被稱為Bounding Box。在SSD算法中,最終的Bounding Box是由Prior Box和Box Location組合而成,可將Prior Box理解為一個粗略的預定義矩形,可根據已確定的網絡模型參數計算得到;而Box Location則是對預定義矩形Prior Box的坐標調整參數,是網絡經過訓練后的輸出。兩者組合,即得到最終的目標位置結果,根據參數不同,有多種組合算法,詳細代碼實現可參考文獻[11]。下面先重點解析SSD特有網絡中的三個生成網絡。
mbox_priorbox生成網絡的功能是得到prior box的坐標數據,本質上可事先根據已確定的網絡模型參數計算得到,為了更好地描述網絡模型,這里采用了PriorBox層進行計算得到,如圖2所示。PriorBox層分別獨立處理輸入的每個尺度,最后在mbox_priorbox層匯總輸出,當然PriorBox層的參數會有所區別。

圖2 mbox_priorbox生成網絡的方框圖
PriorBox層有兩個輸入,分別是圖像特征信息和待檢測圖像,實際上,它并不會用到輸入的具體數值,只是用到了圖像特征的尺度和原始圖像的大小。以圖中最左側的PriorBox層為例,它只是用到了1×512×38×38中的尺度 38×38,和 1×3×300×300中的圖像大小300×300。PriorBox層還有諸如min_size和aspect_ratio等參數,根據這些參數可以計算出num_priors_,此值代表每個特征點會生成的prior box的數量,具體的生成方法,是從特征點回溯到原圖相應區域,并經過縮放等操作得到多個區域,這樣得到的多個區域就是prior box的坐標。需要注意的是,prior box的坐標會除以相應的原圖寬高進行規格化,這樣,待檢測圖像無論在事前還是事后進行何種等比例縮放,在每個縮放級別,都可以直接使用檢測結果。
仍以圖中最左側的PriorBox層為例,尺度是38×38,num_priors_是 4,就會生成 38×38×4=5776個 prior box,每個box需4個坐標,則共生成5776×4=23104個數據,因此在圖2中,該層輸出的數據維度就是1×2×23104。其中,前23104個數據是生成的所有prior box的坐標數據,后23104個數據則是相應縮放系數[12],在目前的代碼實現中縮放系數是固定值,在最后根據prior box和box location計算得到最終的bounding box時被用作縮放因子。其他5個尺度的輸入也用同樣的方法處理。
在mbox_priorbox層中,將輸入的6組數據進行簡單的維度組合,輸出的數據維度為1×2×34928,這是因為23104+8664+2400+600+144+16=34928,對應著一共34928/4=8732個prior box的坐標和縮放因子。這樣的維度組合,將輸入的多個變量表示為一個變量的形式,主要是為了后面計算bounding box時易于編程處理。
mbox_loc生成網絡的功能是得到prior box的坐標調整參數,即box location。每個尺度的數據分別經過相同的處理,最后在mbox_loc進行簡單的維度合并,如圖3所示。為圖示簡潔,只畫出了三個尺度(即38×38、10×10和 1×1)的詳細過程,另三個尺度(即 19×19、5×5和3×3)的處理過程用一個方框略之。
以圖3中最左側的輸入conv4_3_norm為例,其數據維度是1×512×38×38,首先經過卷積層 conv4_3_norm_mbox_loc,因為卷積參數 kernel size是 3,pad是1,stride是1,所以輸出的feature map大小還是38×38;而卷積參數num_output是16,因此,這個卷積層的輸出的數據維度是 1×16×38×38。16個 feature map,分別依次對應著4個prior box的調整參數,而每個prior box需要4個調整參數。這里和mbox_priorbox生成網絡中Prior Box層的參數num_priors_是一一對應的。例如,處理conv6_2的卷積層的num_output參數是24,對應著相應Prior Box層中值為6的num_priors。在卷積過程中,feature map的大小并沒有發生變化,因此,實現了box location和prior box的一一對應關系。
仍以圖3中最左側的輸入conv4_3_norm為例,經過卷積層后,還要依次經過層conv4_3_norm_mbox_loc_perm和conv4_3_norm_mbox_loc_flat,這兩層也是為了后面計算bounding box時便于編程處理而引入的。其中,conv4_3_norm_mbox_loc_perm層重排了數據的內存布局,使得數據從頭排列依次為第一個prior box的4個調整參數,第二個prior box的4個調整參數,直到最后一個prior box的4個調整參數。而conv4_3_norm_mbox_loc_flat層則只是換了一個視角來看待數據,不涉及任何內存拷貝,這種新視角便于后續編程處理。
在mbox_loc層中,將輸入的6組數據進行簡單的維度組合,輸出的數據維度為1×34928,這是因為23104+8664+2400+600+144+16=34928。這里將輸入的多個變量表示為一個變量的形式,主要也是為了后面計算bounding box時方便編程處理。
mbox_conf_flattern生成網絡的方框圖如圖4所示,為圖示簡潔,同樣也只畫出了三個尺度的詳細過程,另三個尺度的處理過程用一個方框略之。mbox_conf_flattern生成網絡的功能是得到最終的bounding box屬于某個類別的可能性,即置信度(confidence)。本網絡模型基于20個類別訓練而成,再加上背景,一共有21個分類。所以,最終得到的是每個bounding box分別屬于21個分類的可能性得分。
mbox_conf_flattern生成網絡的前面思路和mbox_loc生成網絡非常類似,六個尺度的數據分別獨立處理后在mbox_conf進行簡單的維度合并。唯一不同的是,對每個box,需要生成21個數據,代表屬于21個分類的可能性得分,而不是表示調整參數的4個數據。因此,卷積層的num_output參數值是相應的Prior-Box層的num_priors_的21倍,而不是4倍。

圖3 mbox_loc生成網絡的方框圖

圖4 mbox_conf_flattern生成網絡的方框圖
考慮到屬于21個分類的可能性得分的總和應該是1,所以增加了mbox_conf_softmax層做歸一化處理,而mbox_conf_reshape層則是調整看待數據的視角,以滿足mbox_conf_softmax層的要求。
最后,mbox_conf_flattern層重新恢復了看待數據的視角,方便后續結果整合層的編程處理。mbox_conf_flattern層的輸出維度是1×183372,這是因為8732×21=183372,即對應著8732個box的屬于21個分類的得分,這與前面的mbox_priorbox生成網絡和mbox_loc生成網絡的輸出實現了對應。
本層首先根據輸入的prior box和box location計算得到8732個bounding box的準確位置,然后使用NMS(non-max suppress)算法,根據得分概率mbox_conf和bounding box的重疊情況,最終給出本圖像中的目標位置和目標類別。其輸出維度是1×1×N×7,其中N就是最終輸出的bounding box的個數,每個bounding box對應7個數據,分別是:image_id(SSD算法可同時處理多個圖像)、label(所屬類別的標號)、confidence(置信度,介于0和1之間),以及bounding box的4個坐標值(即左上和右下坐標xmin、ymin、xmax和ymax,它們在PriorBox層就已做規格化處理,介于0和1之間)。
本文從SSD圖像目標檢測算法的網絡模型出發,介紹了SSD算法整體的網絡模型及其特有三個生成網絡層,重點闡明網絡層之間的輸入輸出數據維度的變化和對應關系,以及它們的主要參數和功能,以此來探析SSD算法不同于其他算法的關鍵,也為后續深入研究提供了一種新視角。
參考文獻:
[1]Wei Liu.Dragomir Anguelov,Dumitru Erhan,Christian Szegedy,Scott Reed,Cheng-Yang Fu,Alexander C.Berg.SSD:Single Shot MultiBox Detector.[EB/OL][2016-12-29/2017-9-20].URL:https://arxiv.org/pdf/1512.02325.pdf.
[2]Shaoqing Ren,Kaiming He,Ross Girshick and Jian Sun.Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2017,39(6):1137-1149.
[3]Y.Jia,E.Shelhamer,J.Donahue,S.Karayev,J.Long,R.Girshick,S.Guadarrama,and T.Darrell.Caffe:Convolutional Architecture for Fast Feature Embedding[J].Proceedings of the 22nd ACM International Conference on Multimedia,2014:675-678.
[4]K.Simonyan,A.Zisserman.Very Deep Convolutional Networks for Large-Scale Image Recognition[C].International Conference on Learning Representations,2015.
[5]Wei Liu.SSD.[EB/OL][2017-5-28/2017-11-15].URL:https://github.com/weiliu89/caffe/tree/ssd.
[6]Wei Liu.ssd_detect[CP/OL][2016-7-11/2017-10-15].URL:https://github.com/weiliu89/caffe/blob/ssd/examples/ssd_detect.ipynb.
[7]models_VGGNet_VOC0712_SSD_300x300.tar.gz[EB/OL][2017-10-4].URL:https://drive.google.com/file/d/0BzKzrI_SkD1_WVVTSmQxU0dVRzA/view
[8]Wei Liu.Fish Bike Example Image.[EB/OL][2014-6-9/2017-9-24].URL:https://github.com/weiliu89/caffe/blob/ssd/examples/images/fish-bike.jpg
[9]Wei Liu,Dragomir Anguelov,Alexander C.Berg.ParseNet:Looking Wider to See Better[C].International Conference on Learning Representations,2016.
[10]Wei Liu.Why normalization Performed Only for conv4_3?[EB/OL][2016-10-24/2017-10-16].URL:https://github.com/weiliu89/caffe/issues/241
[11]Wei Liu.bbox_util.[CP/OL][2016-11-26/2017-10-18].URL:https://github.com/weiliu89/caffe/blob/ssd/src/caffe/util/bbox_util.cpp#L355
[12]Wei Liu.Variance in Priorbox Layer.[EB/OL][2016-8-30/2017-10-12].URL:https://github.com/weiliu89/caffe/issues/155.