Google Colab + MMDetectionで楽してObject Detection - 2. 学習済みモデルを試す -
はじめに
こんにちは!すだです!
このシリーズ記事では、MMDetection で行えるいろんな便利な機能を紹介していきます。
今回は、導入編に引き続き、MMDetection で使える、学習済みモデルを動かしてみたいと思います!
導入編をまだ読んでいない方は、先にお読みください!
今回作成した 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
学習済みモデルをダウンロード
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 という正解割り当てアルゴリズムなどを採用したモデルになります。詳細は元論文や解説記事をご覧ください。
モデルのダウンロード
モデルが決まったらダウンロードします。やり方は 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
処理結果はこちらです。
YOLOX-x の処理結果
こちらは、導入編での 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 で以下のように画像が出力されます。
速度の比較
モデルの処理部分だけを取り出せたので速度の比較をしてみます。
こちらも 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