徹底搞懂目標(biāo)檢測進(jìn)行NMS和計(jì)算mAP時的置信度閾值和IoU閾值

寫在前面:

在目標(biāo)檢測問題中,好幾處地方使用了閾值這個限制指標(biāo)凑懂,主要有:

  1. NMS操作之前用到的置信度閾值a煤痕;
  2. NMS進(jìn)行時用到的IoU閾值b;
  3. 計(jì)算某類別AP時接谨,統(tǒng)計(jì)TP,FP個數(shù)前摆碉,用到置信度閾值c;
  4. 計(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摧阅,一起剝皮案震驚了整個濱河市汰蓉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棒卷,老刑警劉巖顾孽,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異比规,居然都是意外死亡若厚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蜒什,熙熙樓的掌柜王于貴愁眉苦臉地迎上來测秸,“玉大人,你說我怎么就攤上這事■耄” “怎么了铃拇?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沈撞。 經(jīng)常有香客問我锚贱,道長,這世上最難降的妖魔是什么关串? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任拧廊,我火速辦了婚禮,結(jié)果婚禮上晋修,老公的妹妹穿的比我還像新娘吧碾。我一直安慰自己,他們只是感情好墓卦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布倦春。 她就那樣靜靜地躺著,像睡著了一般落剪。 火紅的嫁衣襯著肌膚如雪睁本。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天忠怖,我揣著相機(jī)與錄音呢堰,去河邊找鬼。 笑死凡泣,一個胖子當(dāng)著我的面吹牛枉疼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鞋拟,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼骂维,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贺纲?” 一聲冷哼從身側(cè)響起航闺,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猴誊,沒想到半個月后潦刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稠肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年福铅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片项阴。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡滑黔,死狀恐怖笆包,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情略荡,我是刑警寧澤庵佣,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站汛兜,受9級特大地震影響巴粪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粥谬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一肛根、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漏策,春花似錦派哲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至感耙,卻和暖如春褂乍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背即硼。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工逃片, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谦絮。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓题诵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親层皱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容