深度學習檢測小目標常用方法匯總
- 2019 年 11 月 27 日
- 筆記
本文轉載自知乎Captain https://github.com/Captain1986/CaptainBlackboard
引言
在深度學習目標檢測中,特別是人臉檢測中,小目標、小人臉的檢測由於解析度低,圖片模糊,資訊少,噪音多,所以一直是一個實際且常見的困難問題。不過在這幾年的發展中,也湧現了一些提高小目標檢測性能的解決手段,本文對這些手段做一個分析、整理和總結。
實驗平台
N/A
傳統的影像金字塔和多尺度滑動窗口檢測
最開始在深度學習方法流行之前,對於不同尺度的目標,大家普遍使用將原圖build出不同解析度的影像金字塔,再對每層金字塔用固定輸入解析度的分類器在該層滑動來檢測目標,以求在金字塔底部檢測出小目標;或者只用一個原圖,在原圖上,用不同解析度的分類器來檢測目標,以求在比較小的窗口分類器中檢測到小目標。
在著名的人臉檢測器[MTCNN](Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks)中,就使用了影像金字塔的方法來檢測不同解析度的人臉目標。

img
不過這種方式速度慢(雖然通常build影像金字塔可以使用卷積核分離加速或者直接簡單粗暴地resize,但是還是需要做多次的特徵提取呀),後面有人借鑒它的思想搞出了特徵金字塔網路FPN,它在不同層取特徵進行融合,只需要一次前向計算,不需要縮放圖片,也在小目標檢測中得到了應用,在本文後面會講到。
簡單粗暴又可靠的Data Augmentation
深度學習的效果在某種意義上是靠大量數據喂出來的,小目標檢測的性能同樣也可以通過增加訓練集中小目標樣本的種類和數量來提升。在《深度學習中不平衡樣本的處理》一文中已經介紹了許多數據增強的方案,這些方案雖然主要是解決不同類別樣本之間數量不均衡的問題的,但是有時候小目標檢測之難其中也有數據集中小樣本相對於大樣本來說數量很少的因素,所以其中很多方案都可以用在小樣本數據的增強上,這裡不贅述。另外,在19年的論文Augmentation for small object detection中,也提出了兩個簡單粗暴的方法:
- 針對COCO數據集中包含小目標的圖片數量少的問題,使用過取樣OverSampling策略;

img
- 針對同一張圖片裡面包含小目標數量少的問題,在圖片內用分割的Mask摳出小目標圖片再使用複製粘貼的方法(當然,也加上了一些旋轉和縮放,另外要注意不要遮擋到別的目標)。

img
在同一張圖中有更多的小目標,在Anchor策略的方法中就會匹配出更多的正樣本。

img
特徵融合的FPN
不同階段的特徵圖對應的感受野不同,它們表達的資訊抽象程度也不一樣。淺層的特徵圖感受野小,比較適合檢測小目標(要檢測大目標,則其只「看」到了大目標的一部分,有效資訊不夠);深層的特徵圖感受野大,適合檢測大目標(要檢測小目標,則其」看「到了太多的背景噪音,冗餘噪音太多)。所以,有人就提出了將不同階段的特徵圖,都融合起來,來提升目標檢測的性能,這就是特徵金字塔網路[FPN](Feature Pyramid Networks for Object Detection)。

img
在人臉領域,基本上性能好一點的方法都是用了FPN的思想,其中比較有代表性的有RetinaFace: Single-stage Dense Face Localisation in the Wild

img
另外一個思路:既然可以在不同解析度特徵圖做融合來提升特徵的豐富度和資訊含量來檢測不同大小的目標,那麼自然也有人會進一步地猜想,如果只用高解析度的特徵圖(淺層特徵)去檢測小臉;用中間解析度的特徵圖(中層特徵)去檢測大臉;最後用地解析度的特徵圖(深層特徵)去檢測小臉。比如人臉檢測中的SSH。

img
合適的訓練方法SNIP,SNIPER,SAN
機器學習裡面有個重要的觀點,模型預訓練的分布要儘可能地接近測試輸入的分布。所以,在大解析度(比如常見的224 x 224)下訓練出來的模型,不適合檢測本身是小解析度再經放大送入模型的圖片。如果是小解析度的圖片做輸入,應該在小解析度的圖片上訓練模型;再不行,應該用大解析度的圖片訓練的模型上用小解析度的圖片來微調fine-tune;最差的就是直接用大解析度的圖片來預測小解析度的圖(通過上取樣放大)。但是這是在理想的情況下的(訓練樣本數量、豐富程度都一樣的前提下,但實際上,很多數據集都是小樣本嚴重缺乏的),所以放大輸入影像+使用高分率影像預訓練再在小圖上微調,在實踐中要優於專門針對小目標訓練一個分類器。

img

