📖

Google Colab + MMDetectionで楽してObject Detection - 2. 学習済みモデルを試す -

2023/02/16に公開約6,900字

はじめに

こんにちは!すだです!
このシリーズ記事では、MMDetection で行えるいろんな便利な機能を紹介していきます。

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

今回は、導入編に引き続き、MMDetection で使える、学習済みモデルを動かしてみたいと思います!
導入編をまだ読んでいない方は、先にお読みください!
https://zenn.dev/jizai_labo/articles/230212_mmdet_intro

今回作成した Colab Notebook はこちらです。
https://colab.research.google.com/drive/1Cw-RVSjU-wWBWYSBjSqfkveda4WJz6ol?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

学習済みモデルをダウンロード

MMDetection にはたくさんのモデルが用意されています。せっかくなので新しいモデルも動かしてみましょう。
この時、環境構築でインストールしたopenmimというライブラリを使って学習済みモデルをダウンロードします。

モデルの選定

openmimでダウンロードできる学習済みモデルは、下記コマンドで確認できます。

!mim search mmdet

上記コマンドを実行するとたくさん情報が出てくると思います。例えば、下記は導入編で動かした YOLOv3 の学習済みモデルの情報です。

--------------------------------------------------------------------------------
config id: yolov3_mobilenetv2_320_300e_coco
architecture                                            darknet
coco/box_ap                                             22.2
config                                                  configs/yolo/yolov3_m...
epochs                                                  300
model                                                   yolov3
paper                                                   URL,Title
readme                                                  configs/yolo/README.md
training_data                                           coco
training_memory(GB)                                     3.2
training_resources                                      8x v100 gpus
training_techniques                                     sgd with momentum,wei...
weight                                                  https://download.open...
--------------------------------------------------------------------------------

出力される情報のうち、coco/box_apの数値などを参考に、動かしたいモデルを選びましょう。

今回は、先ほど動かした YOLOv3 の後継モデル YOLOX にしました。YOLOX はモデルのスケール(入力画像の画素数やパラメータ数)が、tiny, s, l, x の 4 段階あり、一番スケールが大きく、精度が良い YOLOX-x を使ってみます。

--------------------------------------------------------------------------------
config id: yolox_x_8x8_300e_coco
architecture                                            cspdarknet,pafpn
coco/box_ap                                             50.9
config                                                  configs/yolox/yolox_x...
epochs                                                  300
model                                                   yolox
paper                                                   URL,Title
readme                                                  configs/yolox/README.md
training_data                                           coco
training_memory(GB)                                     28.1
training_resources                                      8x titanxp gpus
training_techniques                                     sgd with nesterov,wei...
weight                                                  https://download.open...
--------------------------------------------------------------------------------

YOLOX は 2021 年 8 月に公開された YOLO シリーズのモデルで、SimOTA という正解割り当てアルゴリズムなどを採用したモデルになります。詳細は元論文や解説記事をご覧ください。
https://arxiv.org/abs/2107.08430

モデルのダウンロード

モデルが決まったらダウンロードします。やり方は 2 通りあって、

!mim download mmdet --config {config id} --dest {出力先フォルダ}

のようにしてコマンドを実行するか、

from mim import download

download('mmdet', ['{config id}'])
download('mmdet', ['{config id}'], dest_root='{出力先フォルダ}')

のように Python スクリプトを実行します。

今回使うモデルの場合、

!mim download mmdet --config yolox_x_8x8_300e_coco --dest trained_models

もしくは、

from mim import download

download('mmdet', ['yolox_x_8x8_300e_coco'])
download('mmdet', ['yolox_x_8x8_300e_coco'], dest_root='./trained_models')

のとなります。

上記コマンドを実行後、trained_modelsに下記ファイルがダウンロードされていることを確認しましょう。

  • yolox_x_8x8_300e_coco.py
  • yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth

デモスクリプトを実行

では、導入編で動かしたデモスクリプトを、モデルを変えて実行してみます。

config_path = 'trained_models/yolox_x_8x8_300e_coco.py'
weights_path = 'trained_models/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth'
!python demo/image_demo.py demo/demo.jpg $config_path $weights_path --device cuda:0 --out-file result_yolox.jpg

処理結果はこちらです。

result_yolox
YOLOX-x の処理結果

こちらは、導入編での YOLOv3 の結果です。
result_yolov3
YOLOv3 の処理結果
YOLOX-x の方は奥の方に小さく写っている車もしっかり検出できていますね!素晴らしい!

Python コードで実行

先ほど動かしたのは、MMDetection で用意されいたスクリプトでした。途中の処理結果を見たり、各処理の処理時間を計測したりするために、Python コードで実行してみます。

from mmdet.apis import inference_detector, init_detector, show_result_pyplot


config_path = 'trained_models/yolox_x_8x8_300e_coco.py'
weights_path = 'trained_models/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth'
img_file = 'demo/demo.jpg'

# モデル定義とパラメータファイルのロード
model = init_detector(config_path, weights_path, device='cuda:0')

# 画像の前処理、モデルに入力
result = inference_detector(model, img_file)
# 結果の描画
show_result_pyplot(model, img_file, result)

実行すると MatpoltLib で以下のように画像が出力されます。
result_python_code

速度の比較

モデルの処理部分だけを取り出せたので速度の比較をしてみます。
こちらも YOLOv3 と YOLOX-x の比較をしてみます。
YOLOv3 の学習済みモデルをダウンロードしていない場合は、下記コードでダウンロードしてください。

!mim download mmdet --config yolov3_mobilenetv2_320_300e_coco --dest trained_models

YOLOv3

config_path = 'trained_models/yolov3_mobilenetv2_320_300e_coco.py'
weights_path = 'trained_models/yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth'
img_file = 'demo/demo.jpg'

model = init_detector(config_path, weights_path, device='cuda:0')
%timeit -n 10 result = inference_detector(model, img_file)

結果

25.2 ms ± 1.64 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

YOLOX-x

config_path = 'trained_models/yolox_x_8x8_300e_coco.py'
weights_path = 'trained_models/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth'
img_file = 'demo/demo.jpg'

model = init_detector(config_path, weights_path, device='cuda:0')
%timeit -n 10 result = inference_detector(model, img_file)

結果

92.6 ms ± 2.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

YOLOX-x は精度が高い分、処理時間がかかっており、精度と速度がトレードオフになっているのがわかりますね。

まとめ

今回は、MMDetection で使える学習済みモデルを動かしてみました。皆さんも好きなモデルをダウンロードして遊んでてみてください!
次回は Object Detection の研究等で用いられているデータセットで、学習済みモデルの評価をしていたいと思います。

Discussion

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