😺

Google Colab + MMDetectionで楽してObject Detection - 3. データセットでモデルを評価 -

2023/02/20に公開約6,000字

はじめに

こんにちは!すだです!
このシリーズ記事では、MMDetection で行えるいろんな便利な機能を紹介していきます。
今回は、前回の「2.学習済みモデルを試す」の続きで、メジャーな公開データセットを使って学習済みモデルの性能評価をしてみたい思います!
過去の記事をまだ読んでいない方は、先にお読みください!

https://zenn.dev/jizai_labo/articles/mmdet_outline

今回作成した Colab Notebook はこちらです。
https://colab.research.google.com/drive/1Z4hbV84l5JcsR6TqCpy1T8xOcN6Hkssc?usp=sharing

環境構築

導入編を参考に環境構築を進めてください。

!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 万枚以上のデータで構成されています。
https://cocodataset.org/#detection-2020

公式の 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 です。

各指標の説明は、公式サイトや別のわかりやすい記事に譲らせていただきます。
https://cocodataset.org/#detection-eval
https://www.sigfoss.com/developer_blog/detail?actual_object_id=267
https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173

他のモデルとの比較

他のモデルとの精度も比較してみましょう。先ほど動かした 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

ログインするとコメントできます