您當前的位置:首頁 > 書法

Soft-NMS(4)_思考_ICCV2017

作者:由 胡孟 發表于 書法時間:2018-12-05

本筆記介紹Soft-NMS,透過fig1、2、3很容易理解,作者能發現NMS中的不足,並透過一個很簡單的方案就很顯著地提升了效能,贊~~~

1 NMS簡介

NMS操作:

step-1

:將所有檢出的output_bbox按cls score劃分不同子類的bbox集合(如pascal voc分20個類,也即將output_bbox按照其對應的cls score劃分為21個集合,1個bg類,只不過bg類就沒必要做NMS而已);

step-2

:在每個子類集合內根據各個bbox的cls score做降序排列,得到一個降序的list_k;

step-3

:從list_k中top1 cls score開始,計算該bbox_x與list_k中其他bbox_y的IoU,若IoU大於閾值T,則剔除該bbox_y,最終保留bbox_x,從list_k中取出;

step-4

:選擇list_k中top2 cls score(step-3取出top 1 bbox_x後,原list_k中的top 2就相當於現list_k中的top 1了,但如果step-3中剔除的bbox_y剛好是原list_k中的top 2,就依次找top 3即可,理解這麼個意思就行),重複step-3中的迭代操作,直至list_k中所有bbox都完成篩選;

step-5

:對每個子類集合的list_k,重複step-3、4中的迭代操作,直至所有list_k都完成篩選;

NMS中的一個操作為:若任意bbox_i與當前max score bbox_M的IoU大於閾值Nt,直接將bbox_i的score置0,因此如fig 1,綠框bbox確實是跟紅框高score bbox IoU過大,若一刀切將其幹掉,就相當於漏檢了一個目標,自然AP就下降了;但如果將綠框bbox score降低(

lower the detection scores

as a

function of its overlap with bbox_M

),而不是直接pass,起碼還有進一步被召回的可能性;

Soft-NMS(4)_思考_ICCV2017

如fig 1,NMS是目標檢測中的一個模組,用於過濾檢測器檢出的冗餘bbox,但NMS操作有點粗暴,綠框此時也是一個正檢,但NMS就直接基於IoU閾值將其過濾,造成了一個漏檢;

2 Soft-NMS簡介及與NMS流程對比

本文提出的Soft-NMS,無需訓練,僅一個超參,實現簡單,直接替換NMS就可即插即用,沒有比NMS新增開銷,實乃居家旅遊、目標檢測必備良藥;

如fig 2,虛擬碼上僅需對NMS替換一行,原理很簡單:

如果bbox_i與bbox_M的IoU高,bbox_i的score就下降得多,若IoU低,bbox_i的score就下降得少,或不下降;NMS、Soft-NMS對比如fig 2,至於函式 f 如何是啥?可參照公式2、3:

Soft-NMS(4)_思考_ICCV2017

總結:Soft-NMS不會如org NMS那麼粗暴,比較溫柔,將fig 1中的綠框score不會粗暴地置0,而是

根據與紅框的IoU,對綠框score做一個基於連續函式的降權對映

decays the detection scores

of all other objects as a

continuous function of their overlap with Max

);—— 這樣看來,NMS直接對score置0,當前高IoU的bbox就直接pass了,但Soft-NMS只會降低當前bbox的score,不會pass;

3 目標檢測流程迴歸

本小節基於Fast RCNN、Faster RCNN,回顧下目標檢測inference流程(可參照frcnn中的proposal_layer。py,對應

RPN中第一次nms的應用

):

1 輸入影象,檢測器利用各種conv操作梭一下,得到feature map L;

2 在L上分出兩個分支:RPN分支、Fast RCNN分支;RPN分支用於生成proposals,Fast RCNN分支接受RPN分支輸出的RoIs,做完RoI pooling提特徵後,進一步計算loc + cls;

3 RPN分支中,對feature map L上密集取樣的多尺度、長寬比anchor,計算object / non-object二分類cls score + bbox reg offsets;並基於offsets調整anchors位置;

4 限定超出影象邊界的fg anchors為影象邊界(防止後續roi pooling時proposal超出影象邊界)、剔除非常小的fg anchors;

5 按照RPN輸出的fg softmax scores由大到小排序anchors,提取前pre_nms_topN(e。g。 6000)個anchors,即提取修正位置後的fg anchors;

6 對fg anchor做NMS抑制;——

作者強調了,此處的NMS不被替換為soft-NMS

7 再次按照NMS後的fg softmax scores由大到小排序fg anchors,

提取前post_nms_topN(e.g. 300)結果作為proposal輸出

8 proposals做RoI pooling提特徵;

9 Fast RCNN分支接受做完RoI pooling提的特徵後,

進一步計算loc + cls(具體類別)

因為對單個目標,並未限制其只能對應一個proposals,因此一個目標上可能對應多個檢出的bboxes,按照mAP評估方案,只選擇top score bbox作為正檢,那麼其他檢出bboxes就只能作為FP了,進而就是step-10;

10 對所有檢出bboxes,

按具體類別劃分後,每個類別下的bboxes單獨做NMS操作

;——

Soft-NMS會替換之

11 一般還會有若干後處理操作,如:過濾小尺度bbox、修正超出邊界bbox、整圖只儲存top-N score bbox等;

Soft-NMS(4)_思考_ICCV2017

fig 3是論文中目標檢測的流程示意,與Fast RCNN、frcnn一致:

step-1

:輸入影象;

step-2

RPN生成類別無關(category independent)的proposals

,並結合1st-stage的RPN對bbox做1st-refine;如fig 3右上角框,都是

黃色的,僅能表示其為object,無具體類別資訊

step-3

:frcnn的2nd-stage操作Fast RCNN,

對proposals細化分類其具體類別,並做2nd-refine

;如fig 3右下角框,

各個框有了不同顏色,代表屬於不同的類別

step-4

:fig 3右下角檢出框明顯太多了,經過NMS操作,得到左下角結果,每個目標上的檢出框少了,沒那麼多冗餘了;

4 Soft-NMS詳細分析

定義以下兩個概念:

Ot

:VOC、COCO評估期間,判斷bbox為FP、TP的閾值;—— detection evaluation threshold;

Nt

:NMS、Soft-NMS操作期間,衡量各個bbox間IoU的閾值;

試想:如果評估階段,使用一個高閾值Ot = 0。7來判斷bbox是否為TP,但NMS階段使用低閾值Nt = 0。3篩選冗餘bbox,自然會導致AP比較低;原因為:若存在一個pred bbox bi非常靠近gt bbox目標(定位精度很高,如二者IoU > Ot = 0。7),但最高score的pred bbox M_bj,其與該gt bbox的IoU卻不那麼高(如二者IoU < Ot = 0。7,如fig 1),此時使用比較低的Nt,就直接幹掉了bi,保留了M_bj,最終評估標準中Ot閾值就認為M_bj是一個FP;這種情況會隨著Ot的逐步提高,帶來的FP更多;因此,使用低閾值 Nt 篩選M附近的冗餘bbox,將會提升miss-rate;—— 這裡我覺得作者稍微有點沒說清楚,理清思路後應該解釋為:

對M_bj、bi使用org NMS操作時,如果設定的Nt比較低,M_bj就把bi給pass了(但bi其實定位得更準),只保留了M_bj,卻又被Ot卡掉了,造成了FP;如果使用高閾值Nt,起碼這一輪下來,bi得以保留;

但如果使用高Nt = 0。7,對Ot = 0。7是沒問題的,但在Ot低、Nt高的情況下,相當於M_bj、bi都會輸入COCO中評估,都沒被Ot pass,但也僅僅是讓bi通過了,最終依然會存在FP,最終在COCO的multi Ot下依然會降低AP;且這種情況下,透過高Nt確實帶來了bi的TP,使之沒被幹掉,但可能會引入更多數量的FP(因為更多的FP在高Nt下會被透過);原因很簡單,影象中bbox數量(對應的TP bi數量)肯定是遠少於檢測器生成的RoI數量,自然大部分pred bbox都是FP,高Nt可以召回更多的TP bi,卻肯定引入了更多的FP;因此使用高Nt也並不能帶來好的效果;—— 可以參照實驗部分;

為克服以上弊端,簡單回顧下NMS,NMS的bbox篩選過程可以認為是對bbox_i cls_score si的re-scoring過程:

Soft-NMS(4)_思考_ICCV2017

NMS使用一個固定的閾值Nt(hard threshold),來掌控著pred bbox M_bj附近 bi 的生死大權;

但如果M_bj並不是直接幹掉 bi,而是適度地降低 bi 的cls score,會不會更好點?

NMS的設計必須考慮到以下三個問題:

1 對M_bj而言,其附近的bi若與之存在IoU,bi的cls score確實是需要以合適的方式降低,使之儘量不會提升FP rate,但bi的cls score也不能太低,又必須高於所有pred bbox list中那些很明顯的FPs(should be

decreased to an extent

that

they have a smaller likelihood of increasing the false positive rate

, while

being above obvious false positives in the ranked list of detections

);

2 若使用低Nt,也是sub-optimal的,NMS階段幹掉的bbox太多,在高Ot下,會造成很多miss-rate;

3 若使用高Nt,在Ot = [0。5:0。95:0。05]時,其mAP會下降;

Soft-NMS的設計

透過M_bj、bi間的IoU,來適度調整bi的cls score,似乎是個不錯的改進NMS的方案,若bi與M_bj的IoU高,bi的cls score就降低得多(FP的可能性更大),反之則少,公式如下:

Soft-NMS(4)_思考_ICCV2017

IoU < Nt的未變,IoU > Nt的,si降低的方式是M_bj、bi間IoU的線性函式

;這樣與M_bj過遠的bi不會受到影響,過近的bi懲罰更重,但也不會粗暴地直接幹掉;

