mmdetection最小復(fù)刻版(十一):概率Anchor分配機(jī)制PAA深入分析
AI編輯:深度眸
0 摘要
論文題目:
Probabilistic Anchor Assignment with IoU Prediction for Object Detection
論文地址:
https://arxiv.org/abs/2007.08103
? ? 本文思想非常簡單,通俗易懂:既然正負(fù)樣本定義這么重要,并且都存在超參難調(diào)先驗設(shè)置問題,那么我就讓正負(fù)樣本定義全自動化,具體是將正負(fù)樣本定義建模為2個模態(tài)的混合高斯概率分布問題(正負(fù)類型兩個模態(tài)),求解該問題就可以每個樣本屬于正負(fù)樣本的概率,再采用簡單的切分手段就可以定義正負(fù)樣本了。
? ? 看下圖就一目了然:

? ? 對于特征圖上面任意一點,假設(shè)我們已經(jīng)得到了其評估anchor的正樣本屬性分值,然后采用2個模態(tài)的混合高斯分布進(jìn)行建模,求解該問題就可以得到每個樣本相對于正負(fù)樣本概率了,后面的問題就簡單了。
? ? 看過我文章的朋友應(yīng)該都很清楚,在目標(biāo)檢測算法中正負(fù)樣本定義是一個非常核心問題,特別是在一階段目標(biāo)檢測中:
(1) faster rcnn和retinanet系列采用通用的iou閾值來區(qū)分正負(fù)樣本,不夠魯棒
(2) dynamic rcnn通過在訓(xùn)練中自適應(yīng)的提高iou閾值來動態(tài)改變正負(fù)樣本定義,算是一個不錯的改進(jìn)
(3) fcos采用的是回歸范圍限制和中心擴(kuò)展系數(shù)超參來區(qū)分正負(fù)樣本,超參難以設(shè)置
(4) atss提出了基于每層候選anchor,然后計算均值和方差來自適應(yīng)的計算正負(fù)樣本,雖然超參就一個但是其實有先驗即物體越靠近中心越有可能是正樣本,沒有做到基于預(yù)測值進(jìn)行自適應(yīng)功能
(5) yolov3和v4系列采用了iou和網(wǎng)格約束先驗來區(qū)分正負(fù)樣本,而v5創(chuàng)新性的采用了寬高比例和鄰近網(wǎng)格約束進(jìn)行區(qū)分
? ? 上述主流算法,雖然都注意到了正負(fù)樣本定義問題,并且提出了自己相應(yīng)的解決辦法,但是沒有做到真正的基于數(shù)據(jù)集自適應(yīng)。本文則從概率分布方面出發(fā),做到了基于預(yù)測情況來自適應(yīng)確定正負(fù)樣本,即使不管效果,本文思想也是一個進(jìn)步。
github地址:
https://github.com/hhaAndroid/mmdetection-mini
歡迎star
1 算法實現(xiàn)
1.1 網(wǎng)絡(luò)結(jié)構(gòu)
? ? 首先整體算法采用的是retinanet,不過為了更好評估bbox預(yù)測質(zhì)量,參考前面的相關(guān)論文,加入了iou預(yù)測分支,都是常規(guī)操作。

分類分支采用focal loss,bbox回歸分支采用giou loss,iou質(zhì)量評估分支采用bce loss,其label是預(yù)測bbox和gt bbox的iou。并且考慮了自適應(yīng)策略,就不需要那么多anchor了,故和atss論文一樣anchor設(shè)置為1個。
1.2 定義正負(fù)屬性分值函數(shù)
? ? 要構(gòu)造高斯分布,首先需要找出能夠反映每個樣本的正負(fù)屬性分值。假設(shè)要我們自己設(shè)計,我覺得應(yīng)該從以下幾個方面考慮:
(1) 該分值必須要能夠反映出其適合作為正樣本的適應(yīng)度,適應(yīng)度越高則表示其越適合作為正樣本
(2) 該分值最好能夠聯(lián)合3條分支,因為訓(xùn)練時候是三條分支獨立訓(xùn)練,但是測試時候是聯(lián)合測試,采用3條分支進(jìn)行聯(lián)合計算,有助于測試階段,可以最大程度保證一致性
? ? 作者做法是:

g是gt bbox,f是神經(jīng)網(wǎng)絡(luò),theta是可學(xué)習(xí)參數(shù),a是anchor,x是圖片輸入,可以看出anchor分值S應(yīng)該等于分類分值乘以bbox質(zhì)量評估分值的gamma次方。分類分值很好算,肯定來自分類分支,而bbox評估分值來自iou分支

S函數(shù)肯定是概率分布格式,因為其范圍是0-1,故可以構(gòu)造最大似然,取負(fù)對數(shù)形式:

? ? 由于分類分支采用bce loss,所以等式后面第一項其實就是分類loss函數(shù),而后一項可以等效為IOU loss(理論上第一行和第二行不是完全相等的,除非iou分支的loss也是bce loss,但是是正相關(guān)的)。最終其分值函數(shù)S(公式3)可以等效定義為分類Loss加上iou loss(bbox回歸還原值和gt bbox計算出的iou loss)乘上系數(shù)。
? ? 可以發(fā)現(xiàn)該公式是滿足上面準(zhǔn)則:s越小表示越可能是正樣本(需要結(jié)合后面的高斯建模過程才能理解);利用了三條分支(bbox預(yù)測分支已經(jīng)和iou分支聯(lián)合訓(xùn)練了)的輸出預(yù)測情況來聯(lián)合計算。
? ? 在代碼層面,為了減少計算量(因為我雖然不知道哪些是正樣本,但是對于少數(shù)負(fù)樣本我是很容易確定的),作者首先采用了retinanet里面的MaxIoUAssigner策略先進(jìn)行初步的正負(fù)樣本劃分,其參數(shù)為:

