寫在前面:
在目標(biāo)檢測問題中,好幾處地方使用了閾值這個限制指標(biāo)凑懂,主要有:
- NMS操作之前用到的置信度閾值a煤痕;
- NMS進(jìn)行時用到的IoU閾值b;
- 計(jì)算某類別AP時接谨,統(tǒng)計(jì)TP,FP個數(shù)前摆碉,用到置信度閾值c;
- 計(jì)算某類別AP時脓豪,統(tǒng)計(jì)TP,FP個數(shù)時巷帝,用到IoU閾值d。
以下對這4個閾值作詳細(xì)說明扫夜。
預(yù)備知識:
在正文開始之前楞泼,說一下置信度confidence這個概念吧,IoU的話比較簡單笤闯,沒什么混淆的堕阔,目標(biāo)檢測當(dāng)中不同論文對其定義幾乎一樣。對于置信度颗味,不同論文對其定義是不同的超陆,一般用到比較多的是分類置信度,分類置信度confidence是介于0和1(或100%)之間的數(shù)字浦马,它描述模型認(rèn)為此預(yù)測邊界框包含某類別目標(biāo)的概率时呀,一般多分類的話张漂,最后一層輸出接softmax函數(shù),會輸出n個前景和1個背景的概率分?jǐn)?shù)谨娜,預(yù)測框?qū)儆谀囊活惪茨膫€的分?jǐn)?shù)最高航攒。YOLOv1當(dāng)中對于置信度定義與上面不同。
還有新的一些論文趴梢,在預(yù)測邊界框時還預(yù)測了預(yù)測框與GT的IoU漠畜,以此IoU作為置信度分?jǐn)?shù),這種稱為定位置信度垢油,比如這篇文章(這里)盆驹。以下我們的說明就以置信度分?jǐn)?shù)指的是預(yù)測框中對象為某一類別的概率來進(jìn)行說明圆丹。
1. NMS進(jìn)行時用到置信度閾值a和IoU閾值b
1.1 NMS介紹
檢測器預(yù)測完結(jié)果滩愁,一張圖像中會有很多預(yù)測框,預(yù)測的結(jié)果間可能存在高冗余(即同一個目標(biāo)可能被預(yù)測多個矩形框)辫封,進(jìn)行NMS可以過濾掉與同一檢測對象中置信度分?jǐn)?shù)最高的預(yù)測框IoU超過閾值(即上面所說的b)的其他預(yù)測框硝枉,即同一Ground Truth的多個預(yù)測結(jié)果我們只取置信度分?jǐn)?shù)最高的那個預(yù)測結(jié)果,其余的我們都不要倦微。個人覺得這個不是很合理妻味,NMS時,置信度分高但是位置不夠準(zhǔn)的框可能會把置信度分低但是位置很準(zhǔn)的框去掉欣福。這使得原本定位準(zhǔn)確的邊界框會在迭代回歸的過程中偏離目標(biāo)责球,和我們的最終目標(biāo)是沖突的,當(dāng)然不是所有文章都用分類置信度排序來進(jìn)行NMS拓劝,比如曠世有一篇論文雏逾,IoU-Net,預(yù)測結(jié)果會預(yù)測邊界框與GT的IoU置信度郑临,以IoU置信度排序來取代分類置信度排序栖博,進(jìn)行NMS,主要應(yīng)用在對位置精確度要求較高的場合(文章地址)厢洞。YOLO當(dāng)中的置信度綜合了預(yù)測的對不對和預(yù)測的準(zhǔn)不準(zhǔn)這2個性能仇让,個人感覺更合理一些。
1.2 NMS過程
NMS的思路是:對于一張圖片中的每一個預(yù)測框來說躺翻,模型為其每一個類別都預(yù)測了一個置信度分?jǐn)?shù)(一般多分類丧叽,模型輸出后接softmax,每一個類別都得到了一個置信度分?jǐn)?shù)公你,包括背景類)我們?nèi)≈眯哦茸罡叩哪且粋€類別作為預(yù)測框中對象所屬的類別踊淳。1. 首先我們將置信度分?jǐn)?shù)低于置信度閾值a的所有預(yù)測框去掉 。2. 然后在同一張圖片上省店,我們按照類別(除開背景類嚣崭,因?yàn)楸尘邦惒恍枰M(jìn)行NMS)笨触,將所有預(yù)測框按照置信度從高到低排序,將置信度最高的框作為我們要保留的此類別的第1個預(yù)測框雹舀,3. 然后按照順序計(jì)算剩下其他預(yù)測框與其的IoU芦劣,4. 去掉與其IoU大于IoU閾值b的預(yù)測框(其實(shí)代碼實(shí)現(xiàn)里是將這些要去掉的預(yù)測框其置信度分?jǐn)?shù)置為0),5. 第一次迭代結(jié)束说榆,我們已經(jīng)剔除了與第一個框重合度較高的框虚吟。
接著從剩下的預(yù)測框中取置信度分?jǐn)?shù)最高的檢測框作為我們要保留的第2個預(yù)測框,進(jìn)行第2次迭代签财。反復(fù)下去串慰,我們就過濾掉此類別與同一GT重疊度較高的預(yù)測框了,然后對下一個類別處理唱蒸,直至處理完所有的類別邦鲫。
1.3 代碼
import numpy as np
def nms(dets, thresh):
"""Pure Python NMS baseline."""
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1] # 置信度從高到低排序
keep = []
while order.size > 0:
i = order[0] # 此類別中置信度最高的預(yù)測框的索引
keep.append(i) # 將其作為保留下來的第1個預(yù)測框
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (areas[i] + areas[order[1:]] - inter) # 計(jì)算其余預(yù)測框與置信度最高的預(yù)測框的IoU
inds = np.where(ovr <= thresh)[0] # 記錄下第1個與其Iou<閾值的預(yù)測框,也就是與其Iou<閾值的預(yù)測框中置信度最高的
order = order[inds + 1] # 將與保留下來的第1個預(yù)測框Iou<閾值的預(yù)測框中置信度分?jǐn)?shù)最高的預(yù)測框作為第2個要保留的
return keep # 所有經(jīng)過NMS后保留下來的框
說明一下神汹,上述代碼中的dets是經(jīng)過置信度閾值過濾后的檢測結(jié)果庆捺,所以此代碼中沒有這步操作,此外上面的dets也是一張圖片中某一類所有的預(yù)測框屁魏。額外滔以,插一下,好多企業(yè)氓拼,CV崗面試的時候你画,很喜歡出這個題目,手寫NMS桃漾,另外也有一些其他更為簡單的寫法坏匪,這里放一下,我看到寫的很好的例子呈队。(NMS的多種代碼實(shí)現(xiàn))
2. 計(jì)算mAP時用到的置信度閾值c和IoU閾值d
在測試時剥槐,我們通過我們的檢測器預(yù)測出許多預(yù)測框,通過NMS我們?nèi)コ袅藢ν籊T重疊度較高的一些框宪摧,NMS之后粒竖,我們需要評估我們的檢測器精度怎么樣,一般用的比較多的一個指標(biāo)就是mAP几于,平均準(zhǔn)確度均值蕊苗。在計(jì)算mAP前,我們需要計(jì)算出我們測試集中每一類的AP值沿彭。
拿單張圖片來說吧朽砰,首先遍歷圖片中g(shù)round truth對象,然后提取我們要計(jì)算的某類別的gt objects,之后讀取我們通過檢測器檢測出的這種類別的檢測框(其他類別的先不管)瞧柔,接著過濾掉置信度分?jǐn)?shù)低于置信度閾值的框(即所說的置信度閾值c)漆弄,將剩下的檢測框按置信度分?jǐn)?shù)從高到低排序,最先判斷置信度分?jǐn)?shù)最高的檢測框與gt bbox的IoU是否大于IoU閾值(即·上面所說的IoU閾值d)造锅,若IoU大于設(shè)定的IoU閾值即判斷為TP撼唾,將此gt_bbox標(biāo)記為已檢測(后續(xù)的同一個GT的多余檢測框都視為FP,這就是為什么先要按照置信度分?jǐn)?shù)從高到低排序,置信度分?jǐn)?shù)最高的檢測框最先去與IoU閾值比較哥蔚,若大于IoU閾值倒谷,視為TP,后續(xù)的同一個gt對象的檢測框都視為FP)糙箍,IoU小于閾值的渤愁,直接規(guī)劃到FP中去。
3. 總結(jié)
- NMS用到的IoU閾值深夯,是拿除保留的預(yù)測框外的其余預(yù)測框跟同一類別中置信度最高的預(yù)測框IoU與其作比較抖格。
- 計(jì)算mAP用到的IoU閾值,是拿預(yù)測框與GT的IoU與其作比較塌西。
- NMS的置信度閾值主要是為了過濾掉一些背景預(yù)測框(一般來說one stage算法用的較多他挎,因其沒有two stage產(chǎn)生ROI,背景框較多)捡需。
- 計(jì)算mAP的置信度閾值主要是用來選取TOP N(置信度分?jǐn)?shù)從高到低排名的前N個檢測)的樣本來統(tǒng)計(jì)TP,FP,FN,計(jì)算AP筹淫。
4. 理解:
AP計(jì)算方法: 設(shè)置一組固定的置信度閾值站辉,比如常用的41點(diǎn)和11點(diǎn),然后按照上面的方法求TP,FP损姜,然后分別求每個置信度閾值下的precision=TP/(TP+FP)饰剥,得到一組precision,對這組precison取平均就是AP