1. 程式人生 > >YOLO-V3計算單類ap、mAP、recall

YOLO-V3計算單類ap、mAP、recall

1 批處理測試圖輸出檢測結果文字

./darknet detector valid cfg/voc_birds.data cfg/yolov3-voc-birds.cfg backup/yolov3-voc-birds.backup -out ""

以上程式碼是使用的yolo網路自帶的valid函式介面來測試大量的圖片,把檢測結果儲存在txt檔案裡, -out 後面的“”會自動生成 “類名.txt” 在darknet / result 目錄下。

具體函式是detector.c下的validate_detector函式:

2 使用py-faster-rcnn下的voc_eval.py計算mAP

2.1 將py-faster-rcnn/lib/datasets/voc_eval.py拷貝到darknet根目錄

2.2 新建compute_mAP.py 

from voc_eval import voc_eval

print(voc_eval('/home/peidashun/projects/darknet/results/{}.txt', '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/Annotations/{}.xml', '/home/peidashun/projects/darknet/voc/2018_val.txt', 'egret', '.'))

lines 3 引數第一個為上一步的txt路徑,第二個為驗證集對應的xml標籤路徑,第三個為驗證集txt文字路徑,第四個為待驗證的類別名,第五個為pkl檔案儲存的路徑

注意:驗證機txt內容必須是無路徑無後綴的圖片名。

voc_eval.py中的定義:

2.3 用python 2 執行 compute_mAP.py

重複執行,檢測其他類別需要刪除 ./darknet/annots.pkl ,或者改變compute_mAP.py中pkl檔案儲存的路徑

voc_eval.py中返回的最後一個值即AP,檢測單類就是mAP

結果:

輸出兩個array(),分別是rec和prec,最後一個為單類mAP,我偷懶沒有做驗證集,用了訓練集去valid,因此ap很高。

3 計算recall

修改detector.c下的validate_detector_recall函式

替換list *plist = get_paths("data/coco_val_5k.list");為list *plist=get_paths("voc/train.txt");自己的訓練集文字

./darknet detector recall cfg/voc_birds.data cfg/yolov3-voc-birds.cfg backup/yolov3-voc-birds.backup 

結果:最後一列為recall值。 

4 直接計算出所有單類別的mAP和總的mAP

新建computer_all_mAP.py

寫入如下內容:

from voc_eval import voc_eval

import os

current_path = os.getcwd()
results_path = current_path+"/results"
sub_files = os.listdir(results_path)

mAP = []
for i in range(len(sub_files)):
    class_name = sub_files[i].split(".txt")[0]    rec, prec, ap = voc_eval('/home/peidashun/projects/darknet/results/{}.txt', '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/Annotations/{}.xml', '/home/peidashun/projects/darknet/voc/2018_test.txt', class_name, '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/mAP')
    print("{} :\t {} ".format(class_name, ap))
    mAP.append(ap)

mAP = tuple(mAP)

print("***************************")
print("mAP :\t {}".format( float( sum(mAP)/len(mAP)) ))

注意: results資料夾只能有 '類名.txt'檔案,2018_test.txt檔案包含所有results中txt檔案的圖片名(保證是共同的驗證集),保證最後的輸出路徑下無pkl檔案。

上述程式碼中的ap就是針對輸入單一類別計算出的AP。

結果:

5 出現的問題

5.1 recall出現問題:Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Couldn't open file: data/coco_val_5k.list

解決:改動了darknet原始碼,要重新編譯。在darknet目錄下:

make clean
make -j8

5.2執行conpute_map.py 出現問題:IOError: [Errno 2] No such file or directory: 'xxx.jpg.xml'

解決方式一:修改txt檔案中內容為不帶路徑不帶字尾的圖片名(推薦)

解決方式二:修改voc_eval.py,通過用splitext和basename,去掉路徑和字尾,修改圖如下,再執行通過該error:

5.3 recall時出現問題: IOU: inf%    iou最大為1,怎麼會爆炸的大?

嘗試解決:

raw:

修改:

重編譯,執行失敗,出現IOU和recall都很小的情況。此問題待解決。

參考: