本文的主要內容來自於Google的一篇2017年的CVPR論文,“Speed/accuracy trade-offs for modern convolutional object detectors”,這篇文章從各種不同的角度比較了現今幾大流行的深度學習檢測算法,即Faster RCNN,SSD和R-FCN。研讀下來,感覺受益匪淺,因此寫了這篇論文筆記,結合自己的一些檢測方面的經驗,對學習過的幾個檢測算法做一下淺顯的分析。
Google這篇文章的厲害之處在於它把所有這些檢測算法都在新出的TensorFlow Object Detection API中實現了一遍,所以整體比較起來才有公平性可言。我會參照這篇文章的思路從各個檢測算法的結構,算法的性能,算法的視覺效果等三個方面對它們進行分析。有疏漏和錯誤的地方還望大家指正。
各大物體檢測算法的結構回顧
1. Faster RCNN
Faster RCNN具體可以分成兩段(如圖1所示),一段是所謂的Region Proposal Network (RPN),它可以接受一張任意size的圖片作為輸入,然后輸出一組長方形的proposals,每個proposal都會有一個是否包含物體的score。另一段是最終的box classifier和box位置的refinement,它會使用第一段提供的box proposals的位置來在同樣一張feature map上crop相應的features,這些features會作為最后神經網絡判斷出物體檢測位置和可信度的輸入。

1. 實際上還是老一輩物體檢測系統的思路,用Sliding Window,但是是在conv feature map上使用,這里的conv feature map來自最后一層可以共享的conv layer,比如在VGG-16中就是第13層的輸出feature map。
2. 每個Sliding Window都是一個nxn的全連接window,比如說是3x3的window,然后把每個window映射到一個低維向量上去(VGG-16是512維),這里一個3x3的window可能在輸入原圖中代表了一塊很大的區域(VGG-16是228個像素)。
3. 第二步中的向量會作為兩個全連接層的輸入,即box-regression層和box-classification層。
4. 在每個Sliding Window的位置,都會預測k個region proposals,所以box-regression layer會有4k個坐標的輸出,而box-classification layer會有2k個輸出(包含物體的score和不包含物體的score)。這里值得一提的是k個proposals實際上就是所謂的anchors,每個anchor都是以sliding window的中心為中心,在長寬比率上不同的reference box,faster rcnn采用的是9個不同比率的anchors。RPN整體的示意圖見圖2。

實際上從相同的feature map上crop所需要的box proposal的features已經很大程度上避免了重復計算,但是用於后續的卷積神經網絡的預測的計算流程沒有省略,因此有多少個proposal就得有多少次box classification和box refinement,所以直接影響整體的運行時間。
2. SSD (Single Shot Detector)
實際上SSD目前已經不單指某一篇文章的物體檢測結構,而是指所有的利用單個卷積神經網絡預測物體的類別和位置偏移量的物體檢測框架,這些框架只需要走一次前向傳播,不需要類似Faster RCNN的對每個Proposal的分類和預測,SSD整體的結構見圖3所示。

1. 針對不同尺度的物體,SSD設計了multi-scale的feature maps。
2. 每一個新增的feature map都可以預測出一系列設定好的檢測結果。
3. 每一個設定好的檢測都來自於默認大小和比例的anchor,只要預測出相應的物體類別score和位置相對於中心的偏移量就行了,見圖4所示。

YOLO的整體結構如圖5所示,相對於前兩者YOLO的模型比較簡單。

1. 首先YOLO把輸入圖像分割成SxS的小塊。
2. 每個小塊負責預測以它為中心的B個bounding boxes和相應的box是否包含物體的score。
3. 同時,在另一條鏈路中每一個小塊也負責預測出這個小塊包含的某個具體物體類別的score。
4. 綜合前三步,在預測階段只需要把2和3得到的score相乘就可以得到具體的bounding box位置和相應的某個物體的score。
【YOLO存在的問題?】
雖然YOLO的結構簡單易懂,但它也面臨着簡單結構所帶來的一系列弊端,比如對小物體的檢測和相鄰非常近的物體的檢測效果糟糕,再者對於形狀很不規則的物體無法很好的用小塊去描摹。
4. R-FCN (Region-based Fully Convolutional Networks)
R-FCN更像是Faster RCNN的一個改進版(如圖6所示),與其像Faster RCNN一樣從相同的feature map上去crop proposals,再去進行回歸和預測,不如直接讓feature map向前傳播到最后一層全連接層之前,然后在這上面crop features,這樣大大減少了每個proposal需要進行的計算。

1. 第一部分和Faster RCNN一樣,還是RPN去產生proposals。
2. 第二部分和Faster RCNN不同,直接經過卷積層產生k*k個position-sensitive score maps,每個score map包含了所有不同類別物體的scores。比較典型的是取3*3個類別,分別代表top-left,top-center,top-right,...,bottom-right(如圖7所示)。
3. 設置這樣一種position-sensitive score map的原因,一是為了減少每個proposal需要的計算量,二是為了體現這樣一個思想,即“每個box都必須產生一個能夠衡量當前box和ground truth box重疊程度的score”(示意圖見圖8)。


這里文章里采用的feature extractor的配置主要是以下幾種:
1. VGG-16
2. Resnet-101
3. Inception V2
4. Inception Resnet
5. MobileNet
我們將會從整體的Accuracy vs Time,各個feature extractor的影響,物體大小的影響,圖片大小的影響,proposal數量的影響以及GPU / CPU memory的影響等等角度對第一部分詳述的三種檢測算法進行比較,YOLO暫時排除在外。
【Accuracy vs Time】
總體而言R-FCN和SSD要比Faster RCNN更快,而Faster RCNN整體而言要更准。從圖9的左下角來看,SSD Inception和SSD MobileNet是最快速的兩種配置,而從右上角來看,Faster RCNN Inception-Resnet是最准也最慢的配置。文章的作者也通過這張圖發現了一個所謂的拐點,即R-FCN Resent和Faster RCNN Resnet取得了最好的速度和准確度的平衡(如圖9)。

整體而言,圖片越大,檢測的速度越慢,效果也越好。這個結論也是很直觀的,因為更大的圖片意味着更多的小物體會有機會被檢測到(如圖10)。

基本上所有的物體檢測算法都在大物體上表現的更好,而SSD會在小物體的檢測上有明顯的缺陷(如圖11)。

這里的結論也是很直觀的,除了SSD比較特殊外,越復雜的,在分類領域效果越好的feature extractor,在檢測任務上的表現也越好(如圖12)。

作者通過圖13發現,的確越少的proposal會帶來越少的計算時間,但是相應的准確度確沒有下降那么快,50個proposals相較100個proposals只帶來了幾個百分點的准確度下降,這一點是值得關注的,即實際場景中沒必要設置過多的proposal數量(如圖13)。

基本上越復雜的feature extractor加上越復雜的檢測算法,會帶來更多的memory消耗(如圖14)。

這里我提供兩組比較圖像,一組來自作者的論文(圖15),另一組來自我自己的運行結果(圖16),可以明顯的發現SSD對於小物體的檢測比較不理想,而R-FCN和Faster RCNN的Recall都是比較高的。


Google那篇文章的作者和我的目的都是希望給大家在實際場景中選擇檢測算法提供一些參考,比如大物體如何選,小物體如何選,是選快的還是選慢的等等。當然出現疏漏和錯誤還是希望大家多指正。
引用
[1] J. Huang, V. Rathod, C. Sun, M. Zhu, A. Korattikara, A. Fathi, I. Fischer, Z. Wojna, Y. Song, S. Guadarrama, and K. Murphy. Speed/accuracy trade-offs for modern convolutional object detectors. In CVPR, 2017.
[2] S. Ren, K. He, R. Girshick, and J. Sun. Faster r-cnn: Towards real-time object detection with region proposal networks. In Advances in neural information processing systems, pages 91–99, 2015.
[3] W. Liu, D. Anguelov, D. Erhan, C. Szegedy, S. Reed, C.- Y. Fu, and A. C. Berg. Ssd: Single shot multibox detector. In European Conference on Computer Vision, pages 21–37. Springer, 2016.
[4] J. Redmon, S. Divvala, R. Girshick, and A. Farhadi. You only look once: Unified, real-time object detection, 2015.
[5] J. Dai, Y. Li, K. He, and J. Sun. R-fcn: Object detection via region-based fully convolutional networks, 2016.