OpenMMLab の MMDetection を使う【学習編】

公開日:2022年9月21日
最終更新日:2022年9月24日

はじめに

MMDetectionで物体検出モデルを学習しようとするとconfigファイルの書き換えが必要になります。

いろいろなモデルでどのように書き換えればよいか非常に難しいと感じています。

今回、時間をかけていろいろなモデルを試してみようと思います。

一つのモデルを試したら記事はその都度更新していきます。

configファイルの書き換えはPythonスクリプト内で行っています。どこを書き換えたか後で見返した時に良く分かるからその方法をとりました。

学習データはVOCフォーマットを使用しています。
あらかじめ用意できているものとします。
簡単なサンプルでよければ作り方を記事の最後に載せておきますので参考にして下さい。

今回使用した学習データ

自前のデータは以下のような構造にしています。
フォルダ名は「VOC2007」か「VOC2012」にしておく必要があります。

VOC2012
│  
├─Annotations
│      0_000000.xml
│      0_000001.xml
│      ...
│      1_001405.xml
│      1_001406.xml
│      
├─ImageSets
│  └─Main
│          train.txt
│          val.txt
│          
└─JPEGImages
        0_000000.jpg
        0_000001.jpg
        ...
        1_001405.jpg
        1_001406.jpg

モデル別学習スクリプト

faster_rcnn_r50_fpn_1x_coco

「train_faster_rcnn_r50_fpn_1x_coco.py」という学習用スクリプトと「VOC2012」というVOCフォーマットのデータセットを同じフォルダ内に配置していた場合、

python train_faster_rcnn_r50_fpn_1x_coco.py --data VOC2012   

この1行で学習が始まります。


事前に何かをダウンロードしておくとかは必要ありません。データセットだけ準備して下さい。GitHubリポジトリのクローンも必要ありません。


先にも書きましたがこのスクリプト内でconfigファイルの書き換えも行っています。


スクリプトはGitHubに載せています。こちらになります。


検出する物体のクラス数やクラス名はデータセットから自動的に読み込まれるようになっています。

cascade_rcnn_r50_fpn_1x_coco

python train_cascade_rcnn_r50_fpn_1x_coco.py --data VOC2012   

この1行で学習が始まります。


スクリプトはGitHubに載せています。こちらになります。

libra_faster_rcnn_r50_fpn_1x_coco

python train_libra_faster_rcnn_r50_fpn_1x_coco.py --data VOC2012   

この1行で学習が始まります。


スクリプトはGitHubに載せています。こちらになります。

ssd512_coco

python train_ssd512_coco.py --data VOC2012   

この1行で学習が始まります。


スクリプトはGitHubに載せています。こちらになります。

yolox_s_8x8_300e_coco

checkpoint = download(package="mmdet", configs=[checkpoint_name], dest_root="models")[0]

この1行を実行するところでエラーが出ました。

UnicodeDecodeError: 'cp932' codec can't decode byte 0x99 in position 4712: illegal multibyte sequence



「python -X utf-8」で実行する必要があります。

python -X utf8 train_yolox_s_8x8_300e_coco.py --data VOC2012 --epochs 10

数エポックでは良い結果が出なかったので10を設定しています。

スクリプトはGitHubに載せています。こちらになります。

推論

推論はすべて共通です。

python inference.py --image sample_images\test_3class.jpg --config finetune_cfg.py --checkpoint output\latest.pth

「inference.py」とテスト画像はGitHubに載せています。こちらになります。

結果

faster_rcnn_r50_fpn_1x_coco

うまくいっています。

cascade_rcnn_r50_fpn_1x_coco

うまくいっています。

libra_faster_rcnn_r50_fpn_1x_coco

うまくいっていません。
すべて「akachanman」と認識しています。

ssd512_coco

うまくいっていません。
「akachanman」と「anpanman」の区別がついていません。

yolox_s_8x8_300e_coco

うまくいっています。

補足

VRAM不足が起きるようなら以下のような設定が必要です。(数字はモデルによって異なります)

# to avoid cuda out of memory
cfg.data.samples_per_gpu = 1
cfg.data.workers_per_gpu = 1

動作環境

Windows 11
CUDA 11.6.2
Python 3.9.13
pip install torch==1.12.1 torchvision==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
pip install mmcv-full==1.6.1 -f https://download.openmmlab.com/mmcv/dist/cu116/torch1.12.0/index.html
pip install mmdet==2.25.2
pip install openmim==0.3.1
pip install mmengine==0.1.0

VOCフォーマットのサンプルデータセットの作り方

あらかじめ「mmdet」に加えて「mmtrack」と「gdown」のインストールが必要です。

git clone https://github.com/dai-ichiro/train_detection_using_mmdetection.git
cd train_detection_using_mmdetection
python tools/download_3class_videos.py
python tools/make_VOCdatasets.py

以下の記事で作った作り方と同じです。前回はYOLOフォーマットでしたが今回はVOCフォーマットで出力するようにスクリプトを加工しました。
touch-sp.hatenablog.com