1. 程式人生 > 實用技巧 >小目標檢測模型總結+SNIP+SNIPER

小目標檢測模型總結+SNIP+SNIPER

小目標檢測

在MS COCO資料集中,對於面積小於32*32的物體,MS COCO就認為它是小物體,在評測時,會對這個範圍內的物體計算APsmall。

在行人庫CityPerson中,原圖大小為1024*2048,小目標定義為高度小於75的目標。

目前小目標檢測的方法大致有一下4類(不過這是2018年的回答了):

  1. Scale

    最簡單粗暴的方法就是放大圖片。這就是在尺度上做文章,如FPN(Feature Pyramid Network),SNIP(An Analysis of Scale Invariance in Object Detection – SNIP)。

    特徵圖的解析度 stride 的設定也算在這個裡面。

    另外,如果影象尺寸特別大,可以考慮 YOLT(You only look twice)中切圖的方法。

  2. Context

    小物體需要有更多的周邊資訊來幫助識別,如何利用這些資訊,two stage 可以從 ROI Pooling 上下手,另也有 Jifeng Dai 老師的 Relation Network for Object Detection。

    或者上dilated類似混合感知野,或者在head部分引入SSH相似的模組。

  3. Anchor

    迴歸的好不如預設的好,S3FD 做了非常細緻的 anchor 的實驗,可以幫助我們更合理地設計anchor。

  4. Matching strategy

    對於小物體不設定過於嚴格的 IoU threshold,也可以參考iou loss和cascade rcnn的思路。

  5. 使用GAN,在檢測器後面對抗一把。

  6. 用soft attention去約束confidence相關的feature map,或者做一些pixel wise的attention。

參考:小目標檢測問題中“小目標”如何定義?其主要技術難點在哪?有哪些比較好的傳統的或深度學習方法? - ChenJoya的回答 - 知乎

深度學習在 small object detection 有什麼進展? - 尼箍納斯凱奇的回答 - 知乎

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引入的多種解析度影象作為輸入一定程度上可以緩解這種現象。

參考:

SNIP 演算法筆記

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便可認定為正樣本。

來看一下實驗結果:

在這裡插入圖片描述

參考:

SNIPER(1) 論文 NIPS2018

目標檢測-SNIPER-Efficient Multi-Scale Training-論文筆記