1. 程式人生 > >理解yolo系列目標檢測演算法

理解yolo系列目標檢測演算法

在計算機視覺任務中,如果說做的最成熟的是影象識別領域,那麼緊隨其後的應該就是目標檢測了。筆者接觸目標檢測也有一段時間了,用mobilenet_ssd演算法做過手機端的實時目標檢測,也用faster-rcnn做過伺服器端的二維碼檢測,儘管一直都知道yolo的效果也很不錯,但沒抽出時間細細研究,最近剛好閒出空來,就把yolo系列演算法論文細讀了一遍,在思考的過程中,也使我對之前的知識點有了新的體會,這裡一併記錄下來,也希望能對讀者有所幫助。

1. 目標檢測演算法發展史

這幾年目標檢測方面的文章很多,如果只是單純地研究其中的某幾個演算法的話,可能會“一葉障目,不見泰山”,慶幸有網友整理了下面這張非常棒的圖,按時間順序羅列了比較經典的檢測演算法(附錄中有列原圖連結)。
img


說說對已經看過的演算法的體會吧,

1) R-CNN,它的全稱是"region based CNN",顯然,從名字可以看出,這種演算法的CNN網路的輸入是region。其實,最直接的想法應該是,從輸入影象中選取所有尺度的regions,然後分別送到CNN網路中進行訓練和測試,這種想法存在的問題是,不同尺度的regions,數量會達到指數級別,所以這種想法是行不通的。R-CNN則是在此基礎上進行創新,使用了"selective search"的方法預篩選2k個最可能的regions,然後使用CNN網路提取特徵,顯然,一般來說,對於一幅影象,2k個目標是足夠了的,從而使得CNN做目標檢測成為了可能;

2) Fast R-CNN,從名字來看,它比R-CNN更快,快在哪裡呢?並不是因為它把2k個regions減少了,而是因為它一次輸入一整張影象,相對於R-CNN,它的計算量是原來的1/2k,所以名字上多了一個’Fast’;

3) Faster R-CNN,從名字來看,它比Fast R-CNN更快,那麼它又是從什麼角度做的優化呢?特徵提取網路不變,只是把“ selective search”替換成了RPN。因為“ selective search”非常耗時,而RPN的小網路會比較快,雖然交替訓練會直覺上比較困難,但是做inference的時候,整個網路的耗時,相對於改進前提升了10倍以上,所以作者稱之“Faster”也當之無愧了,具體的對比資料參見下表,
在這裡插入圖片描述


  這裡順便提及一下,R-CNN系列演算法都屬於“two-stage”的目標檢測演算法,為什麼呢?其實,這裡指的stage分別是 region proposals 和 prediction,顯然,上面的3個方法都是要先生成proposals,然後預測這些proposals對應的邊界框和目標類別,所以稱之為“two-stage”。而Yolo和ssd演算法因為不需要預先生成" region proposals",所以我們稱之為“one-stage”的目標檢測演算法。

2. yolo-v1

2.1 動機

儘管R-CNN系列演算法每一版本的優化效果很明顯,但是即便是Faster R-CNN也很難滿足pc實時性的要求,為了提升演算法inference速度,對Faster R-CNN繼續改進已經很難了,必須開發一種全新的檢測框架。

2.2 優點

a) “end-to-end”:輸入一副原始影象,單一網路直接inference出目標位置;

b) Fast,可以滿足pc上的實時性要求;

c) 效果魯棒,從自然影象遷移到藝術等其他領域的影象時,效果也很好。

2.3 inference過程

yolo-v1把輸入影象劃分成了SxS 的網格,顯然,每個網格代表了一個影象塊,它的作用有兩個:(1) 預測一個目標類別標籤,(2) 預測出以當前網格為中心的所有可能的bounding boxes和這些boxes對應的打分。顯然,前者關注的是當前網格對應的物體的標籤,後者關注的是當前網格對應的所有可能物體的位置。為了得到當前網格對應的物體的位置,每個網格的資訊會預測出B個bounding boxes。以下圖為例進行解釋,狗的“center”點落在了第5行第2列的格子上,那麼在inference過程中,該網格則負責預測出狗的邊框位置,自行車和汽車同理。這裡順便提及一下,如果有一隻貓依偎在狗的身旁(這裡假設是這樣,現實中不太可能哈 ?),且貓的"center"點恰好也在這個網格中,那麼yolo-v1只會預測出其中的一個目標,而忽略另外一者,這種情況被稱為“dense object detection”。
Image result for yolo object detection
  理解了上面的例子,yolo-v1的整個inference過程就很好理解了,引用一下論文中給出的網路結構圖,
img
給定任意一副輸入影象,網路會先縮放到448x448的尺寸大小,然後經過中間的特徵提取之後,最終得到7x7x30 的特徵圖,特徵圖的空間維度為7x7,每個畫素對應著原圖中的區域性感受野,等價於將原圖切分成了7x7的網格圖,通道維度為什麼是30呢?上文中提到,每個網格的資訊會預測出B個bounding boxes,論文中取B=2,pascal voc檢測資料集的類別數為20,所以通道維度為2*(4+1) + 20 = 30。
  在inference階段,每個網格會預測出B個bounding boxes,然後經過兩步後處理得到最終的檢測框,步驟一:設定閾值,只保留類概率高於閾值的bounding boxes,步驟二:nms去除重複的bounding boxes。

參考資料: