全網(wǎng)搜集目標(biāo)檢測相關(guān),人工篩選最優(yōu)價值內(nèi)容 文章系統(tǒng)性的分析了目標(biāo)檢測(two-stage和one-stage)中特征的沖突和不對齊問題,并總結(jié)了現(xiàn)有的改進(jìn)方案。希望可以給大家?guī)硪恍椭?/span>。 作者 | 黃飄
鏈接 | https://zhuanlan.zhihu.com/p/114700229
前言
昨天看到一篇商湯的刷榜文《1st Place Solutions for OpenImage2019 - Object Detection and Instance Segmentation》,里面的每個技巧我們都見過,還有很多依靠大量計算資源的參數(shù)搜索和模型集成。不過其中關(guān)于回歸和分類的沖突勾起了我的回憶,去年整理了一些相關(guān)的文章。我準(zhǔn)備在簡要介紹這片文章的同時,談?wù)勀繕?biāo)檢測(two-stage和one-stage)中特征的沖突和不對齊問題,以及現(xiàn)有的改進(jìn)方案。
Two-stage目標(biāo)檢測中的特征/任務(wù)沖突問題1.1 Two-stage目標(biāo)檢測的流程與原理
說起兩階段目標(biāo)檢測算法,大家耳熟能詳?shù)木褪荈aster RCNN系列了,目前的大多數(shù)兩階段算法也都是在其基礎(chǔ)上進(jìn)行的改進(jìn)。不過現(xiàn)在新出的很多“N-階段”的算法把大家搞混了。所以我這里申明一下兩階段的意義,我們通常說的兩階段是以Faster RCNN算法為基準(zhǔn)的,第一階段是特征提取和候選框提取,主要是RPN網(wǎng)絡(luò),第二階段是對候選框進(jìn)行進(jìn)一步篩選、精修和細(xì)分類,主要是ROI Pooling/Align等網(wǎng)絡(luò)。 在我的上一篇博文 中提到過兩階段目標(biāo)檢測的關(guān)于平移不變性和相等性的矛盾問題,這里我們詳細(xì)探討一下。兩階段目標(biāo)檢測中,第一階段做的事前/背景分類和候選框回歸,第二階段做的是候選框精修回歸和細(xì)分類。正如之前所討論的,分類 任務(wù)希望無論目標(biāo)的位置和形狀怎么變化,什么類別的目標(biāo)就是什么類別,即需要保證平移和尺度的不變性 。而回歸任務(wù),我在上一篇博文中提到了,對于物體位置的回歸很大程度可能依賴padding信息,當(dāng)然這不是這次的討論重點,回歸 需要保證目標(biāo)的位置和形狀變化反映在特征上,進(jìn)而回歸得到位置,即平移和尺度的相等性 。這一問題在行人檢索 中更加嚴(yán)重,因為行人檢索問題中的識別任務(wù)要求同類目標(biāo)的不同身份要區(qū)分開 ,這一點就與目標(biāo)檢測中的分類任務(wù)相違背,因為檢測中的分類不論什么身份,只要屬于同一類別即可。
1.2 現(xiàn)有的相關(guān)解決方案
在正式介紹相關(guān)改進(jìn)策略之前,我們先提提Cascade RCNN算法[3],其原理如下: 要注意的是Iterative bbox方式和Cascade RCNN方式的形式雖然一樣,但是不同之處在于前者僅僅是用于測試階段,可以觀察到都是head network都是一樣的,而后者各個head network都是訓(xùn)練來的。從形式來看,很明顯就是將最后的分類和回歸分支級聯(lián)做了3次。這樣做的依據(jù)就是: 第一幅圖中橫坐標(biāo)是回歸前候選框與gt的iou,縱坐標(biāo)是回歸后的iou,可以看到不同的候選框質(zhì)量對于回歸效果也有影響。第二幅圖中基于不同iou閾值訓(xùn)練得到的網(wǎng)絡(luò)對于AP也有影響。再考慮到訓(xùn)練集和測試集內(nèi)樣本分布的不同,作者采用分而治之的策略,分別用{0.5,0.6,0.7}三種IOU閾值級聯(lián)訓(xùn)練。這里 提到了各階段的具體訓(xùn)練方式: 分類和回歸都是一個模式,不僅用gt的標(biāo)簽,還用到了上一階段的結(jié)果作為標(biāo)簽,來保證結(jié)果的穩(wěn)定性。最后我們來看看各種方案的對比實驗結(jié)果: 可以看到的是iterative bbox(以不同iou閾值做多次nms)和integral loss(以不同iou閾值并聯(lián)多個回歸和分類過程)都能提升一點點AP,但是Cascade RCNN(以不同iou閾值級聯(lián)多個回歸和分類過程)效果提升最大。 好了,我們回歸正題,Cascade RCNN從樣本質(zhì)量分布mismatch和iou等角度進(jìn)行了級聯(lián)的refine操作。那么在IOU-Net[4]則是顯式地說明了分類的分?jǐn)?shù)不適合用于NMS的過濾,因為分類置信度高的樣本不一定真的好。因此作者增加了一個樣本與gt的iou預(yù)測階段,以此作為NMS的排序依據(jù) 。這里實際上就說明了分類和回歸的沖突問題。 至于為了提高預(yù)測精度的PrROI-pooling,我就不仔細(xì)分析其原理了,不是這里的討論重點: 那么真正意義上把分類和回歸問題放在明面上的我覺得是Double-Head RCNN[2],來自于18年COCO檢測冠軍曠視團(tuán)隊。 我們可以看到,不同于傳統(tǒng)的將回歸和分類放在最后階段,利用兩個全連接分支來預(yù)測,Double-Head直接從ROI Align之后就將兩個人任務(wù)分開了,盡可能減少二者共享的特征部分。而Double-Head-Ext方案則是讓兩個分支都能預(yù)測類別和位置。 可以看到,四種方案下平衡兩個分支損失函數(shù)權(quán)重后,后兩種的效果明顯更好。最后我們來看看CVPR2019的Guided Anchoring算法。 這個算法解決的是anchor的設(shè)計問題,而anchor的設(shè)計需要解決形狀對齊和特征一致性 的問題。其中形狀對齊指的是以往anchor的尺寸和長寬比都是預(yù)設(shè)的固定幾個,首先這也是超參數(shù),其次無法適應(yīng)多樣的樣本形狀,因此該算法以特征圖每個點作為中心,先預(yù)測anchor的長寬,再用于預(yù)測。而特征一致性問題則是一個很巧妙的問題,原因在于,同一層的特征圖上每個點的感受野一致,但是預(yù)測到的anchor尺寸卻不同,那么基于不同大小的anchor來做的分類任務(wù)卻基于相同的特征感受野 ,這顯然是存在問題的。所以作者基于預(yù)測得到的anchor長寬,利用deform-conv為每個anchor分配了新的特征區(qū)域,其中deform-conv中的offset直接采用預(yù)測得到的anchor長寬。
One-stage目標(biāo)檢測中的特征不對齊問題2.1 One-stage目標(biāo)檢測中的問題
One-stage目標(biāo)檢測算法,以YOLO系列、SSD系列、RetinaNet等為經(jīng)典,下面是YOLOv3的網(wǎng)絡(luò)流程: 我們可以看到的是單階段的目標(biāo)檢測算法相當(dāng)于取消了RPN階段,所以兩階段目標(biāo)檢測中遇到的問題(分類與回歸特征沖突,anchor與特征不對齊),在單階段目標(biāo)檢測中只會更加嚴(yán)重。不過單階段目標(biāo)檢測的目標(biāo)就是提升速度,所以我目前并沒有看到對第一個問題的解決方案,而去年對于anchor與特征不對齊的問題有好多解決策略。原因在于兩階段目標(biāo)檢測中ROI Pooling本身有一個利用候選框裁剪特征區(qū)域的過程,緩解了這一問題,而單階段目標(biāo)檢測卻沒有這一過程。
2.2 “1.5-stage"解決策略
CVPR2018有一篇RefineDet算法[9],這個算法是針對SSD算法的改進(jìn),融合了單階段和兩階段的設(shè)計思路,但又不是我們之前所說的RPN+ROIPooling這類框架,所以就叫它“1.5stage"檢測框架吧。RefineDet有兩個模塊,其中上面是ARM,用于調(diào)整anchors的位置和大小,下面是ODM,用于目標(biāo)檢測。這個跟Guided Anchoring的設(shè)計思路很像,不過比較簡陋。除此之外,RefineDet還采用了級聯(lián)預(yù)測的模式,利用中間的TCB模塊,其通過Deconv和特征Concat反向級聯(lián),類似于FPN的模式。 同樣地,相同的團(tuán)隊在AAAI2019的一篇人臉檢測算法SRN[6]也用了RefineDet的框架: 可以看到整體框架很像,但是卻有所不同,SRN框架包含有STC+STR+RFE三個模塊。其中STC模塊作用于淺層網(wǎng)絡(luò),用于過濾掉大部分的負(fù)樣本,STR作用于高層特征,用于粗略調(diào)整anchor,類似于RefineDet。而RFE則是在接受各個尺度特征的同時,利用非正方形的卷積核對感受野進(jìn)行增強(考慮到人臉不一定是正的)。 在ICCV2019中有一篇比較特別的檢測算法Reppoints[7],其出來的時機正好是anchor-free算法大火的時候,其框架比較特別,可以看作是DCN+Refine操作的集成,有人也稱其為DCNv3: 這個框架的特別之處在于沒有預(yù)測框,沒有預(yù)測中心或者角點,而是預(yù)測的目標(biāo)邊緣的九個點。不過我覺得這幾個特征點更像是一種解釋,而不是出發(fā)點。其原理是以特征圖上每個點為中心,預(yù)測包含該位置的目標(biāo)的九個邊緣點。其方式是通過卷積的方式預(yù)測各個點的相對位置(x,y)偏移,以此作為Deform Conv的偏移量對原特征圖進(jìn)行卷積,由此使得特征與目標(biāo)區(qū)域更加重合 ,從而進(jìn)行第二階段的預(yù)測??梢园l(fā)現(xiàn),Reppoints很像anchor free版的Guided Anchoring,而之前提到的RefineDet和SRN雖然提到了anchor預(yù)更新,但是特征并沒有校正 。 WACV2020的一片P&A算法[5]算是對上面的不足做了完善,但是我感覺像是把Guided Anchoring中的Feature Adaption直接搬過來了,為什么這么說呢。因為P&A也是先預(yù)測anchor偏移和前景背景分類,然后以此作為deform conv的offsets對特征重提取,再進(jìn)行目標(biāo)位置回歸和細(xì)分類。 同時間出來的AlignDet[8]則是提出了ROIConv: 上圖中(a)指的就是RefineDet類的對齊,(b)就是Reppoints一類的對齊,(c)就是Guided Anchoring類的對齊,(d)就是AlignDet類的對齊。AlignDet把基于anchor偏移量的特征對齊稱作ROIConv,還分析了具體的偏移校正過程: 可以看到有兩次預(yù)測過程,作者采用了Cascade的 方式,兩次的IOU閾值不同。其實仔細(xì)看的話P&A和AlignDet的結(jié)構(gòu)幾乎一模一樣,看評審怎么看吧,估計也是考慮到這方面因素給掛了。
《1st Place Solutions for OpenImage2019 - Object Detection and Instance Segmentation》介紹
現(xiàn)在我們來看看商湯在OpenImage2019上的文章,可以當(dāng)作技術(shù)報告來看。我們直接按照論文提到的創(chuàng)新點或者工作來一一說明。
作者出發(fā)點是目標(biāo)檢測框架中分類的回歸任務(wù)對于特征的要求不同 ,而這一點在我上面提到的Double Head RCNN已經(jīng)提過了。Decoupling Head則是考慮到我們前文提到的anchor和特征不對齊問題,利用傳統(tǒng)的ROI Pooling主干預(yù)測anchor的粗略位置,然后用deform conv的方式校正分類分支。再在主干上保留原始的回歸和分類任務(wù)。總而言之可以將其概括為:Double Head RCNN + AlignDet + Faster RCNN
Adj-NMS 這部分作者的描述方案很“有意思”,作者考慮到NMS和soft-NMS的不足,先利用0.5的IOU閾值做了一次NMS,將靠得比較近的候選框過濾掉了,然后再用基于高斯核的soft-NMS做二次過濾。
我們可以根據(jù)這個公式來看看,假設(shè)分類置信度閾值為0.5,候選框分類置信度為1,那么Soft-NMS階段要想留下,IOU必須小于0.59,而第一次的NMS已經(jīng)將IOU>0.5的候選框過濾掉了,所以這個理論上可行。因此我們可以認(rèn)為作者幾乎不怎么考慮特別密集擁擠的場景了。 其效果也有0.174個點的提升。其實如果注意的話,有點像前文介紹Cascade RCNN是所提到了Iterative bbox策略,即做多次NMS。SoftNMS只能通過重新打分撈回原本得分比較低的樣本,但是NMS已經(jīng)將大部分的候選框給過濾掉了,所以我很好奇這是怎么生效的。
Model Ensemble 很多大型比賽的固定策略“Ensemble",已經(jīng)不奇怪了。naive ensemble的策略是借鑒的2018年的OpenImage第二名,給定bounding boxes(P),以及topk個與之IOU較高的候選框,依據(jù)驗證集的分?jǐn)?shù)來分配各個模型在集成時的權(quán)重,這里還分各個目標(biāo)類別,然后進(jìn)行加權(quán):
這里作者訓(xùn)練了28個目標(biāo)檢測網(wǎng)絡(luò)....,利用二叉樹的方式進(jìn)行模型空間搜索。
Data Re-sampling 確保500個類別的目標(biāo)中各個類別被選取的概率相等。Decoupling Backbone 對于第25~28個模型,采取Decouple Head的策略,其中回歸分支的權(quán)重較小。Elaborate Augmentation 隨機選擇一個類別,利用旋轉(zhuǎn)放縮裁剪等方式進(jìn)行數(shù)據(jù)增強,這樣可以使得一幅圖中的類別數(shù)變少,緩解數(shù)據(jù)不平衡問題。Expert Model 利用專門的網(wǎng)絡(luò)訓(xùn)練專門的子類別數(shù)據(jù)集,這里面考慮了正負(fù)樣本均衡的問題,容易混淆(標(biāo)注標(biāo)準(zhǔn)不同,表觀相似)的樣本。AnchorSelecting 跟YOLO系列一樣,利用k-means方法得到18組anchors(6種長寬比,3種尺寸)。Cascade RCNN 設(shè)置了0.5,0.5,0.6,0.7四個階段的級聯(lián)檢測,這我就搞不懂Adj-NMS干嘛用的了。Weakly Supervised Training 由于OpenImage數(shù)據(jù)集中各類別的“長尾分布”很明顯,嚴(yán)重不均衡,所以作者增加了一些圖像級的標(biāo)注,結(jié)合有監(jiān)督和WSDDN算法中的弱監(jiān)督算法聯(lián)合訓(xùn)練。Relationships Between Categories 作者通過分析數(shù)據(jù)集中部分類別目標(biāo)之間的聯(lián)系,比如person和guitar等等,類似于條件概率,來修正分類置信度,比如一個有person在旁邊的guitar要比沒有person的guitar置信度要高。Data Understanding 作者發(fā)現(xiàn)OpenImage數(shù)據(jù)集中對于特定類別的目標(biāo)標(biāo)注有歧義,比如火炬和手電筒,劍和匕首等,所以作者將有歧義的類別細(xì)分成了上面說的多類。同時作者也發(fā)現(xiàn)有些目標(biāo),比如葡萄缺乏個體檢測框等,作者就利用葡萄串的實例標(biāo)注,擴展了很多葡萄框。
最后的分割部分我就不細(xì)講了,就是基于HRNet和Ensemble的方式進(jìn)行的實驗。
說在后面的話
實際上目標(biāo)檢測任務(wù)與多目標(biāo)跟蹤(MOT)也有很多聯(lián)系,比如MOT數(shù)據(jù)集中的MOT17Det,又比如新出的基于類檢測框架的Tracktor++算法,檢測跟蹤結(jié)合的框架JDE算法等。多目標(biāo)跟蹤領(lǐng)域絕不是一個局限于數(shù)據(jù)關(guān)聯(lián)的獨立領(lǐng)域,應(yīng)該是個多領(lǐng)域融合的方向。之前基于COCO的預(yù)訓(xùn)練模型在MOT17數(shù)據(jù)集上試了下,在MOT17Det上居然還有0.88AP,然后我基于這個又復(fù)現(xiàn)了下Tracktor++,居然也達(dá)到了58+MOTA,后面有機會我放github吧。對了,還有個Crowdhuman人體檢測的算法分享 。 https://zhuanlan.zhihu.com/p/68677880 參考資料
[1] 1st Place Solutions for OpenImage2019 - Object Detection and Instance Segmentation. [2] Rethinking Classification and Localization for Object Detection [3] Cascade r-cnn_ Delving into high quality object detection [4] Acquisition of Localization Confidence for Accurate Object Detection [5] Propose-and-Attend Single Shot Detector [6] Selective Refinement Network for Face Detection [7] Reppoints_ Point set representation for object detection [8] Revisiting feature alignment for one-stage object detection [9] Single-Shot Refinement Neural Network for Object Detection [10] https://zhuanlan.zhihu.com/p/63273342
雙一流大學(xué)研究生團(tuán)隊創(chuàng)建,專注于目標(biāo)檢測與深度學(xué)習(xí),希望可以將分享變成一種習(xí)慣! 整理不易,點贊 三連↓