SNIP 算法笔记
論文:An Analysis of Scale Invariance in Object Detection – SNIP
論文鏈接:https://arxiv.org/abs/1711.08189
代碼鏈接:http://bit.ly/2yXVg4c
這篇是CVPR2018的文章,引用文獻非常到位,同時實驗結果非常驚艷,總體來看比同是CVPR2018上的cascade RCNN效果還要好一些。概括而言,這篇文章從COCO數據集開始分析,認為目前目標檢測算法的難點在于數據集中object的尺寸分布較大,尤其對于小目標的檢測效果也有待提高,因此提出Scale Normalization for Image Pyramids (SNIP)算法來解決這個問題。
先來看看這篇文章的出發點。這篇文章的出發點可以簡單概括為:數據集。作者發現如果將數據集按照圖像中object的尺寸(scale)除以圖像尺寸的倍數來排序,那么在ImageNet數據集中,這個倍數的中位數差不多是0.554倍,而在COCO數據集中,這個倍數是0.106倍,如Figure1中兩條線標出的Median點所示。Figure1是關于ImageNet和COCO數據集中object尺寸和圖像尺寸的倍數關系曲線,橫坐標表示object的尺寸/圖像尺寸的值,縱坐標表示占比。也就是說在COCO數據集中,大部分的object面積只有圖像面積的1%以下,這說明在COCO數據集中小目標占比要比ImageNet數據集大。另外,從Figure1中的COCO曲線可以看出,第90%的倍數(0.472)差不多是第10%的倍數(0.106)的20倍!這說明在COCO數據集中的object尺寸變化范圍非常大。
那么這種差異會帶來什么影響呢?因為在目標檢測算法中常用基于ImageNet數據集預訓練的模型來提取特征,也就是常說的遷移學習,但是從Figure1的兩條曲線可以看出ImageNet和COCO數據集在object的尺寸分布上差異比較大,這樣在做遷移學習時可能會存在一些問題,文章中將這個問題概括為domain-shift,可以簡單理解為訓練集和測試集分布存在較大差異,后面會有實驗來證明這種差異對效果的影響。其實去年的YOLO v2也研究了類似的問題,YOLO v2考慮到在ImageNet數據集上預訓練模型時輸入圖像大小是224*224,和檢測網絡用的尺寸差別較大(YOLO v2中常用416*416),所以就將預訓練模型在416*416的ImageNet數據集上繼續預訓練,然后再用到檢測模型提特征,這樣就實現了預訓練模型和檢測模型的良好過渡。
其實之前就有不少算法針對數據集中不同尺寸的object檢測進行改進,比如以Feature Pyramid Network(FPN)為例的通過融合高低層特征并基于多層融合特征單獨預測的算法;以Dilated/Deformable Convolution為例的通過改變卷積核的感受野來提升檢測效果;以multi-scale training/inference為例的通過引入圖像金字塔來訓練或驗證圖像。這篇文章基于對數據集的分析,提出一種新的訓練模型的方式:Scale Normalization for Image Pyramids (SNIP),該算法主要包含兩個改進點:1、為了減少前面所提到的domain-shift,在梯度回傳時只將和預訓練模型所基于的訓練數據尺寸相對應的ROI的梯度進行回傳。2、借鑒了multi-scale training的思想,引入圖像金字塔來處理數據集中不同尺寸的數據。
接下來詳細介紹這兩種改進。
首先是在ImageNet數據集上做關于scale variantion的實驗,換句話說就是驗證前面提到的domain-shift對模型效果的影響。實驗結果參看Figure3和Figure4,主要通過基于不同分辨率的圖像訓練模型和用不同分辨率的圖像作為驗證集來驗證的方式評估訓練集和測試集的尺度差異對效果的影響。
CNN-B:分類模型還是基于ImageNet數據集常規的224*224大小來訓練,但是驗證數據做了修改,首先將ImageNet的驗證數據縮小到48*48、64*64、80*80、96*96和128*128,然后再將這些尺寸放大到224*224作為模型的輸入,可以看出放大后的圖像分辨率較低。因此這個實驗模擬的就是你訓練數據的分辨率(resolution)和驗證數據的分辨率不一致(甚至是差別很大)的時候對效果的影響,該實驗的結果可以看Figure4(a)。
CNN-S:訓練數據的分辨率和驗證數據的分辨率保持一致,這里主要針對48*48和96*96分辨率,同時對網絡結構的第一層做了修改。比如基于48*48的數據進行訓練,將卷積核大小為7*7的卷積層換成卷積核為3*3,stride為1的卷積層。基于96*96的數據進行訓練時,將卷積核大小為7*7的卷積層換成卷積核尺寸為5*5,stride為2的卷積層。顯然,該實驗模擬的是訓練數據分辨率和驗證數據分辨率一致時的效果,實驗結果可以看Figure4(b)(c)。
CNN-B-FT:是CNN-B在放大的低分辨率圖像上fine tune后的模型,同時輸入圖像也采用放大的低分辨率圖像。可以看出該實驗主要驗證基于高分辨率圖像訓練的模型是否能有效提取低分辨率圖像的特征,實驗結果可以看Figure4(b)(c)。
Figure4是關于Figure3中提到的CNN-B、CNN-S和CNN-B-FT的實驗結果。從(a)可以看出如果驗證數據的分辨率和訓練數據的分辨率差別越大,則實驗結果越差。這說明其實CNN網絡對尺寸變化的輸入圖像的魯棒性(robust)還不夠好。從(b)和(c)中CNN-B和CNN-S的對比可以看出當訓練數據的分辨率和驗證數據的分辨率相同時,效果要好很多。從(b)和(c)中CNN-B和CNN-B-FT的對比可以看出后者的效果要更好,二者的差別僅僅在于模型是否在放大的低分辨率圖像上做fine tune,因此可以得出結論:基于高分辨率圖像訓練的模型同樣能有效提取放大的低分辨率圖像的特征。
介紹完在ImageNet數據集上的實驗,接下來就來看看在COCO數據集上關于scale-specific detector和scale invariant detector的實驗,具體實驗結果參看Table1和Figure5。
Table1是關于在小目標驗證集上的檢測效果對比,所用的驗證圖像尺寸都是1400*2000。
800all和1400all分別表示檢測網絡基于800*1400和1400*2000大小的圖像進行訓練,從二者的mAP結果對比可以看出1400all的效果要更好一些,主要原因就在于訓練圖像的分辨率和驗證圖像的分辨率一致,這和前面基于ImageNet數據集的實驗結果也吻合,但這個提升非常小,猜測原因在于雖然基于放大圖像(原始圖像大概640*480,放大成1400*2000)訓練的模型在訓練過程中可以提高對小目標物體的檢測,但是由于訓練數據中尺寸中等或較大的目標的尺寸太大所以難以訓練,這就影響了模型最終的效果。檢測結果可以參考Figure5(1)。
1400<80px表示訓練數據尺寸是1400*2000,但是訓練過程中忽略中等尺寸和大尺寸的目標(中等和大尺寸目標的標準是在原始圖像中目標寬高的像素點大于80),這就是前面所說的scale-specific detector,也就是基于單一尺寸范圍的輸入進行訓練,這樣能夠減少所謂的domain-shift。因此做這個實驗的目的是基于前面那個實驗中的猜想:基于1400*2000大小的圖像訓練時由于訓練數據中尺寸中等及較大的目標對模型訓練有負作用,因此這里直接在訓練過程中忽略這樣的數據。但是從Table1可以看出這個模型的效果非常差,猜想原因是忽略這些訓練數據(占比大約30%)所帶來的數據損失對模型效果的影響更大,具體的檢測結果可以參考Figure5(2)。
Multi-Scale Training(MST)表示訓練一個檢測器時采用不同尺度的圖像進行訓練(包括480*800),也就是前面所說的scale invariant detector。照理來說這個實驗的效果應該會比較好的,因為每個object都會有多種尺寸來訓檢測模型,但是從Table1可以看出該模型的效果和800all差不多,這是為什么呢?主要原因在于訓練數據中那些尺寸非常大或非常小的object會影響訓練效果,因此這篇文章在引入MST思想的同時限定了不同尺寸的object在訓練過程中的梯度回傳,這就是SNIP。
Scale Normalization for Image Pyramids(SNIP)是這篇文章提出的算法,從Table1可以看出效果提升非常明顯。
Figure5是關于Table1中不同實驗的訓練數據展示。
鋪墊了這么多,終于輪到這篇文章的主角登場了:Scale Normalization for Image Pyramids(SNIP)。
從前面的分析可以看出,我們希望有一個算法能夠既get到多尺度的目標信息,又能減少domain-shift帶來的影響,因此就誕生了SNIP。SNIP借鑒了Multi-Scale Training(MST)的思想,在MST方法中,由于訓練數據中尺寸極大或極小的目標會影響實驗結果,因此SNIP的做法就是只對尺寸在指定范圍內的目標回傳損失(該范圍需接近預訓練模型的訓練數據尺寸),也就是說訓練過程實際上只是針對這些目標進行的,這樣就能減少domain-shift帶來的影響。又因為訓練過程采用了類似MST的做法,所以每個目標在訓練時都會有幾個不同的尺寸,那么總有一個尺寸在指定的尺寸范圍內。需要注意的是對目標的尺寸做限制是在訓練過程,而不是預先對訓練數據做過濾,訓練數據還是基于所有數據進行。實驗證明這種做法對小目標物體的檢測非常有效,參看Table1中SNIP的mAP結果。
Figure6是SNIP算法的示意圖。不管是訓練檢測器還是RPN網絡,都是基于所有ground truth來定義proposal和anchor的標簽。正如前面所述,某個ROI在某次訓練中是否回傳梯度是和預訓練模型的數據尺寸相關的,也就是說當某個ROI的面積在指定范圍內時,該ROI就是valid,也就是會在此次訓練中回傳梯度,否則就是無效的(如Figure6中右邊的紫色框所示)。這些invalid ROI所對應的invalid ground truth會用來決定RPN網絡中anchor的有效性確定。invalid anchor的定義是和invalid ground truth的IOU大于0.3的anchor就是invalid anchor,如Figure6中左邊的黑色框所示。
關于RPN網絡中不同標簽的anchor比例作者也做了分析,我們知道在RPN網絡中,一個anchor的標簽是根據該anchor和ground truth的IOU來決定的,只有兩種情況下才會認為某個anchor的標簽是正樣本(標簽為1):1、假如該anchor和某個ground truth的IOU超過某個閾值(閾值默認采用是0.7),那么該ancho就是正樣本。2、假如一個ground truth和所有anchor的IOU都沒超過該閾值,那么和該ground truth的IOU最大的那個anchor就是正樣本。同樣,作者將conv4的輸出作為RPN網絡的輸入,然后設置了15種anchor(5 scales,3 aspect ratios),接下來就有意思了,作者發現在COCO數據集上(圖像大小為800*1200),只有30%的ground truth滿足前面第一種情況!即便將閾值調整為0.5,也只有58%的ground truth滿足第一種情況!這說明什么?說明即便閾值等于0.5,仍有40%的正樣本anchor和ground truth的IOU小于0.5(這些anchor是因為滿足前面的情況2才被定義為正樣本)!顯然,這樣的正樣本質量不算很高。而這篇文章因為引入多種分辨率的圖像作為輸入,所以在一定程度上緩解了這種現象。另外,作者也嘗試將conv4和conv5的特征做融合并預測,不過這部分文章只是一筆帶過,還需要看源碼才能知道具體是怎么做的。
實驗結果:
Table2是SNIP算法和其他算法的對比。第二行的multi-scale test顯然比第一行的single scale效果要好。第三行,在multi-scale test的基礎上加入multi-scale train的時候,會發現在大尺寸目標(APL)的檢測效果上要比只有multi-scale test的時候差。這個原因我們在前面也介紹過了,主要是因為訓練數據中那些尺寸極大和極小的object對訓練產生了負作用。
Table4是幾個目標檢測算法結果的對比。D-RFCN表示Deformable RFCN。D-RFCN+SNIP(RCN+RPN)表示在Deformable RFCN算法的檢測模塊和RPN網絡中同時加入SNIP。
總結
- 上一篇: android 农历源码,android
- 下一篇: 英雄无敌服务器维护,英雄无敌王国服务器地