COCOデータセット上のYOLOv 3のmAP値の計算


darknetのインストール
  • 詳細手順と説明はYOLOv 3の公式サイトを参照してください.ここでは、対応するコマンドラインと特に注意すべき点
  • を示します.
  • githubからプロジェクトソースをダウンロード
    git clone https://github.com/pjreddie/darknet
    cd darknet
  • ソースコードのコンパイル(デフォルトではYOLOv 3を実行する場合GPUは使用されませんが、YOLOv 3を走る場合はGPUを使用する必要があると仮定しますので、コンパイルオプションを変更する必要があります)
  • 現在のフォルダ下(darknet/)のMakefileファイルの1行目のGPU=0をGPU=1に変更し、変更後のMakefile:
    GPU=1
    CUDNN=0
    OPENCV=0
    OPENMP=0
    DEBUG=0
    
    ...
    ...
    ...
  • コンパイル
    make
  • ウェイトファイル(yolov 3.weights)を現在のディレクトリにダウンロード
    wget https://pjreddie.com/media/files/yolov3.weights
  • テスト
    #     ‘-i 0’     0   ,      GPU   ‘-nogpu’  ‘-i 0’
    ./darknet -i 0 detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg 
  • COCOデータセットのダウンロードと構成
  • スクリプトファイル(scripts/get_coco_dataset.sh)からCOCOデータセットを取得(データセットのダウンロード速度が遅いのでFunctionのデータセットダウンロードステーションからダウンロードし、scripts/get_coco_dataset.shの各コマンドを行単位で実行することを推奨)
    cp scripts/get_coco_dataset.sh data
    cd data
    bash get_coco_dataset.sh
  • COCOのプロファイルの変更(cfg/coco.data)
    classes= 80
    train  = /trainvalno5k.txt #          COCO         
    valid  = /5k.txt #          COCO         
    names = data/coco.names
    backup = backup
    eval = coco #         json       ,       ,             classes(80)  txt  
  • YOLOv 3モデルのプロファイルの変更(cfg/yolov 3.cfg)
    [net]
    # Testing
    # batch=1
    # subdivisions=1
    # Training
    batch=64 #     batch         ,      ,GeForce RTX 2080Ti     8
    subdivisions=8
    ....
  • COCO検証セットの検出
  • darknetディレクトリの下で次のコマンドライン
    ./darknet -i 0 detector valid cfg/coco.data cfg/yolov3.cfg yolov3.weights # '-i 0'    0 GPU
    を実行します.上記のコマンドを実行するとresults/coco_が生成されます.results.jsonファイル検出結果
  • を保存
    計算mAP
    方法:https://blog.csdn.net/xidaoliang/article/details/88397280
  • インストールpycocools
    pip install pycocotools
  • darknetディレクトリの下にpythonスクリプト(compute_co_mAP.py)を作成して、mAPを計算します(実際の状況に応じて2つのファイルパスを変更することに注意してください)
    #-*- coding:utf-8 -*-
    import matplotlib.pyplot as plt 
    from pycocotools.coco import COCO 
    from pycocotools.cocoeval import COCOeval 
    import numpy as np 
    import skimage.io as io 
    import pylab,json 
    pylab.rcParams['figure.figsize'] = (10.0, 8.0) 
    def get_img_id(file_name): 
        ls = [] 
        myset = [] 
        annos = json.load(open(file_name, 'r')) 
        for anno in annos: 
          ls.append(anno['image_id']) 
        myset = {}.fromkeys(ls).keys() 
        return myset 
    if __name__ == '__main__': 
        annType = ['segm', 'bbox', 'keypoints']#set iouType to 'segm', 'bbox' or 'keypoints'
        annType = annType[1] # specify type here
        cocoGt_file = 'data/coco/annotations/instances_val2014.json' #                
        cocoGt = COCO(cocoGt_file)#      coco json  
        cocoDt_file = 'results/coco_results.json' #                
        imgIds = get_img_id(cocoDt_file) 
        print(len(imgIds))
        cocoDt = cocoGt.loadRes(cocoDt_file)#      image json  
        imgIds = sorted(imgIds)#     coco   image_id
        imgIds = imgIds[0:5000]#     image  
        cocoEval = COCOeval(cocoGt, cocoDt, annType) 
        cocoEval.params.imgIds = imgIds#    
        cocoEval.evaluate()#  
        cocoEval.accumulate()#  
        cocoEval.summarize()#  
  • 実行compute_coco_mAP.pyスクリプト
    python compute_coco_mAP.py
  • compute_を実行している可能性があります.coco_mAP.pyスクリプトの実行中にエラーが発生します.解決方法:
  • scikit-image
    pip install -U scikit-image
  • をアップグレード
  • 修正Numpyバージョン1.16
    pip install numpy==1.16

  • 結果表示
  • img_sizeが608*608(img_sizeの設定はcfg/yolov 3.cfgファイルのwidthとheightを変更することによって実現できる)
     Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.334
     Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.585
     Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.345
     Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.194
     Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.365
     Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.439
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.291
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.446
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.470
     Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.304
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.502
     Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.593
    
  • img_sizeが416*416の場合:
     Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.314
     Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.559
     Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.318
     Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.142
     Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.341
     Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.464
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.278
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.419
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.442
     Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.239
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.482
     Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.611
    
  • img_sizeが320*320の場合:
     Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.286
     Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.521
     Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.284
     Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.103
     Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.315
     Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.449
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.260
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.389
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.408
     Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.189
     Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.454
     Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.601
    
     

  • 結果の説明については、以下を参照してください.https://blog.csdn.net/u014734886/article/details/78831884