公開日: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