ブログ
Sigfoss Blog

2020/02/03

【完全版】物体検知をPascal VOCとCOCOデータで学習し評価する

これまで主にPyTorch版のSSDを中心に目的に応じたチューニングや改良のお話をしてきました。一通りお話をして物体検知のお話は完結したつもりでいたのですが、COCOを使った評価についてお話していないことに気がつきました。

またGitHubに例示したコードも乱雑になってしまっています。なので、今回はCOCOを使った評価のお話をすると共に、Pascal VOCとCOCOのデータできちんと学習と評価のできるコードをまとめて公開することにします。

これまでもお話したように、Pascal VOCに関しては、Pascal VOC 2007とPascal VOC 2012のtrainvalデータを用いて学習し、Pascal VOC2007のtestデータで評価するという方法が標準的です。Pascal VOC 2007のtrainvalデータは5011、testデータは4952、2012のtrainvalデータは11540ありますので、この方法での学習データの総数は16551、評価データの総数は4952、クラス数は20となります。以下は1epochだけ学習して評価してみた出力です。

AP for aeroplane = 0.4805
AP for bicycle = 0.2982
AP for bird = 0.5053
AP for boat = 0.1416
AP for bottle = 0.2505
AP for bus = 0.3217
AP for car = 0.6830
AP for cat = 0.6837
AP for chair = 0.3224
AP for cow = 0.4169
AP for diningtable = 0.2032
AP for dog = 0.6115
AP for horse = 0.5645
AP for motorbike = 0.3310
AP for person = 0.5807
AP for pottedplant = 0.1872
AP for sheep = 0.3818
AP for sofa = 0.3628
AP for train = 0.3305
AP for tvmonitor = 0.5111
Mean AP = 0.4084

epochを重ねると精度もあがっていきます。最終的に評価結果のMean APで0.80を超えると良い値と考えて良いでしょう。

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

同じく以下が1epochだけ学習して評価してみた出力です。

~~~~ Mean and per-category AP @ IoU=[0.50,0.95] ~~~~
9.5
~~~~ Summary metrics ~~~~
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.095
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.237
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.055
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.038
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.136
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.137
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.120
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.225
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.248
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.089
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.301
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.317

こちらはMean and per-category AP@IoU=[0.50:0.95]で30を超えると良い値と考えて良いと思います。

COCOデータセットには対象オブジェクトの存在しない画像が存在し、これをうまく扱わないとエラーになるようです。今回公開するデータはこれらの修正を行っており、うまく動くはずです。参考にPacal VOCとCOCOで学習済みのウェイトも公開しています。公開済みのウェイトはPascal VOC Mean APが0.826、COCO Mean and per-category AP@IoU=[0.50:0.95]で37.0がでるはずです。

詳しくはGitHubを参照ください。



Pascal VOC学習データによる推論

COCO学習データによる推論結果

森 英悟