Sigfoss Blog

2019/09/09

物体検知評価のためにCOCOデータセットを使う (準備編)

これまで物体検知の評価にはPascal VOCのテストデータセットを用いてきました。Pascal VOCのデータはリリース年ごとにいくつかありますが、Pascal VOC 2007とPascal VOC 2012のtrainvalデータを用いて学習し、Pascal VOC2007のtestデータで評価するという方法が標準的です。Pascal VOC 2007のtrainvalデータは5011、testデータは4952、2012のtrainvalデータは11540ありますので、この方法での学習データの総数は16551、評価データの総数は4952です。

ところで、最近の物体検知関連の論文では、COCOデータセットを用いた評価を行うことが多くなり、Pascal VOCが使われないこともあります。ひとつにはPascal VOCのデータセットが「簡単」になってきたことが理由にあげられると思います。Pascal VOCのstate of the artの値は0.85前後ですが、かなり高い値になったために手法による明確な優位性を評価することが難しくなってきています。対するCOCOのデータセットはPascal VOCとくらべて質・量ともに大規模で、データも「難しく」、その分使いこなす難易度もあがります。じっくりと使い方を検討してみることにしましょう。

よく使われるCOCO 2014のデータセットにはtrainデータが82783、valデータが40504含まれています。このvalデータから5000だけを評価データとし、残りのデータを学習データに回した、82783+40504-5000=118287を学習データとして使う、trainval35kという方法が標準的です。

5000件の評価データはminivalと呼ばれ、https://dl.dropboxusercontent.com/s/o43o90bna78omob/instances_minival2014.json.zip?dl=0 からダウンロードできます。またvalデータからminivalデータを引いたデータ(40504-5000)は https://dl.dropboxusercontent.com/s/s3tw5zcg7395368/instances_valminusminival2014.json.zip?dl=0 からダウンロードできます。

Pascal VOCのクラス数が20なのに対し、COCOのクラス数は80あり、精度の計算基準もオブジェクトの大小やIoUの取り方で複数決められています。

COCOのアノテーションデータの一部を表示します。

{
    "info": {
        "description": "COCO 2014 Dataset",
        "url": "http://cocodataset.org",
        "version": "1.0",
        "year": 2014,
        "contributor": "COCO Consortium",
        "date_created": "2017/09/01"
    },
    "images": [
        {
            "license": 5,
            "file_name": "COCO_train2014_000000057870.jpg",
            "coco_url": "http://images.cocodataset.org/train2014/COCO_train2014_000000057870.jpg",
            "height": 480,
            "width": 640,
            "date_captured": "2013-11-14 16:28:13",
            "flickr_url": "http://farm4.staticflickr.com/3153/2970773875_164f0c0b83_z.jpg",
            "id": 57870
        },
        {
            "license": 5,
            "file_name": "COCO_train2014_000000384029.jpg",
            "coco_url": "http://images.cocodataset.org/train2014/COCO_train2014_000000384029.jpg",
            "height": 429,
            "width": 640,
 
~ snip ~
                    141.8,
                    599.16,
                    142.52,
                    581.16,
                    142.28,
                    574.21,
                    147.08,
                    566.29,
                    147.32,
                    550.69,
                    143.96,
                    543.49
                ]
            ],
            "area": 3431.6628999999994,
            "iscrowd": 0,
            "image_id": 81954,
            "bbox": [
                140.84,
                529.57,
                81.34,
                83.27
            ],
            "category_id": 19,
            "id": 57870
        },
        {
            "segmentation": [
                [
                    180.77,
                    176.91,
                    173.82,
                    171.5,
                    181.55,
                    165.32,
                    183.09,
                    162.23,
~ snip ~
                    72.27,
                    384.07,
                    125.12,
                    384.07,
                    116.49,
                    361.42
                ]
            ],
            "area": 3517.749199999999,
            "iscrowd": 0,
            "image_id": 57870,
            "bbox": [
                10.79,
                260.03,
                114.33,
                124.04
            ],
            "category_id": 62,
            "id": 290659
        },
        {
~ snip ~
                    373.21,
                    426.07,
                    367.82,
                    412.04,
                    386.16,
                    386.16
                ]
            ],
            "area": 15494.157900000004,
            "iscrowd": 0,
            "image_id": 57870,
            "bbox": [
                367.82,
                264.27,
                139.15,
                215.73
            ],
            "category_id": 62,
            "id": 290682
        },

~snip~

 画像の例 (COCO_train2014_000000057870.jpg)



category_id: 62はchairです。imageのメタ情報とobject情報はバラバラにまとめられているのがわかります。(image_idで紐付け)

アノテーションはJSONなので自分でパースすることもできますが、便利なAPIが用意されていて使うことができます。Python版のAPIを利用するためには、以下のようにしてインストールします。

$ pip install cython
$ git clone https://github.com/cocodataset/cocoapi.git
$ cd cocoapi/PythonAPI
$ make
$make install
これでpycocotoolsというmoduleが使えるようになるのですが、APIを使ってもっとも恩恵を受けるのが評価コードの利用だと思います。詳しい使い方は次回以降、コードを用いてご説明するとして、module内の説明から抜粋すると以下のような流れで評価を行うことができます。

    # The usage for CocoEval is as follows:
    #  cocoGt=..., cocoDt=...       # load dataset and results
    #  E = CocoEval(cocoGt,cocoDt); # initialize CocoEval object
    #  E.params.recThrs = ...;      # set parameters as desired
    #  E.evaluate();                # run per image evaluation
    #  E.accumulate();              # accumulate per image results
    #  E.summarize();               # display summary metrics of results
    # For example usage see evalDemo.m and http://mscoco.org/.

評価コードを実行すると以下のような結果が出力されます。
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.378
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.560
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.409
 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.431
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.539
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.303
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.483
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.511
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.262
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.577
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.700

実はmAPやAPの決め方はひとつでなく、Pascal VOCとCOCOでも異なっています。COCOのAPの定義を正確に反映したAPIを使うことで評価実装が揃うことは非常にありがたいことです。COCOの評価基準については、https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173 にわかりやすい解説があります。ここではそれに沿って解説してみます。

COCOのmAP(mean Average Precision)は101pointの補間APです。またPascalVocではpositive matchの基準IoUを0.5に固定していますが、COCOでは複数のIoUを基準とするmAPを導出し、それを平均したものをAPとしたものも採用しています。IoU=0.50:0.95は0.05刻みに0.50~0.95まで基準IoUを変えたmAPの平均です。(COCOではmAPとAPという言葉を区別せずに使っているようです)

また、上記の出力にもあるように、COCOにはAR(Average Recall)という評価項目も存在します。これはイメージごとの検出数を1, 10, 100のいずれかに固定した時のRecallを測定するものです。

AP、ARともにsmall / medium / largeに分けたオブジェクトの大きさごとの値も測定しています。

COCOデータセットの全体像が見えてきたでしょうか。次回は実際にAPIを使ってみることにします。

森 英悟

シグフォスへのご相談、ご質問はこちらのお問い合わせフォームから受け付けております。
お気軽にお問い合わせください。
お問い合わせフォームへ