【物体検出】AutoGluonを使ってMMDetectionの学習を行う

公開日:2022年11月26日
最終更新日:2023年1月31日

はじめに

AutoGluonを使ってMMDetectionの学習を行うことができるようになったのでさっそく試してみました。

学習データを作成するところから学習、推論といっきにやっていきます。

環境構築

Ubuntu 20.04 on WSL2
CUDA 11.6.2
Python 3.8.10
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchtext==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
pip install autogluon==0.6.2
pip install mmcv-full==1.7.1 -f https://download.openmmlab.com/mmcv/dist/cu116/torch1.12.0/index.html
pip install mmdet==2.28.0
pip install mmtrack==0.14.0
pip install gdown==4.6.0
pip install opencv-contrib-python==4.7.0.68

学習データの準備

動画ファイルからMMTrackを利用して学習データを作ります。

以前書いたスクリプトを利用しました。そのためにまずはスクリプトをダウンロードします。

wget https://raw.githubusercontent.com/dai-ichiro/detection/main/tools/download_sample_videos.py
wget https://raw.githubusercontent.com/dai-ichiro/detection/main/tools/make_VOCdatasets.py



ダウンロードしたスクリプトを実行するとVOCフォーマットのデータセットが作成されます。
詳細な使い方はこちらを参照して下さい。

python download_sample_videos.py
python make_VOCdatasets.py --videos_dir videos



AutoGluonではCOCOフォーマットを使用することが推奨されいるため変換が必要です。
変換のためのスクリプトはAutoGluonで用意されているためそちらをダウンロードして実行します。

wget https://raw.githubusercontent.com/awslabs/autogluon/master/multimodal/src/autogluon/multimodal/cli/voc2coco.py
python voc2coco.py --root_dir VOC2012 --train_ratio 0.6 --val_ratio 0



「--train_ratio 0.6」でデータの60%をtrain dataとしました。その他はtest dataになります。
学習の際にAutoGluonが自動的にtrain dataの一部をval dataに振り分けてくれるようですので「--val_ratio 0」としています。

「Annotations」フォルダ内に「usersplit_train_cocoformat.json」「usersplit_val_cocoformat.json」「usersplit_test_cocoformat.json」の3つのファイルが作成されますが「usersplit_val_cocoformat.json」の中身はカラです。

学習

非常にすっきり書けます。

from autogluon.multimodal import MultiModalPredictor

import os
import time

data_dir = 'VOC2012'
train_path = os.path.join(data_dir, "Annotations", "usersplit_train_cocoformat.json")

checkpoint_name = "faster_rcnn_r50_fpn_2x_coco"

predictor = MultiModalPredictor(
    hyperparameters={
        "model.mmdet_image.checkpoint_name": checkpoint_name,
        "env.num_gpus": -1,  # use all GPUs
        "optimization.val_metric": "map",
    },
    problem_type="object_detection",
    sample_data_path=train_path,
    path="./result_save",
)

start = time.time()

predictor.fit(
    train_path,
    hyperparameters={
        "optimization.learning_rate": 2e-5, 
        "optimization.max_epochs": 30,
        "env.per_gpu_batch_size": 4,  # decrease it when model is large
    },
)
train_end = time.time()

print("This finetuning takes %.2f seconds." % (train_end - start))

推論

まずはサンプル画像をダウンロードします。

wget https://github.com/dai-ichiro/train_detection_using_mmdetection/raw/version2.x/sample_images/test_3class.jpg



その後、以下を実行します。

from autogluon.multimodal import MultiModalPredictor
from autogluon.multimodal.utils import Visualizer

test_path = "test_3class.jpg"

predictor = MultiModalPredictor.load("./result_save")
predictor.set_num_gpus(1)

pred = predictor.predict({"image": [test_path]})

pred = pred.iloc[0] # pandas.core.frame.DataFrame -> pandas.core.series.Series
conf_threshold = 0.8  # Specify a confidence threshold to filter out unwanted boxes

img_path = pred.image  # Select an image to visualize

visualizer = Visualizer(img_path)  # Initialize the Visualizer
out = visualizer.draw_instance_predictions(pred, conf_threshold=conf_threshold)  # Draw detections
visualized = out.get_image()  # Get the visualized image

from PIL import Image
img = Image.fromarray(visualized, 'RGB')
img.show()

結果

結果として記事冒頭の写真が表示されます。

関連記事

普通にMMDetectionを使いたいかたはこちらを読んで下さい。
touch-sp.hatenablog.com
touch-sp.hatenablog.com