小目標檢測模型總結+SNIP+SNIPER
小目標檢測
在MS COCO資料集中,對於面積小於32*32的物體,MS COCO就認為它是小物體,在評測時,會對這個範圍內的物體計算APsmall。
在行人庫CityPerson中,原圖大小為1024*2048,小目標定義為高度小於75的目標。
目前小目標檢測的方法大致有一下4類(不過這是2018年的回答了):
-
Scale
最簡單粗暴的方法就是放大圖片。這就是在尺度上做文章,如FPN(Feature Pyramid Network),SNIP(An Analysis of Scale Invariance in Object Detection – SNIP)。
特徵圖的解析度 stride 的設定也算在這個裡面。
另外,如果影象尺寸特別大,可以考慮 YOLT(You only look twice)中切圖的方法。
-
Context
小物體需要有更多的周邊資訊來幫助識別,如何利用這些資訊,two stage 可以從 ROI Pooling 上下手,另也有 Jifeng Dai 老師的 Relation Network for Object Detection。
或者上dilated類似混合感知野,或者在head部分引入SSH相似的模組。
-
Anchor
迴歸的好不如預設的好,S3FD 做了非常細緻的 anchor 的實驗,可以幫助我們更合理地設計anchor。
-
Matching strategy
對於小物體不設定過於嚴格的 IoU threshold,也可以參考iou loss和cascade rcnn的思路。
-
使用GAN,在檢測器後面對抗一把。
-
用soft attention去約束confidence相關的feature map,或者做一些pixel wise的attention。
參考:小目標檢測問題中“小目標”如何定義?其主要技術難點在哪?有哪些比較好的傳統的或深度學習方法? - ChenJoya的回答 - 知乎
SNIP
An Analysis of Scale Invariance in Object Detection - SNIP
CVPR 2018
論文:https://arxiv.org/abs/1711.08189
程式碼:http://bit.ly/2yXVg4c
創新點:
- 通過有選擇地回傳梯度,實現有選擇地訓練,從而更好地檢測極端尺寸的物體
簡介:
看目標檢測論文的試驗結果不難發現,AP small基本都是最低的,主要原因一是網路提取的語義化特徵和解析度之間的矛盾,二是小目標往往會因為IoU過低而被漏檢。
這篇文章分析了小尺度與預訓練模型尺度之間的關係,提出了一個和Cascade R-CNN有異曲同工之妙的中心思想:要讓輸入分佈接近模型預訓練的分佈。作者提出了一個多尺度訓練(MST)的升級版SNIP。
COCO和ImageNet
上圖很清晰地描述了COCO和ImageNet的尺度差別,COCO中90%的Instance都在0.472以下,充斥著大量的小物體,而ImageNet中的分佈則比較均勻。所以用ImageNet預訓練的模型遷移到COCO中可能產生一定的domain-shift,因此作者有了這樣的思考:
- 有必要全部做upsample來放大小物體嗎?可不可以在預訓練的時候就選擇低解析度的影象作為輸入?
- 預訓練之後,在對模型進行微調的時候,是否可以對樣本進行選擇,選擇那些從64*64到256*256的物件?
Related Work
-
淺層小物體,深層大物體
例子:SDP、SSH、MS-CNN
缺點:在淺層預測小物體時,是以犧牲語義抽象性來實現的
-
特徵融合/特徵金字塔
例子:FPN、Mask-RCNN、RetinaNet
缺點:對於very small/large objects 檢測效果不是很好
實驗驗證upsampling對於提高小目標檢測的效果
-
CNN-B:原圖訓練/偽高清測試
訓練用高解析度影象,測試用經過降取樣和upsample的影象。
-
CNN-S:低清訓練/低清測試
訓練用低解析度影象,測試用降取樣的影象。
-
CNN-B-FT:原圖訓練,偽高清微調/偽高清測試
訓練用高解析度影象,然後在低解析度影象上進行fine-tune,測試用經過降取樣和upsample的影象。
可以這樣理解作者的三個實驗:ImageNet物體大、解析度高,而COCO目標都很小,直接遷移會有問題,作者在試圖探究如何進行遷移。降取樣後的小影象資料集其實對應的是COCO資料集普遍存在的小目標的情況,試圖模仿COCO資料集。
因此三個網路的含義應該是:
- CNN-B,ImageNet預訓練後的引數直接用來給COCO這種解析度低的資料集用;
- CNN-S,不用ImageNet這種高解析度的資料集做訓練,我把網路就設定成適合COCO這類資料集的,訓練和測試都用解析度低的資料集;
- CNN-B-FT,ImageNet人家都訓練好了,不用白不用,但是用之前,先用低解析度資料集做一下fine-tune改良效果。
實驗驗證解析度對於提高小目標檢測的效果
上圖是在小目標測試集上的檢測效果對比,所用測試影象的尺寸都是1400*2000。
-
800all表示網路基於800*1400的影象訓練。
-
1400all基於1400*2000的影象,不難看出,1400all的結果更好一些,主要原因就是訓練影象的解析度和測試影象的解析度一致,這和前面在ImageNet上進行的試驗結果也吻合。
但是這個提升非常小,作者猜測原因在於1400*2000的影象是經過放大得到的,模型在訓練過程中可以提高對小目標的檢測,但是對於較大目標,則會因為尺寸過大而難以訓練,從而影響了最終的效果。
-
1400<80px表示訓練資料尺寸是1400*2000,但是訓練過程中忽略中等尺寸和大尺寸的目標,這個模型的效果非常差,猜想原因是忽略這些訓練資料(佔比大約30%)所帶來的資料損失對模型效果的影響更大。
-
MST表示訓練一個檢測器時採用不同尺度的影象進行訓練(包括480*800),按理說效果不錯,但實際上和800all差不多,主要原因在於訓練資料中那些尺寸非常大或非常小的object會影響訓練效果,因此這篇文章在引入MST思想的同時限定了不同尺寸的object在訓練過程中的梯度回傳,這就是SNIP。
SNIP演算法思想
SNIP與MST有著很密切的聯絡,MST是在大的feature map上預測小物體,anchor設定的較小,在小feature map上預測大物體,anchor設定的較大,根據anchor與GT的IoU選擇正例。MST網路輸入是單尺度的,並沒有考慮到預訓練模型與輸入影象尺度差異的問題。SNIP因此做了升級:
- 只有物體的尺度與預訓練資料集的尺度(224*224)接近時,才把它用來做檢測器的訓練樣本,實際的操作是隻對在這個指定範圍內的目標回傳損失,就是說訓練過程實際上只是針對這些目標進行的。
valid anchor & invalid anchor:當某個ROI的面積在指定範圍內時,該ROI就是「valid」,也就是會在此次訓練中回傳梯度,否則就是「invalid」(如紫色框所示)。這些「invalid」的ROI所對應的「invalid ground truth」會用來決定RPN網路中Anchor的有效性。具體來說,「invalid Anchor」 就是和「invalid ground truth」的IOU大於0.3的Anchor,如Figure6左邊的黑色框所示。
另外,作者還分析了RPN網路中不同標籤的Anchor比例(一共就2種Anchor,正負樣本),我們知道在RPN網路中,一個Anchor的標籤是根據Anchor和Ground Truth的IOU值來確定的,只有下面2種情況才會認為Anchor是正樣本:
-
假如某個Anchor和某個ground truth的IOU超過某個閾值(預設0.7),那麼這個Anchor就是正樣本。
-
假如一個ground truth和所有Anchor的IOU都沒有超過設定的閾值,那麼和這個ground truth的IOU最大的那個Anchor就是正樣本
遵循Faster RCNN的設定,將conv4
的輸出作為RPN網路的輸入,然後在此基礎上設定了15種Anchor(5種尺度,三種比例),然後作者介紹了一個有趣的發現,那就是在COCO資料集上(影象大小為800×1200)只有30%的Ground Truth滿足Anchor是正樣本的第一個條件,即使將閾值調節成0.5,也只有58%的Ground Truth滿足Anchor是正樣本的第一個條件。
這就說明,即使閾值等於0.5,仍然有42%的正樣本Anchor和Ground Truth的IOU值小於0.5。顯然,這種正樣本的質量是不高的。所以SNIP引入的多種解析度影象作為輸入一定程度上可以緩解這種現象。
參考:
SNIPER
SNIPER: Efficient Multi-Scale Training
NIPS 2018
論文:https://arxiv.org/pdf/1805.09300.pdf
程式碼:https://github.com/MahyarNajibi/SNIPER
作者:馬里蘭大學
創新點:
- 不處理整幅影象,SNIPER僅僅處理影象金字塔上GT附近的chips,相當於綜合了R-CNN 在scale上的優點 和Fast R-CNN在速度上的優點。
簡介
傳統的多尺度訓練方案一般都使用影象金字塔,並處理金字塔層影象上的每個pixel,SNIPER僅處理影象金字塔上的context regions around ground-truth instances(也即chips),並結合SNIP思想,僅篩選合適尺度的gt instance參與模型訓練,對比使用金字塔影象上的每個pixel,訓練速度快了3倍。
負樣本的chips如何生成(負樣本chips用於抑制false negative,也稱難分負樣本區域)?難分負樣本區域由RPN(訓練得比較簡單粗糙,a short learning schedule)輸出的proposals形成,這些proposals中包含了確實是gt bbox的區域,也包含了false positives,再利用正樣本chips + gt bbox剔除正樣本區域,剩餘的就是難分負樣本區域(包含false positives),那麼訓練階段每張影象上生成的chips數量,是基於影象中場景的複雜性,自適應調整的。
R-CNN和Fast R-CNN:
RCNN本身具有很好的尺度不變形,因為它先從圖片中提取proposal,然後都resize到224去提取特徵,但是這樣每個proposal不共享特徵的計算,很慢。
Fast系列為了解決這個問題,輸入大小不固定,不同尺度的圖片都經過同一個的cnn提取特徵,經過RoI Pooling得到尺寸一樣的圖,然後拿proposal去對應位置扣特徵,這就破壞了RCNN原來的尺度不變形,但是它很快且整體做特徵提取能捕捉更多的context。
SNIP是忽略掉大圖中的大proposal和小圖中的小proposal,也就是把一些極端的情況都忽略掉,相對來說只保留了尺度大致一致(和Imagenet的預訓練模型的尺度差不多)的proposal參與訓練,但是它也有個缺點就是訓練太慢了。
綜上,本文提出一種SNIPER的方法,通過生成scale specific context-regions,本文叫做chip,生成多個尺度的chips,不管是哪個尺度都取樣到512x512,這樣既保留R-CNN的尺度不變性和Fast R-CNN的速度,也在SNIP基礎上,過濾極端尺寸的同時,又過濾到了很大一部分背景,從而比SNIP快很多。
Chip Generation
chip:scale specific context-regions that cover maximum proposals at a particular scale
chip是某個圖片的某個scale上的一系列固定大小的的以恆定間隔排布的小窗,每個window都可能包含一個或幾個objects。
在每個scale上, K × K K×K K×K大小的chip以等間隔(d pixels)的方式排布。每個scale都會生成這些chips,而且chip的大小是固定的,變化的是圖片的尺寸。這跟anchor的思想剛好相反,因為anchor中,不變的是feature map,變化的是anchor。
chip又分positive和negative兩種:
- 每個Positive Chip都包含若干個ground truth boxes,所有的Positive Chips則覆蓋全部有效的ground truth boxes。
- 每個 Negative Chips 則包含若干個 false positive cases。
Positive Chip Selection
每個scale,都會有個area range R i = [ r m i n i , r m a x i ] , i ∈ [ 1 , n ] R_i=[r^i_{min},r^i_{max}],i∈[1,n] Ri=[rmini,rmaxi],i∈[1,n],這個範圍決定了這個scale上哪些ground truth box是用來訓練的。所有ground truth box中落在 R i R_i Ri範圍內的ground truth box 稱為有效的(對某個scale來說),其餘為無效的,有效的gt box集合表示為 G i G_i Gi 。從所有chips中選取包含(完全包含)有效 gt box最多的chip,作為Positive Chip,其集合稱為 C p o s i C^i_{pos} Cposi ,每一個gt box都會有chip包含它。因為 R i Ri Ri的區間會有重疊,所以一個gt box可能會被不同scale的多個chip包含,也有可能被同一個scale的多個chip包含。被割裂的gt box(也就是部分包含)則保持殘留的部分。
如上圖,SNIPER在一個合適的尺度範圍內處理了所有gt bbox,而僅需要四個512 x 512 pixel的小尺度chips,無需大尺度的影象金字塔操作。
所以說 SNIPER 相當於綜合了R-CNN 在scale上的優點 和Fast R-CNN在速度上的優點,這是本文的精妙之處。
更多細節:
- 在實際取樣中,出於計算量和樣本平衡的角度考慮,所有的chip不可能都被參與訓練,在論文中,作者使用了貪心的策略根據chip包圍的gt bbox的數量的多少,從每個尺度中抽取了前 K 個chip作為正chip,記做 C p o s i C^i_{pos} Cposi。最後在放大或者縮小的影象中,將取樣的chips裁剪出來,得到一系列大小固定( 512 x 512 pixel )的子圖,這些子圖將作為後續檢測演算法的訓練樣本。
- 原始碼中生成chips的方式並不是之前所說的先生成影象金字塔,再從影象金字塔中裁剪出 512 x 512 pixel的chips,原始碼中採用的方式是從原圖中取樣出等比例的chips,再將其resize到 512 x 512 pixel,這兩種策略是等價的,但是第二種無疑實現起來更為簡單。
Negative Chip Selection
前面提取的正樣本chips,可以覆蓋訓練集中的所有gt bboxes,但我們卻忽略了影象中的大部分背景區域,這些背景區域又可以分為兩種:難分背景區域、易分背景區域。
- 對於難分背景區域,模型最好是能在訓練中也將之使用,與正樣本一起參與訓練,提升模型對複雜場景的魯棒性。
- 對易分割槽域而言,模型將這些區域與難分割槽域同等對待,耗費同樣的訓練時間在上面,就顯得價效比很低了。
所以需要儘量避免篩選簡單易分背景區域、並儘量選擇難分背景區域參與模型訓練。
對於易分背景區域的剔除,一個簡單的解決辦法就是使用一個簡單的、粗糙的掃描器,在影象上過一遍,篩選出可能存在正樣本目標的區域。因為掃描器本身比較簡單粗糙,可以召回率優先,精確率次之。
- 召回率:針對原來的樣本而言的,它表示的是樣本中的正例有多少被預測正確了。
- 精確率:針對預測結果而言的,它表示的是預測為正的樣本中有多少是真正的正樣本。
那些未被召回的樣本,可能不僅沒有正例存在,連有挑戰性的負樣本也不存在,訓練的價值不大。
在實際操作中,作者是用了一個簡單的RPN,生成了一些準確率不高、但召回率不錯的proposals,這些proposals召回了大量正樣本gt bboxes區域,也引入了大量的難負樣本預期,然後沒有被該RPN召回的區域,就是易分背景區域了,直接忽略之即可。
下面就是選擇這些難分背景區域,參與到訓練中。RPN得到了高召回的proposals,對於每個尺度 i ,先剔除 C p o s i C^i_{pos} Cposi中已包含的所有正樣本proposals(此時就只剩下大量的難分負樣本proposals了),再來個貪心演算法(greedily select all the chips which cover at least M M M proposals in R i R_i Ri),就是挑選同樣合適尺度(就是負樣本proposals的尺度也要適宜)的負樣本proposals,再將這些proposals組合成合適的負樣本chips(不能稱為組合,因為它們本身就在某個chips之內了,將其劃分為負樣本chips即可),就構成了 C n e g i C^i_{neg} Cnegi。
如上圖,第一行的綠框是gt box,第二行的紅點對應RPN生成的false positive的中心座標,橙色框是根據生成的難分false positive proposals,利用貪心演算法生成的難分背景區域。
最終,SNIPER僅處理包含false positives的難分背景區域,易分背景區域直接忽略,訓練速度不僅快了,也更有針對性了。
Label Assignment
文章中稱網路是end-to-end的,但應該沒有把生成positiv/negative chips的過程算進去,初步篩選proposals的RPN也比較粗糙,不太可能和後面的結構引數共享。作者有意模糊了這個概念,可以說通過SNIPER篩選了chips後,模型可以用過SNIP的訓練方式end2end,但不能說整套流程都是end2end的。
網路是直接在chips上end2end訓練的,生成proposas,再進一步進行分類、迴歸。與SNIP類似,無需在 R i R_i Ri內過濾掉不合尺度的gt box,而是在訓練階段直接不考慮這些proposals。與Fast R-CNN類似,IoU>0.5便可認定為正樣本。
來看一下實驗結果:
參考: