郭葉軍,汪敬華
(1.英特爾亞太研發有限公司,上海 200241;2.上海工程技術大學,上海 201620)
Faster R-CNN是用深度學習來進行目標檢測的算法[1],并在PASCAL VOC目標檢測競賽[2]中取得了很好的成績。從理論研究的角度來解析這個算法,存在不易描述清楚的理論問題;而從源代碼的角度來講述該算法,則又拘泥于編程細節,因此,從算法對應的網絡模型出發,明確網絡模型中每一層的輸入輸出,并概述其功能,就能把握算法的整體思路,為后續的深入研究奠定基礎。
眾所周知,有監督的深度學習算法包括兩個方面:一是前饋(forward)的推理過程(inference),根據輸入和網絡模型參數,得到輸出;二是反饋(backward)的訓練過程(train),根據輸入和預期的輸出,調整網絡模型參數。本文僅關注推理過程,因為理解了推理過程,也就容易理解訓練過程。提出Faster R-CNN算法的作者,在其GitHub主頁[3]中提供了基于Caffe網絡模型[4]的代碼,其中也包括一個demo示例程序,其網址見文獻[6],通過分析這個demo,來解析這個算法。
目標檢測,是指在一張圖像上,找出所有的目標,以及這些目標的具體位置。由于無法預知目標在圖像的具體位置,因此,最初始想法就是遍歷圖像中所有可能位置的候選區域,對每個候選區域(Region of Inter?est,簡稱RoI),通過特征提取等方法分析是否屬于某個目標類別。但是,RoI過多會導致算法效率低而無法實用,因此,有很多后續研究關注如何減少候選區域[7]。Faster R-CNN算法的網絡模型如圖1所示,通過RPN(Region Proposal Network)來生成所有的候選區域RoI。

圖1 Faster R-CNN算法的網絡模型
在Faster R-CNN算法中,待檢測圖像沒有固定的尺寸要求,作為輸入圖像只需要長寬等比例縮放到一定范圍即可,因此可以避免失真。RoI Pooling層用來將一定范圍內的尺寸轉換為固定尺寸,以滿足后續全連接網絡層的要求。待檢測圖像首先通過深度神經網絡來生成圖像特征,這些特征既被候選的RPN使用,又被后續的檢測過程使用,因此,實現了兩個不同目的的特征共享,這就是圖中被稱為共享神經網絡的原因。
目標檢測,需要確定目標所在的位置,因此神經網絡的輸出應包含目標的位置信息,被稱為Bounding Box,簡稱BBox。在Faster R-CNN算法中,BBox被拆分成兩部分:初始位置(矩形位置信息xa,ya,ha,wa共四個值,記為 PriorBox)和調整參數(tx,ty,tw 和 th四個參數,記為BoxDelta)。神經網絡是如何知道Prior?Box和BoxDelta的物理意義呢?這是因為在訓練網絡時,訓練數據就是建立在這些概念之上,網絡經過訓練后,這些物理意義就被內化在網絡中了。結合PriorBox和BoxDelta,可以算出調整后的新矩形位置,這個新矩形就是目標所在的更精確的位置,即BBox。這個思路,在RPN和結果整合層都被用到。在文獻[1]中用如下公式表示它們之間的關系:

其中xa,ya,ha,wa表示PriorBox的中心點坐標和高寬,tx,ty,tw 和 th是調整參數,而 x,y,h和 w 則是BBox的中心點坐標和高寬。
在RPN生成RoIs時,PriorBox是預先定義的an?chor;在結果整合層,PriorBox是RoIs。而BoxDelta則是網絡的中間輸出。都將在后面詳述。
卷積神經網絡在圖像識別中表現絕佳[8-9],已是非常基礎的概念,這里需要強調的是,卷積神經網絡對輸入圖像的尺寸沒有要求,可以是任意大小。所以,雖然在Caffe網絡模型[4]描述中,第一層接受的輸入是1×3×224×224,實際上,也可輸入 1×3×600×800的圖像,其中,1表示一幅彩色圖像,3表示圖像中有三個通道(channel),分別是紅綠藍三色信號通道,而600×800則是圖像的高和寬,這也是在demo[6]中作為Faster RCNN算法輸入的圖像尺寸。圖1所示的共享卷積神經網絡來源自VGG16模型[5],最后的輸出數據維度是1×512×38×50,表示有 512個 feature map,每個 feature map的 size是 38×50。
RPN的網絡模型詳細如圖2所示,其輸入數據是來自共享卷積網絡的輸出,維度是1×512×38×50,首先經過一個卷積層rpn_conv和一個relu層,然后,分為兩條支路。這里的rpn_conv卷積層的kernel size是3,output number是512,對應文獻[1]中圖3的3×3的滑動窗口,只是輸出的不是論文中的256-d數據,而是512維的數據。
下面一條支路經過rpn_bbox_pred卷積層后,變成的維度是 1×36×38×50,表示 feature map的 size是 38×50,一共36個feature map。考察任意一個feature map中的單個元素,其值最終可以對應著原始圖像中的某個區域;正是原始圖像中的這個區域中的像素,決定了feature map中的這個元素的值。將這個區域進行縮放和偏移,根據事先在訓練之前就定義好的規則,我們得到了9個新的區域,這些新的區域就被稱為anchor。所以,38×50大小的 feature map就對應著 9×38×50個anchor。由于每個anchor有四個調整參數,因此就對應著 4×9×38×50個調整參數,剛好和feature map的數量對應起來。因此,36個feature map在這里被賦予了具體的物理意義,對應著9個anchor的調整參數,而每個anchor有4個調整參數。
上面一條支路經過rpn_cls_score卷積層后,維度變成了 1×18×38×50,相同的,這里的 18個 feature map也被賦予了具體的物理意義,對應著9個anchor的得分,每個anchor有2個得分,分別是存在目標和不存在目標的得分,顯然,這兩個得分的概率之和應該是1,所以,后面加了rpn_cls_prob層做softmax。在rpn_cls_prob前后還各有一個Reshape層主要是為了使得數據格式符合相關層的要求,做簡單的shape變化,并不涉及到具體的數據拷貝,為圖示簡潔,這兩個Reshape層并沒有畫出。