但以上penalty function有一點不好,就是

其不是連續函式,在Nt附近存在一個斷點,低於Nt的bi沒啥問題,負方向接近Nt的bi也沒問題,但Nt正方向附近的bi就需要降低cls score了,視覺上就會有一個sudden penalty的斷崖

;如果penalty function是連續的就更好,起碼不會造成ranked list of detections的abrupt changes;

這個連續的penalty function最好是這樣:

與M_bj高IoU的 bi ,penalty比較大,低IoU的 bi,penalty逐步降低,無IoU的 bi,penalty = 0

;那麼最終Soft-NMS選擇使用Gaussian penalty function調整si:

Soft-NMS(4)_思考_ICCV2017

以上Soft-NMS操作可以在每次iter中使用,si都做相應更新即可;

Soft-NMS操作流程如fig 2,f(iou(M, bi)))就對應以上公式了,

每次iter中,Soft-NMS的計算複雜度為O(N),N對應pred bbox數量,極端情況就是N的pred bbox都需要調整si,因此對於N次iter而言,Soft-NMS的計算複雜度為O(N^2)

,與org NMS保持一致;—— 不過NMS可能計算量更少點,因為NMS直接幹掉了高IoU的bbox,每次iter中,參與NMS的bbox數量就更少了,Soft-NMS還是需要所有bbox都參與的;

作者提到,Soft-NMS雖然很牛逼,但也是一個貪心演算法,

並不能為所有pred bbox帶來globally optimal re-scoring

,再就是

Soft-NMS是NMS的泛化版本(generalized version),NMS是Soft-NMS的special case,只是使用了更加粗暴的二分離散權重調整函式而已

5 實驗

5.1 Soft-NMS loc方面的優勢

Soft-NMS(4)_思考_ICCV2017

單純的AP並不能多維度解釋Soft-NMS為毛這麼牛逼,如table 3,作者進一步在不同Nt、

σ

、Ot下對比二者效能差異;

可以發現:

1 隨著NMS閾值Nt的提升,AP逐步下降(各個AP列的維度);

2 在高Ot下(如AP@0。8),Nt設定得高,效能會好一點,但提升不明顯,低Nt下效能也沒下降多少;

3 在低Ot下(如AP@0。5、0。6),Nt設定得高,效能竟然下降了很多;

總結:org NMS中,在低Ot下,高Nt得到的目標bbox並不是最優,會導致模型效能下降明顯,最終導致了整體的mAP比較低;

但Soft-NMS就比較牛逼了,

σ

的取值不同,效能都比較平穩:

1 在高、低Ot下,

σ

的取值不同,整體mAP效能都很平穩;

2 在高Ot下(如AP@0。7、0。8),Soft-NMS效能明顯優於org NMS 2%;

3 在低Ot下(如AP@0。5、0。6),Soft-NMS效能略微優於org NMS;

4 Soft-NMS中,在低Ot下,σ比較小,AP效能比較好;在高Ot下,σ比較大,AP效能比較好;org NMS雖然在高Ot下,AP效能有提升,但提升得非常之微不足道;那麼相比org NMS,Soft-NMS透過更大的

σ

可以讓目標的bbox定位更準確;

總結:Soft-NMS就是在各種Ot下,都比org NMS好,整體mAP也會好;

5.2 Precision vs Recall

Soft-NMS(4)_思考_ICCV2017

fig 5對比了NMS、Soft-NMS在不同Ot下的prec-recall結果,可以發現Soft-NMS效能優於NMS;

作者認為原因在於:

NMS對所有與 M IoU > Nt的bbox,直接置score = 0,很多bbox就被無情地過濾掉了,在高recall標準下,prec自然不會很高;Soft-NMS對這些bbox det-score降權,起碼還給它們留了一線生機

6 思考

作者公佈了論文的review:

以及rebuttal:

看下來就是真的很嚴謹,評審很專業,R1、R2表示肯定,並提出了很好的建議;R3在YOLO v2上使用了該方案,但發現效能提升不明顯,結果也很充分,不過作者在論文中提到了,Soft-NMS對SSD、YOLO v2效能提升不明顯,作者認為對於

proposal based檢測器(2-stage)而言,其獲得的召回率更高,因此Soft-NMS在高Ot下更有大展拳腳的空間

整體上就是特別嚴謹,討論問題很客觀,贊;

至於思考,我能想到的想法不多,本來還想著思考下多邊形下的NMS操作,但有位小夥伴已經分析了各種變體的NMS,總結得很好,我就不班門弄斧了;

論文參考

ICCV2017_Soft-NMS_Improving Object Detection With One Line of Code

程式碼:

https://

github。com/bharatsingh4

30/soft-nms

:官方

https://

github。com/bharatsingh4

30/soft-nms/blob/master/lib/nms/cpu_nms。pyx

https://

github。com/wushuang01/s

oft-nms/blob/master/soft-nms。py

NMS各種變體,寫得很好,贊:

標簽: nms  bbox  soft  BI  NT