? ? 之所以設(shè)定閾值如此低就是為了保證負(fù)樣本一定是背景,沒有任何爭議。這個操作非常重要,本質(zhì)上高斯建模面對的樣本屬于模糊樣本或者正樣本,而不含純粹的負(fù)樣本,否則iou這個地方loss可能一直是0,那么就有問題了。

代碼比較簡單,就是對上述正樣本提前算一輪分類和bbox回歸的loss,相加即可,Loss越小越可能是正樣本。
1.3 建立混合高斯模型
? ? 對每個樣本都可以得到一個分值S,下面就比較簡單了,對所有分值計算混合高斯分布GMM,由于GMM是非常成熟的算法了,所以作者直接調(diào)用的sklearn.mixture包進(jìn)行求解。
? ? 但是在具體操作上有些地方要說明下:
(1) 是否是正負(fù)樣本是基于當(dāng)前gt bbox而言的,也就是說gmm操作需要在每個gt bbox所對應(yīng)的樣本上單獨進(jìn)行
(2) 由于大小輸出size差別很大,樣本數(shù)也差距較大,為了公平起見和加快速度,按照atss策略,先在每個輸出層上利用topk策略選擇出loss較小的前k個樣本,topk后面的樣本直接就是負(fù)樣本(比較暴力,不那么優(yōu)雅),不需要算了
整個自適應(yīng)策略的整體流程圖如下(不用看也行):

代碼層面上流程是:
(1) 首先前面返回的正樣本分值是全部圖片和全部輸出層flatten的,為了后面topk計算需要先記錄每層對應(yīng)的mask
# 記錄每個輸出層樣本mask,方便后面切割每層樣本for i in range(num_level):# pos_inds里面存儲的是所有輸出層flatten后的值,所以需要先把各輸出層的數(shù)據(jù)提取出來mask = (pos_inds >= inds_level_interval[i]) & (pos_inds < inds_level_interval[i + 1])pos_level_mask.append(mask)
(2) 遍歷每個gt bbox,然后遍歷每個特征圖,采用topk選擇出前topk個小loss的樣本,進(jìn)行后續(xù)聚類

(3) 對每個gt bbox所選擇的候選列表進(jìn)行g(shù)mm建模,權(quán)重初始化為1:1,得到分配結(jié)果和分值

1.4 確定正負(fù)樣本
? ? 在建模得到分布后,進(jìn)行正負(fù)樣本分離做法有非常多種,如下所示:

作者后面有對比實驗,發(fā)現(xiàn)(c)比較好,所以代碼實現(xiàn)的是(c)類型。注意上述圖繪制的意思是分值越大越可能是正樣本,但是實際上我們用的是loss,其是相反的。

找出了正樣本索引,那么其余都是負(fù)樣本了,沒有忽略樣本。后面就是正常的loss計算就行。

通過實驗發(fā)現(xiàn),(c)策略效果好一點。并且在采用固定正樣本數(shù)這種操作情況下效果都沒有本文自適應(yīng)好。
1.5 可視化分析
? ? 代碼已經(jīng)集成進(jìn)框架中了,只需要把configs/paa/paa_r50_fpn_1x_coco.py中train_cfg設(shè)置為True即可,由于其內(nèi)部調(diào)用了Anchor_head的分配策略,故可視化效果是先可視化第一次正負(fù)樣本分配情況,然后在可視化第二次PAA正負(fù)樣本分配情況,如下所示:
第一次分配:

第二次分配:

第一次分配:

第二次分配:

? ? 看起來這個分配策略比目前最好的ATSS還要好。這是是真正的自適應(yīng)了(基于預(yù)測情況而改變),ATSS可以認(rèn)為是偽自適應(yīng)(不管預(yù)測輸出咋樣,其正負(fù)樣本定義不變)。
1.6 推理流程
? ? 在推理過程中,作者還希望用到前面的分值s來進(jìn)一步提高性能,既然有這個信息那肯定要用上。作者采用了常規(guī)的bbox voting策略來加權(quán)投票,和常規(guī)bbox voting區(qū)別在于權(quán)重計算方式:

s_i是iou預(yù)測值和分類分值的乘積,分值越大越好,bbox voting應(yīng)用于nms后,其核心思想是利用被nms抑制后的bbox來加權(quán)nms后保留的bbox,進(jìn)行bbox調(diào)整。思路非常好理解,假設(shè)nms后留下了某個bbox,但nms一共抑制了5個bbox,那么很明顯我可以利用這5個bbox采用加權(quán)方式來refine當(dāng)前保留的bbox,其核心就是如何算權(quán)重。

可以看出采用bbox voting后可以提高大概0.2mAP。

2 總結(jié)
? ? 本文通過將正負(fù)樣本定義問題轉(zhuǎn)化為2模態(tài)的混合高斯建模問題,可以達(dá)到超參少、真正自適應(yīng)的目的。思想還是很可取的,就是實現(xiàn)上過于簡單,過于暴力,在不同數(shù)據(jù)集上不知道會不會有其他問題,期待后續(xù)有更優(yōu)雅的實現(xiàn)辦法。
github地址:
https://github.com/hhaAndroid/mmdetection-mini
歡迎star
推薦閱讀
mmdetection最小復(fù)刻版(六):FCOS深入可視化分析
mmdetection最小復(fù)刻版(二):RetinaNet和YoloV3分析
機(jī)器學(xué)習(xí)算法工程師
? ??? ? ? ? ? ? ? ? ? ? ? ??????????????????一個用心的公眾號
?