img
在下圖中示意的是SNIP訓練方法,訓練時只訓練合適尺寸的目標樣本,只有真值的尺度和Anchor的尺度接近時來用來訓練檢測器,太小太大的都不要,預測時輸入影像多尺度,總有一個尺寸的Anchor是合適的,選擇那個最合適的尺度來預測。對[R-FCN](R-FCN: Object Detection via Region-based Fully Convolutional Networks)提出的改進主要有兩個地方,一是多尺寸影像輸入,針對不同大小的輸入,在經過RPN網路時需要判斷valid GT和invalid GT,以及valid anchor和invalid anchor,通過這一分類,使得得到的預選框更加的準確;二是在RCN階段,根據預選框的大小,只選取在一定範圍內的預選框,最後使用NMS來得到最終結果。

img
SNIPER是SNIP的實用升級版本,這裡不做詳細介紹了。
更稠密的Anchor取樣和匹配策略S3FD,FaceBoxes
在前面Data Augmentation部分已經講了,複製小目標到一張圖的多個地方可以增加小目標匹配的Anchor框的個數,增加小目標的訓練權重,減少網路對大目標的bias。同樣,反過來想,如果在數據集已經確定的情況下,我們也可以增加負責小目標的Anchor的設置策略來讓訓練時對小目標的學習更加充分。例如人臉檢測中的[FaceBoxes](FaceBoxes: A CPU Real-time Face Detector with High Accuracy)其中一個Contribution就是Anchor densification strategy,Inception3的anchors有三個scales(32,64,128),而32 scales是稀疏的,所以需要密集化4倍,而64 scales則需要密集化2倍。在S3FD人臉檢測方法中,則用了Equal-proportion interval principle來保證不同大小的Anchor在圖中的密度大致相等,這樣大臉和小臉匹配到的Anchor的數量也大致相等了。
另外,對小目標的Anchor使用比較寬鬆的匹配策略(比如IoU > 0.4)也是一個比較常用的手段。

img
先生成放大特徵再檢測的GAN
Perceptual GAN使用了GAN對小目標生成一個和大目標很相似的Super-resolved Feature(如下圖所示),然後把這個Super-resolved Feature疊加在原來的小目標的特徵圖(如下下圖所示)上,以此增強對小目標特徵表達來提升小目標(在論文中是指交通燈)的檢測性能。

img

img
利用Context資訊的Relation Network和PyramidBox
小目標,特別是像人臉這樣的目標,不會單獨地出現在圖片中(想想單獨一個臉出現在圖片中,而沒有頭、肩膀和身體也是很恐怖的)。像[PyramidBox](PyramidBox: A Context-assisted Single Shot Face Detector)方法,加上一些頭、肩膀這樣的上下文Context資訊,那麼目標就相當於變大了一些,上下文資訊加上檢測也就更容易了。

img
這裡順便再提一下通用目標檢測中另外一種加入Context資訊的思路,[Relation Networks](Relation Networks for Object Detection)雖然主要是解決提升識別性能和過濾重複檢測而不是專門針對小目標檢測的,但是也和上面的PyramidBox思想很像的,都是利用上下文資訊來提升檢測性能,可以歸類為Context一類。

img
總結
本文比較詳細地總結了一些在通用目標檢測和專門人臉檢測領域常見的小目標檢測的解決方案,後面有時間會再寫一些專門在人臉領域的困難點(比如ROP的側臉,RIP的360度人臉)及現在學術界的解決方案。
參考資料
- [Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks](Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks)
- 《深度學習中不平衡樣本的處理》
- Augmentation for small object detection
- [Feature Pyramid Networks for Object Detection](Feature Pyramid Networks for Object Detection)
- RetinaFace: Single-stage Dense Face Localisation in the Wild
- SSH: Single Stage Headless Face Detector
- [An Analysis of Scale Invariance in Object Detection - SNIP](An Analysis of Scale Invariance in Object Detection - SNIP)
- [R-FCN: Object Detection via Region-based Fully Convolutional Networks](R-FCN: Object Detection via Region-based Fully Convolutional Networks)
- SNIPER: Efficient Multi-Scale Training
- SAN: Learning Relationship between Convolutional Features for Multi-Scale Object Detection
- ScratchDet: Training Single-Shot Object Detectors from Scratch
- [FaceBoxes: A CPU Real-time Face Detector with High Accuracy](FaceBoxes: A CPU Real-time Face Detector with High Accuracy)
- S3FD: Single Shot Scale-Invariant Face Detector
- [Perceptual Generative Adversarial Networks for Small Object Detection](Perceptual Generative Adversarial Networks for Small Object Detection)
- [PyramidBox: A Context-assisted Single Shot Face Detector](PyramidBox: A Context-assisted Single Shot Face Detector)
- [Relation Networks for Object Detection](Relation Networks for Object Detection)

