MMdetectionの使い方: 環境構築と推論編(YOLOX)
はじめに
論文読みが多かったので、実装編としてメモ書きも始めます。
MMdetecionはOpenMMLabが開発している物体検出のオープンソースです。
色々なモデルが使えますが、YOLOXを使ってみたいと思います。
環境構築
前提としてGPUのセットアップはすでに終わっているものとします。
(NVIDIA DRIVERとNVIDIA Container ToollitをインストールしてDocker環境を作ってしまうのが手っ取り早いですが...)
基本は公式のget startedのBest Practicesをベースにしております。
Pytorch周りのインストール
pip install torch==2.1.0+cu{version} torchvision==0.16.0+cu{version} torchaudio==2.1.0+cu{version} --index-url https://download.pytorch.org/whl/cu{version}
{version}
にはcudaのversionが入ります。
関連ライブラリ(MMEngine, MMCV)をインストール
ここでmimというライブラリ管理ツールを使います。
ちなみにmimを使うと
- パッケージ管理
- モデルのconfigやweightのpull
などが楽にできます。
pip install -U openmim
mim install mmengine
mim install mmcv==2.1.0
MMdetectionのインストール
本題のMMdetectionです。
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -e .
YOLOXとは
(とにかく実行したいんだ!という方は飛ばしてください)
2024年現在だとYOLOシリーズの中でオープンソースかつ速度が早く精度が最も良いモデルです。
YOLOのベース部分は割愛しますが、派生元のモデルはYOLOv3になります。
Decoupled head
YOLOv3では検出と分類、回帰(bboxの位置推定)を同時に行っていますが、YOLOXではHead部分を目的に応じて分けています。
FPN featureとはよくあるピラミッド構造のBackBoneです。
これにより
- 速度が大きく向上
- 精度が上がる(少ないEpochでも精度が出る)
という嬉しいことがあります。
Strong data augmentation
これはMosaic[1]とMixUPというData Augumetaionのことを指しています。
YOLOXのトレーニング時は、最初の15epochだけ適用することでAP=42%を達成したと主張しています。
- Mosaic
- 4枚の画像をつなぎ合わせて1枚の画像を生成するデータ拡張
- MixUP
- 複数の画像を透過させ重ね合わるデータ拡張
この記事はDA周りがまとまっていてわかりやすかったので拝借しました。
Anchor-free
そもそもアンカーって何?という話ですが、ここでアンカーの話をすると壮大になるので閉じておきますが、物体検出の歴史的にはFaster R-CNNが登場してから長らく使用されていた技術になります。
超簡単にいうと、物体はこのくらいのサイズだろうと決め打ちして、bboxの大きさを予約しておくようなイメージです。
つまりハイパーパラメータになります。
一方でアンカーフリーのYOLOXでは、画像を事前に指定したGridに区切って、
- 各Gridの左上の点からどのくらいOffsetした位置に物体があるか?
- 予測されるbboxの高さと幅
を直接予測するモデルになっています。これにより速度が大きく向上したのに加え、精度も上がっています。
Multi positives
こちらは予測したbbox中心から決められた半径の円を取り、円と重なるGridはPositiveにするという考え方です。
物体検出では1画像の中で、物体が写っている領域より圧倒的に背景の方が多く、インバランスになりがちですが、Multi Positiveを使うことで緩和されます。
Posiviteアンカーの不均衡は以下の記事がイメージしやすくわかりやすいです。
SimOTA
ラベル割り当ての技術です。
要は予測されるbboxをどのように正解と紐づけると精度が上がるかの最適化問題を解いているイメージです。
で、精度どうなの?
ベースラインのYOLOv3から変更点を加えた時のCOCOデータセットに対するAPの変化です。
速度が早くてCOCOでAP=47.3%と高精度ですね。
推論
詳細は別の記事で書こうと思っていますが、MMdetectionは.py
ファイルで記述されるconfigファイルを使うことで実行ができます。
そのため推論には
- モデルのconfigファイル
- 事前学習重みファイル
- 推論したいデータ
が必要になります。
configファイルと重みのPull
mmdetectionフォルダの中にモデルの設定ファイルの雛形が入っています。
mimコマンドを使用すると、事前学習重みとセットでPullできます。
⚠️ 環境構築でカレントディレクトリが.../mmdetection
になっている場合は1階層戻ってください!
mim download mmdet --config yolox_l_8x8_300e_coco --dest ./checkpoints/
上記を実行すると、checkpointsフォルダの中にデータが格納されていると思います。
実行
mmdetection/demo/image_demo.py
に実行スクリプトが入っていますので、これを使って実行します。
python mmdetection/demo/image_demo.py mmdetection/demo/demo.jpg checkpoints/yolox_l_8x8_300e_coco.py --weights checkpoints/yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth
結果
2つのファイルが出力されます。
outputs/
├── preds/
│ └── demo.json
└── vis/
└── demo.py
demo.json
keyとしてlabels
, scores
, bboxes
を含むjsonファイルです。
-
labels
- 予測したbboxがどのクラスかをindexで表す
- COCOデータセットを使用しているので81クラス(正確な数字は忘れました)存在
-
mmdetection/mmdet/datasets/coco.py
を見るとクラス変数でどのクラスがあるかわかる
-
scores
- 予測した確信度
-
bboxes
- 予測したbboxの座標値
- COCOデータセットは
[x_min, y_min, width, height]
だがここでは[x_min, y_min, x_max, y_max]
であることに注意
demo.py
上記のjsonデータをinput画像に描画したデータです。
ちなみに、bboxの色もmmdetection/mmdet/datasets/coco.py
で定義されています。
最後に
できればconfigの詳細も記載したいと思っています。
Discussion