Google Colab + MMDetectionで楽してObject Detection - 3. データセットでモデルを評価 -
はじめに
こんにちは!すだです!
このシリーズ記事では、MMDetection で行えるいろんな便利な機能を紹介していきます。
今回は、前回の「2.学習済みモデルを試す」の続きで、メジャーな公開データセットを使って学習済みモデルの性能評価をしてみたい思います!
過去の記事をまだ読んでいない方は、先にお読みください!
今回作成した Colab Notebook はこちらです。
環境構築
導入編を参考に環境構築を進めてください。
!pip install -U openmim
!mim install mmcv-full
!git clone https://github.com/open-mmlab/mmdetection.git
%cd mmdetection
!pip install -v -e .
!mkdir trained_models
データセットのダウンロード
今回は、Object Detection で最もメジャーなデータセットである COCO データセットをダウンロードします。
COCO データセットとは、Object Detection や Instance Segmentaion などで使われる大規模なデータセットで、80 クラスの検出対象にラベル付された 20 万枚以上のデータで構成されています。
公式の HP からダウンロードしても良いですが、MMDetection に用意されているダウンロード用スクリプトを使ってダウンロードしましょう。
20GB 近いデータをダウンロードするのでやや時間がかかります。今回は 5 分ほどで完了しました。
!python tools/misc/download_dataset.py --dataset-name coco2017 --save-dir data/coco --unzip
おそらく Google Colab のディスク容量が逼迫すると思うので、余分なファイルは削除しましょう。
!rm data/coco/*zip
ダウンロードが完了したら、下記のようなフォルダ構造になっていることを確認しましょう。
-
mmdetection
-
data
-
coco
-
annotations
--- アノテーションファイル -
test2017
--- 評価用データ -
train2017
--- 学習用データ -
val2017
--- 検証用データ
-
-
-
データ数を確認してみましょう。
!echo "学習用データ"
!ls -1 data/coco/train2017 | wc -l
!echo "検証用データ"
!ls -1 data/coco/val2017 | wc -l
!echo "評価用データ"
!ls -1 data/coco/test2017 | wc -l
出力結果
学習用データ
118287
検証用データ
5000
評価用データ
40670
学習済みモデルの評価
それでは実際に COCO Object Detection データセットを使ってみましょう。
今回は、MMDetection で使える学習済みモデルの評価をしてみます。
使うモデルは、前回の記事で扱った YOLOX-x にします。
学習済みモデルのダウンロード
前回の記事と同様に下記コマンドを実行します。
!mim download mmdet --config yolox_x_8x8_300e_coco --dest trained_models
上記を実行すると、
yolox_x_8x8_300e_coco.py
yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth
がtrain_models
フォルダにダウンロードされます。前者が config ファイル、後者が重みファイルです。
画面左のファイルツリーからダウンロードされたことを確認しましょう。
評価用スクリプトを実行
では MMdetection に実装されているモデル評価用スクリプトを使ってモデルの評価をしてみましょう!
MMDetection で用意されている評価用スクリプトは以下のように実行します。
!python tools/test.py \
${configファイル} \
${重みファイル} \
[--eval ${評価指標}] \
今回の場合は以下のようになります。
config_path = 'trained_models/yolox_x_8x8_300e_coco.py'
weights_path = 'trained_models/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth'
!python tools/test.py $config_path $weights_path --eval bbox
実行すると評価用データセット 5000 枚を使って評価を実行してくれます。
実行中は11.5 task/s
のように、プログレスパーの横に数字が表示されていますが、こちらは平均の 1 秒間に処理できた画像数(FPS)ですね。このモデルの場合、最終的には 10.3FPS となりました。
5 分ほど待って、下記のような結果が出力されたら OK です。
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.506
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.684
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.550
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.320
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.556
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.667
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.636
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.636
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.636
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.433
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.684
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.792
一番上の指標がメインで比較される AP と呼ばれる指標になります。(COCO では、IoU 閾値を 0.5 から 0.95 まで変えた 10 段階の mAP の平均を"AP"と呼んでいるようです。)
今回の場合、AP=0.506 です。
各指標の説明は、公式サイトや別のわかりやすい記事に譲らせていただきます。
他のモデルとの比較
他のモデルとの精度も比較してみましょう。先ほど動かした YOLOX-x は 4 つあるモデルのスケールのうち、一番スケールが大きいモデルでしたが、比較対象として、2 番目にスケールが小さい YOLOX-s を試してみます。
!mim download mmdet --config yolox_s_8x8_300e_coco --dest trained_models
config_path = 'trained_models/yolox_s_8x8_300e_coco.py'
weights_path = 'trained_models/yolox_s_8x8_300e_coco_20211121_095711-4592a793.pth'
!python tools/test.py $config_path $weights_path --eval bbox
こちらのモデルでは処理速度が
28.2 task/s, elapsed: 178s, ETA: 0s
認識精度は
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.403
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.591
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.434
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.235
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.445
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.531
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.548
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.549
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.549
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.346
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.601
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.693
のようになりました。
まとめると、
モデル | FPS | AP |
---|---|---|
YOLOX-x | 10.3 | 0.506 |
YOLOX-s | 28.2 | 0.403 |
となり、スケールが大きくなると精度が上がるが処理速度が遅くなるという、トレードオフの関係が確認できました。
まとめ
今回は、COCO データセットを使って学習済みモデルの評価をしてみました。MMDetection では COCO 以外のデータセットも使えるので、今後取り上げたいと思います。
次回は 公開データセットを使ってモデルを学習してみます!
Discussion