詳解對象檢測網絡性能評價指標mAP計算

上次我寫了一篇關於mAP計算的文章,發佈之後得到很多網友的反饋,有感於此,覺得有必要重寫一篇,目的有兩個,一個是告訴大家你們的意見我收到了,另外一個是細化了我對mAP的計算過程的理解,如有廖誤懇請指正,本人一定虛心接受!歡迎繼續拍磚!

對象檢測評價參數解釋

對象檢測評價是針對對象檢測系統性能指標的整體性能評估,評價指標包括

  • 正確檢測率
  • 錯誤檢測率
  • 漏檢率

等常見指標,更廣義的評價還包括檢測率除以精度與敏感性。檢測對象的評價多數是基於某測試數據集的,通常稱爲SUT(System Under Test), 我們在訓練時候使用的數據通常被稱爲GT Sytem(是帶有正確標準框的數據)。評價對象檢測系統性能經常需要用到術語與解釋如下:

FP – False Positive是指一個對象出現在SUT中但是沒有出現在GT中 TP – True Positive是指一個對象既出現在SUT也出現在GT中 FN – False negative是真一個對象出現在GT中但是沒有出現在SUT TN – True negative是指對象在SUT與GT中均沒有出現 CGT – complete ground truth 是指總的GT數目

二:計算AP與mAP

在計算AP過程中最重要的是生成Precision-Recall Curve (精確度-召回率曲線),它是計算mAP最重要的一步動作。下圖中有六個book的標註框(GT) 藍色矩形框標註信息如下:

book 439 157 556 241 book 437 246 518 351 book 515 306 595 375 book 407 386 531 476 book 544 419 621 476 book 609 297 636 392

紅色矩形框算法預測結果如下:

有八個預測框,根據得分從高到低的排序如下:

book 0.619459 413 390 515 459 book 0.462608 518 314 603 369 book 0.460851 429 219 528 247 book 0.382881 403 384 517 461 book 0.369369 405 429 519 470 book 0.298196 592 310 634 388 book 0.272826 433 272 499 341 book 0.269833 433 260 506 336

其中第二列是預測邊界框(BB)對book得分

判斷TP與FP代碼如下

if ovmax >= min_overlap:
    if "difficult" not in gt_match:
        if not bool(gt_match["used"]):
          # true positive
          tp[idx] = 1
          gt_match["used"] = True
          count_true_positives[class_name] += 1
          # update the ".json" file
          with open(gt_file, 'w') as f:
              f.write(json.dumps(ground_truth_data))
          if show_animation:
            status = "MATCH!"
        else:
          # false positive (multiple detection)
          fp[idx] = 1
          if show_animation:
            status = "REPEATED MATCH!"
else:
    # false positive
    fp[idx] = 1
    if ovmax > 0:
      status = "INSUFFICIENT OVERLAP"

計算累計TP與FP的代碼如下:

for idx, val in enumerate(fp):
  fp[idx] += cumsum
  cumsum += val
cumsum = 0
for idx, val in enumerate(tp):
  tp[idx] += cumsum
  cumsum += val

積分求解 Precision與Recall數據的取值範圍都在0~1之間,以Recall爲X軸位、以Precision爲Y軸可以繪製PR曲線。在繪製之前首先需要完成插值操作

首先對精度數據首尾添加0然後進行最大值插值取值,得到mpre 【1.0, 1.0, 1.0, 0.66, 0.5, 0.5, 0.5, 0.5, 0.5, 0】 對召回數據首尾添加0與1得到mrec 【0, 0.166, 0.33, 0.33, 0.33, 0.33, 0.5, 0.5, 0.66, 1.0】

進行尋找變化的梯度得到index(1、2、6、8、9),對曲線積分求解最終的AP爲:

loop index(1、2、6、8、9)
AP =+ ((mrec[index]-mrec[index-1])*mpre[index])
return AP

上面的解釋是AP計算方法,VOC2007對計算出來結果,根據原始取得的recall進行最大插值爲11點的方式來計算AP,圖示如下:

另外一種方式被稱爲全插值方法,同樣是基於最大值進行插值,得到曲線顯示如下

通過插值之後進行AP計算得到的結果會跟積分直接求解的結果不同,當前PASCAL VOC都是基於全插值方式來計算AP,最終根據每個類別的AP求和之後除以總的檢測類別數目就得到mAP值。

mAP = sum(AP) / N 
其中N表示總的類別數目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章