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