圖2 RPN的網絡模型
最后,在proposal層中,首先根據調整參數來調整anchor得到新矩形位置,為了避免新區域過小,或者超過了原圖范圍,proposal層還有一個輸入im_info用來傳入原圖尺寸。從這里我們可以看出,新矩形位置是基于原圖坐標的,而不是基于某個feature map尺寸的。再結合 NMS(Non-Max Suppress)算法,根據得分概率和新矩形的重疊情況,給出最有可能性存在目標的160個候選區域,稱為RoIs,每個候選區域除了矩形的四邊坐標外,還有一個id(在這個demo中被置為0,并沒有被實際用到),因此是5維的,所以,最后輸出的RoI維度是160×5。其中,160是在確定網絡結構模型參數的時候,事先確定的。
RoI Pooling層如圖3所示,有兩個輸入,分別是來自共享卷積網絡的圖像特征數據和來自RPN的RoIs。由于RPN產生的RoI是基于原圖坐標,而RoI Pooling層處理的是卷積后的圖像特征數據,其大小已經發生了變化,不再是原圖分辨率,因此,通過層參數spatial_scale來調整RoI坐標,使之符合卷積后數據的尺寸要求。在網絡模型參數確定后,這個參數可以事先計算得到。
RoI Pooling層的參數還包括pooled_w和pooled_h,指的是每個RoI區域應該分成pooled_w×pooled_h個子區域,對每個子區域采用max pooling。所以,在本例子中,對于輸入的512個feature map,每個feature map中有160個RoI,一共會產生160×512×7×7個數據。一旦明確模型參數后,無論輸入的圖像尺寸如何變化,這些數字都不再變化。因此,RoI Pooling層的輸出維度是固定的,所以,滿足后續全連接網絡的固定輸入維度的要求。從這里輸出的四個維度,我們還可以有一個推論,也就是faster rcnn在推理過程中,在Caffe框架下,每次只能處理一張圖片,因為Caffe的數據結構最多就是四個維度,在這里都已經被使用,已經無法容納諸如圖片個數等額外信息了。

圖3 RoI Pooling層
全連接網絡如圖4所示,輸入來自RoI Pooling層,經過兩個全連接層(Fully Connected)和RELU層(FC6,RELU6,FC7和 RELU7),演變為 160×4096的數據,然后分成兩路。其中一路在經過全連接層bbox_pred,產生維度為160×84的輸出,其中160還是對應著160個RoI,而84則對應著每個RoI的21個分類(本例子的識別目標分20類,再加上背景一共21類)的位置調整參數。另外一路經過全連接層cls_score產生維度為160×21的數據,表示160個ROI中每個ROI對應著21個分類的可能性得分,顯然,所有可能性相加應該為1,所以,后續緊跟著cls_probe層做softmax。這里的輸出,邏輯上和RPN網絡中的rpn_cls_prob和rpn_bbox_pred是非常類似的。
結果整合層并不在Caffe網絡模型文件中體現,而是在demo最后用Python代碼完成,非常類似于RPN網絡中的proposal層,只是初始位置從事先可以靜態計算的anchor變成了動態計算得到的RoIs。首先根據調整參數bbox_pred來調整RoIs得到新矩形位置,再結合NMS算法,根據得分概率和新矩形的重疊情況,給出本圖像中的目標位置和目標類別。

圖4 全連接網絡
本文從Faster R-CNN算法的網絡模型出發,針對重要的網絡層,分析它們的輸入輸出,包括數據維度格式和對應的物理意義,也簡單介紹了每一層的主要參數和功能。這樣,更容易理解Faster R-CNN算法的關鍵技術,為后續的進一步研究打下堅實的基礎。
[1]Shaoqing Ren,Kaiming He,Ross Girshick,Jian Sun.Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2017,vol.39,no.6,1137-1149.
[2]Mark Everingham,S.M.Ali Eslami,Luc Van Gool,Christopher K.I.Williams,John Winn,Andrew Zisserman.The PASCAL Visual Object Classes Challenge:A Retrospective[J].International Journal of Computer Vision,2015,98-136.[3]https://github.com/rbgirshick/py-faster-rcnn.
[4]Y.Jia,E.Shelhamer,J.Donahue,S.Karayev,J.Long,R.Girshick,S.Guadarrama,T.Darrell.Caffe:Convolutional Architecture for Fast Feature embedding[J].Proceedings of the 22nd ACM International Conference on Multimedia,2014,675-678.
[5]K.Simonyan,A.Zisserman.Very Deep Convolutional Networks for Large-Scale Image Recognition[C].International Conference on Learning Representations,2015.
[6]https://github.com/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt.
[7]R.Girshick.Fast R-CNN[J].Proceedings of IEEE International Conference on Computer Vision,2015,1440-1448.
[8]許可.卷積神經網絡在圖像識別上的應用的研究[D].杭州:浙江大學,2012.
[9]A.Krizhevsky,I.Sutskever,G.Hinton.Imagenet Classification with Deep Convolutional Neural Networks[J].Proceedings of Neural Information Processing Systems,2012,1097-1105.