郭葉軍,汪敬華,吉明明
(1.英特爾亞太研發(fā)有限公司,上海 200241;2.上海工程技術(shù)大學(xué),上海 201620)
SSD(Single Shot Multibox Detector)算法[1]是端到端的圖像目標檢測方法,和Faster RCNN[2]相比,最主要的不同是不再需要RPN(Region Proposal Network)來生成候選區(qū)域ROIs,因此,SSD算法從輸入圖像開始,到最后的輸出結(jié)果,一氣呵成,很好地改善了檢測速度,從而更能滿足目標檢測的實時性要求。
SSD有多種網(wǎng)絡(luò)模型,例如SSD300和SSD500等,分別表示支持的待檢測圖像的大小是300×300和500×500。本文根據(jù)SSD作者的基于Caffe[3]的SSD實現(xiàn)項目[4]中的示例代碼[5-6],用SSD300的網(wǎng)絡(luò)模型deploy.prototxt[7],分析了SSD對圖片fish-bike.jpg[8]的推理過程(inference)。
SSD算法在訓(xùn)練(train)時,固定輸入圖像的大小,因此,待檢測圖像首先要縮放到固定大小,在SSD300中,其圖像大小為300×300,即圖像的高和寬都是300像素。如圖1所示,待檢測圖像輸出為1×3×300×300,它是由Caffe定義的在層之間傳遞的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)[3],表示1幅彩色圖像,包括紅綠藍這3個通道,圖像大小是 300×300。
SSD網(wǎng)絡(luò)一開始部分基于VGG16模型[4,9]來提取圖像特征,為獲取更多大尺度下的特征信息,VGG網(wǎng)絡(luò)模型被分成part1和part2兩部分,其中,part1輸出的feature map的尺度是 38×38(圖中的 1×512×38×38表示 batch size為 1,有 512個 feature map,每個 feature map的大小是38×38),經(jīng)過規(guī)格化層后,保持尺度不變,傳遞至SSD特有網(wǎng)絡(luò),記為變量conv4_3_norm;part2輸出變量 fc7,feature map的尺度是 19×19,傳遞至SSD特有網(wǎng)絡(luò)。為獲取更多小尺度下的圖像特征信息,在VGG網(wǎng)絡(luò)之后,又依次增加了卷積網(wǎng)絡(luò)6、卷積網(wǎng)絡(luò)7、卷積網(wǎng)絡(luò)8、卷積網(wǎng)絡(luò)9,這里每個網(wǎng)絡(luò)包括兩個卷積層和兩個RELU層。其輸出的feature map的尺度分別為 10×10、5×5、3×3和 1×1,也都傳遞至 SSD 特有網(wǎng)絡(luò)。補充說明:這里規(guī)格化層的引入,是為了使不同尺度下的數(shù)據(jù)具有可比性[10]。
在SSD特有網(wǎng)絡(luò)中,有三個生成網(wǎng)絡(luò):mbox_priorbox生成網(wǎng)絡(luò)、mbox_loc生成網(wǎng)絡(luò)和mbox_conf_flattern生成網(wǎng)絡(luò),它們都分別接受以上6個尺度下的特征信息,然后生成 mbox_priorbox,mbox_loc和 mbox_conf_flattern,再一起傳遞給結(jié)果整合層,由結(jié)果整合層輸出最后結(jié)果,即目標所在的位置、目標所屬的類別和置信度等信息,將在后面詳述。特別指出的是,mbox_priorbox生成網(wǎng)絡(luò),除了接受6個尺度下的特征信息外,還需要將待檢測圖像的大?。?00×300)作為輸入。
目標檢測,需要確定圖像中目標所在的位置,因此神經(jīng)網(wǎng)絡(luò)的輸出應(yīng)包含目標的位置信息,被稱為Bounding Box。在SSD算法中,最終的Bounding Box是由Prior Box和Box Location組合而成,可將Prior Box理解為一個粗略的預(yù)定義矩形,可根據(jù)已確定的網(wǎng)絡(luò)模型參數(shù)計算得到;而Box Location則是對預(yù)定義矩形Prior Box的坐標調(diào)整參數(shù),是網(wǎng)絡(luò)經(jīng)過訓(xùn)練后的輸出。兩者組合,即得到最終的目標位置結(jié)果,根據(jù)參數(shù)不同,有多種組合算法,詳細代碼實現(xiàn)可參考文獻[11]。下面先重點解析SSD特有網(wǎng)絡(luò)中的三個生成網(wǎng)絡(luò)。
mbox_priorbox生成網(wǎng)絡(luò)的功能是得到prior box的坐標數(shù)據(jù),本質(zhì)上可事先根據(jù)已確定的網(wǎng)絡(luò)模型參數(shù)計算得到,為了更好地描述網(wǎng)絡(luò)模型,這里采用了PriorBox層進行計算得到,如圖2所示。PriorBox層分別獨立處理輸入的每個尺度,最后在mbox_priorbox層匯總輸出,當然PriorBox層的參數(shù)會有所區(qū)別。
圖2 mbox_priorbox生成網(wǎng)絡(luò)的方框圖
PriorBox層有兩個輸入,分別是圖像特征信息和待檢測圖像,實際上,它并不會用到輸入的具體數(shù)值,只是用到了圖像特征的尺度和原始圖像的大小。以圖中最左側(cè)的PriorBox層為例,它只是用到了1×512×38×38中的尺度 38×38,和 1×3×300×300中的圖像大小300×300。PriorBox層還有諸如min_size和aspect_ratio等參數(shù),根據(jù)這些參數(shù)可以計算出num_priors_,此值代表每個特征點會生成的prior box的數(shù)量,具體的生成方法,是從特征點回溯到原圖相應(yīng)區(qū)域,并經(jīng)過縮放等操作得到多個區(qū)域,這樣得到的多個區(qū)域就是prior box的坐標。需要注意的是,prior box的坐標會除以相應(yīng)的原圖寬高進行規(guī)格化,這樣,待檢測圖像無論在事前還是事后進行何種等比例縮放,在每個縮放級別,都可以直接使用檢測結(jié)果。
仍以圖中最左側(cè)的PriorBox層為例,尺度是38×38,num_priors_是 4,就會生成 38×38×4=5776個 prior box,每個box需4個坐標,則共生成5776×4=23104個數(shù)據(jù),因此在圖2中,該層輸出的數(shù)據(jù)維度就是1×2×23104。其中,前23104個數(shù)據(jù)是生成的所有prior box的坐標數(shù)據(jù),后23104個數(shù)據(jù)則是相應(yīng)縮放系數(shù)[12],在目前的代碼實現(xiàn)中縮放系數(shù)是固定值,在最后根據(jù)prior box和box location計算得到最終的bounding box時被用作縮放因子。其他5個尺度的輸入也用同樣的方法處理。
在mbox_priorbox層中,將輸入的6組數(shù)據(jù)進行簡單的維度組合,輸出的數(shù)據(jù)維度為1×2×34928,這是因為23104+8664+2400+600+144+16=34928,對應(yīng)著一共34928/4=8732個prior box的坐標和縮放因子。這樣的維度組合,將輸入的多個變量表示為一個變量的形式,主要是為了后面計算bounding box時易于編程處理。
mbox_loc生成網(wǎng)絡(luò)的功能是得到prior box的坐標調(diào)整參數(shù),即box location。每個尺度的數(shù)據(jù)分別經(jīng)過相同的處理,最后在mbox_loc進行簡單的維度合并,如圖3所示。為圖示簡潔,只畫出了三個尺度(即38×38、10×10和 1×1)的詳細過程,另三個尺度(即 19×19、5×5和3×3)的處理過程用一個方框略之。
以圖3中最左側(cè)的輸入conv4_3_norm為例,其數(shù)據(jù)維度是1×512×38×38,首先經(jīng)過卷積層 conv4_3_norm_mbox_loc,因為卷積參數(shù) kernel size是 3,pad是1,stride是1,所以輸出的feature map大小還是38×38;而卷積參數(shù)num_output是16,因此,這個卷積層的輸出的數(shù)據(jù)維度是 1×16×38×38。16個 feature map,分別依次對應(yīng)著4個prior box的調(diào)整參數(shù),而每個prior box需要4個調(diào)整參數(shù)。這里和mbox_priorbox生成網(wǎng)絡(luò)中Prior Box層的參數(shù)num_priors_是一一對應(yīng)的。例如,處理conv6_2的卷積層的num_output參數(shù)是24,對應(yīng)著相應(yīng)Prior Box層中值為6的num_priors。在卷積過程中,feature map的大小并沒有發(fā)生變化,因此,實現(xiàn)了box location和prior box的一一對應(yīng)關(guān)系。
仍以圖3中最左側(cè)的輸入conv4_3_norm為例,經(jīng)過卷積層后,還要依次經(jīng)過層conv4_3_norm_mbox_loc_perm和conv4_3_norm_mbox_loc_flat,這兩層也是為了后面計算bounding box時便于編程處理而引入的。其中,conv4_3_norm_mbox_loc_perm層重排了數(shù)據(jù)的內(nèi)存布局,使得數(shù)據(jù)從頭排列依次為第一個prior box的4個調(diào)整參數(shù),第二個prior box的4個調(diào)整參數(shù),直到最后一個prior box的4個調(diào)整參數(shù)。而conv4_3_norm_mbox_loc_flat層則只是換了一個視角來看待數(shù)據(jù),不涉及任何內(nèi)存拷貝,這種新視角便于后續(xù)編程處理。
在mbox_loc層中,將輸入的6組數(shù)據(jù)進行簡單的維度組合,輸出的數(shù)據(jù)維度為1×34928,這是因為23104+8664+2400+600+144+16=34928。這里將輸入的多個變量表示為一個變量的形式,主要也是為了后面計算bounding box時方便編程處理。
mbox_conf_flattern生成網(wǎng)絡(luò)的方框圖如圖4所示,為圖示簡潔,同樣也只畫出了三個尺度的詳細過程,另三個尺度的處理過程用一個方框略之。mbox_conf_flattern生成網(wǎng)絡(luò)的功能是得到最終的bounding box屬于某個類別的可能性,即置信度(confidence)。本網(wǎng)絡(luò)模型基于20個類別訓(xùn)練而成,再加上背景,一共有21個分類。所以,最終得到的是每個bounding box分別屬于21個分類的可能性得分。
mbox_conf_flattern生成網(wǎng)絡(luò)的前面思路和mbox_loc生成網(wǎng)絡(luò)非常類似,六個尺度的數(shù)據(jù)分別獨立處理后在mbox_conf進行簡單的維度合并。唯一不同的是,對每個box,需要生成21個數(shù)據(jù),代表屬于21個分類的可能性得分,而不是表示調(diào)整參數(shù)的4個數(shù)據(jù)。因此,卷積層的num_output參數(shù)值是相應(yīng)的Prior-Box層的num_priors_的21倍,而不是4倍。
圖3 mbox_loc生成網(wǎng)絡(luò)的方框圖
圖4 mbox_conf_flattern生成網(wǎng)絡(luò)的方框圖
考慮到屬于21個分類的可能性得分的總和應(yīng)該是1,所以增加了mbox_conf_softmax層做歸一化處理,而mbox_conf_reshape層則是調(diào)整看待數(shù)據(jù)的視角,以滿足mbox_conf_softmax層的要求。
最后,mbox_conf_flattern層重新恢復(fù)了看待數(shù)據(jù)的視角,方便后續(xù)結(jié)果整合層的編程處理。mbox_conf_flattern層的輸出維度是1×183372,這是因為8732×21=183372,即對應(yīng)著8732個box的屬于21個分類的得分,這與前面的mbox_priorbox生成網(wǎng)絡(luò)和mbox_loc生成網(wǎng)絡(luò)的輸出實現(xiàn)了對應(yīng)。
本層首先根據(jù)輸入的prior box和box location計算得到8732個bounding box的準確位置,然后使用NMS(non-max suppress)算法,根據(jù)得分概率mbox_conf和bounding box的重疊情況,最終給出本圖像中的目標位置和目標類別。其輸出維度是1×1×N×7,其中N就是最終輸出的bounding box的個數(shù),每個bounding box對應(yīng)7個數(shù)據(jù),分別是:image_id(SSD算法可同時處理多個圖像)、label(所屬類別的標號)、confidence(置信度,介于0和1之間),以及bounding box的4個坐標值(即左上和右下坐標xmin、ymin、xmax和ymax,它們在PriorBox層就已做規(guī)格化處理,介于0和1之間)。
本文從SSD圖像目標檢測算法的網(wǎng)絡(luò)模型出發(fā),介紹了SSD算法整體的網(wǎng)絡(luò)模型及其特有三個生成網(wǎng)絡(luò)層,重點闡明網(wǎng)絡(luò)層之間的輸入輸出數(shù)據(jù)維度的變化和對應(yīng)關(guān)系,以及它們的主要參數(shù)和功能,以此來探析SSD算法不同于其他算法的關(guān)鍵,也為后續(xù)深入研究提供了一種新視角。
參考文獻:
[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.