目標檢測論文閱讀:An Analysis of Scale Invariance in Object Detection – SNIP

目標檢測論文閱讀:An Analysis of Scale Invariance in Object Detection – SNIP

來自專欄 從目標檢測開始的挖坑日記

最早寫在CSDN博客上,轉到知乎~CVPR2018的文章


5/5更新:關於為什麼作者認為過於large物體檢測困難的原因:原理和開篇提到的小物體檢測有點類似,anchor本質上是大小固定的box,過小物體會出現IoU過低,過大物體也容易出現IoU過低,結果就是容易漏檢……不過總的來說,只是相對的。

另外,CVPR18 Detection文章選介(下)里Naiyan Wang大神更新了對於這篇文章的解讀,比我單純搬運翻譯深刻很多,有興趣的朋友不妨去圍觀。


An Analysis of Scale Invariance in Object Detection – SNIP

論文鏈接:arxiv.org/abs/1711.0818

代碼鏈接:arxiv.org/abs/1711.0818(尚沒有完全公開)

這篇文章主要的研究點是目標檢測中的小物體問題。小物體檢測一直是目標檢測中的難題,做過實驗的同學應該都知道數據集中small類的AP基本是最低的,主要原因是兩個,一個就是CNN網路提取到的語義化特徵和解析度之間的矛盾;另一個也是我最近才想明白的,就是目前的目標檢測都採用了Faster RCNN的Anchor思想,小物體有時候即使全部在Anchor內,也容易因為小面積導致IoU過低。

本文的主要工作:

1. 通過實驗驗證了upsampling對於提高小目標檢測的效果

2. 提出了一種Scale Normalization for Image Pyramids的方法

1. Background & Related Work

先以COCO數據集為例,目前普遍使用的ImageNet網路訓練得到的模型作為預訓練模型

可以看到的是,COCO90%的Instance的大小都在0.472以下,和ImageNet差別非常大,這一方面說明了類似COCO這樣的數據集中存在著大量的小物體,另一方面也說明了ImageNet預訓練的模型在遷移到樣本大小差異較大的COCO中時很可能產生一定的domain-shift偏差。因此作者產生這樣的motivation:

  1. 現在檢測網路為了提高對小目標的效果,都採用upsample的方法,這個真的是必要的嗎?我能不能直接用低解析度的圖像不做upsample來訓練網路(需要調小strides)?
  2. 能不能通過挑選樣本的方式來增加網路效果的,比如我upsample調整了大小以後,只用64x64~256x256的ground truth來訓練?用所有的gt來訓練真的更好嗎?

實際上,現在有很多針對小目標的措施和改良,包括:

  1. 使用dilated/strous或者deformable這類特殊的卷積來提高檢測器對解析度的敏感度
  2. 最常用的,upsample來rezie網路輸入圖像的大小
  3. 使用FPN這種把淺層特徵和深層特徵融合的,或者最後在預測的時候,使用淺層特徵和深層特徵一起預測;也有比較直接地在淺層和深層的feature map上直接各自獨立做預測的;這個也就是我們常說的尺度問題(scales)

2. 探究性實驗

作者在這一步主要探究的是低解析度圖像+特定的改良網路結構是否會有比較好的效果。

他訓練了三個網路:

訓練樣本都是從ImageNet的樣本庫中取出,然後先降採樣,然後再upsample放大回來,但是這麼一折騰,降採樣後的圖像分辨低了,upsample後解析度也不會得到提高,這樣可以還原小目標低解析度和面積小的特點。

這三個網路:

  • CNN-B使用高解析度圖像訓練,分類經過降採樣和upsample的圖片
  • CNN-S使用低解析度圖像訓練,分類經過降採樣的圖片
  • CNN-B-FT使用高解析度圖像訓練,然後在低解析度圖像上fine-tune,分類經過降採樣和upsample的圖片

本質上,其實三個網路都是在對小目標進行分類,不過CNN-S因為本身網路結構就不同,輸入比較小,不需要經過upsample。最後結果,CNN-B-FT準確率最高,CNN-S其次,作者認為這是因為模型從高解析度圖像中得到了充分的學習。

這就說明了,訓練樣本和輸入樣本如果解析度存在太大誤差,performance必然下降。與其為了小目標而專門使用改變網路結構(CNN-S),直接upsample和使用高解析度圖像預訓練得到的模型是更好的選擇(CNN-B-FT)。(註:此處存疑,見本部分末尾)

然後還有第二個實驗,這個實驗主要是想探究圖像解析度對結果的影響:

這個是只檢測小目標的不同檢測器的mAP值,然後800all和1400all分別是圖像統一resize到短邊為800、1400的大小,然後使用所有樣本進行訓練的模型;1400<80px是upsample後只用小目標進行訓練的模型……而MST是隨機在低解析度和高解析度之間採樣進行訓練的模型

作者想通過這個實驗說明如下:

  • upsample確實一定程度上可以提高性能,但是並不顯著,這是因為Upsample提高了小目標的檢測效果,但會讓本來正常大小或者本來就大的目標過大,性能下降(註:此處存疑,見末尾)
  • 訓練網路需要使用所有樣本,樣本損失會導致性能下降
  • 隨機在解析度之間採樣的效果也不好,結合之前的實驗,作者認為,在一定解析度圖像上預訓練過的模型再去檢測近似解析度的圖像效果比較好

3. IPN與SNIP

作者的主要思路就是在訓練和反向傳播更新參數時,只考慮哪些在指定的尺度範圍內的目標,由此提出了一種特別的多尺度訓練方法,即SNIP(Scale Normalization for Image Pyramids)。

如上圖所示,作者在訓練時劃分了三個尺度,對應三種不同解析度的圖像。每個解析度i下的RoI都有其指定範圍,如果gt的box大小在這個範圍內,就被標記做valid,否則就被標記為invalid。

在生成Anchor並給Anchor分配label的時候,檢查該Anchor是否和某個invalid gt box的overlap超過0.3,若存在,則該Anchor會被視作invalid Anchor;若不存在,則會被視作valid Anchor……這些invalie anchor在train的時候都會被無效化,也不會加入到反向傳播的過程中從而對參數產生影響,相當於在每個解析度上,只對大小合適的目標進行訓練,這就符合了作者設計的初衷。相應的,在inference時候,如果區域面積在那個解析度的指定範圍外,也同樣會被拋棄,最後,在進行rescale和NMS……

思想很簡單,但是效果很好,實現起來要考慮的因素還是比較多的:

1. 作者使用的是Deformable RFCN detector而不是常見的一般卷積,當然受制於實驗自身,需要作出一定的改變

2. 作者使用的網路結構是Dual path networks(DPN)和ResNet-101,由於需要內存很大,為了適應GPU內存,作者對圖像進行了採樣,具體方法是選取一個1000x1000的包含最多目標的區域作為子圖像,然後重複該步驟直到所有目標都被選取

3. 作者為了提升RPN的效果,嘗試了使用7個尺度,連接conv4和conv5的輸出等等;當然還有其他一些設置,這裡就不詳細提了

由於代碼還沒有公布,一些細節問題還無法得知。

這個是最終的在COOC數據集上的結果,可以看到效果很好:

因為個人對文中提到的一些網路結構不是很了解,而且代碼也沒有放出來,因此估計要等代碼放出、自己也補充一些相關知識才能有更深入的理解了。在此僅僅把自己的一些理解和困惑寫下來,望交流和批評指正。


推薦閱讀:

TAG:計算機視覺 | 深度學習DeepLearning | 目標檢測 |