YOLOXでの学習を実際に一から試してしてみました。
COCOのデータセットの入手から、物体検出まで行っています。
Colab上で実施していますので、誰でも同様にテスト可能です。
YOLOXの学習をCOCOのデータセットから試してみた
YOLOX-tinyを使って、COCOのデータセットを学習させてみました。
Colab上でデータセットの入手から、学習させたモデルで画像認識まで行っています。
ColabのGPUを使用します
1000枚程度の写真を使ってYOLOXの学習をしますので、GPUが必要になります。
ランタイムからGPUを選択してColabを開始します。
(下記はGPUがセットされているかの確認です)
1 2 3 4 5 |
# 残り時間の表示 !cat /proc/uptime | awk '{printf("残り時間 : %.2f", 12-$1/60/60)}' # GPUの確認 !nvidia-smi |
学習で数時間かかります。無料のColabだと運が悪いと制限が掛かる場合があります。
下記記事のように筆者は有料のColab Pro環境で動かしています。
GPUバックエンドに接続できませんが出たのでColab Proに課金した話
FiftyOneでCOCOのデータセットを入手します
COCOのデータセットはFiftyoneというツールを使って入手します。
1 2 3 4 |
# FiftyOne をインストール # 2022/5時点でのopencv-python-headless 4.5.5.64では動作しないので4.5.4.60を再インストール !pip install fiftyone !pip install opencv-python-headless==4.5.4.60 |
Colab上で簡単にダウンロード、ラベルの整理が行えます。下記で使い方を紹介しています。
COCOのデータセットの簡単な使い方!FiftyOneを試してみた
学習時間を数時間に抑えるため、今回は1000枚程度の写真で学習させます。
(COCOのデータセットの全てだと20GB近くなるので…)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#split="train"にすれば学習(train)データもダウンロード可能だが、容量が20GB近いので実施しない #サンプルコードのままsplit="validation"の検証用データを表示 import fiftyone as fo import fiftyone.zoo as foz # List available zoo datasets print(foz.list_zoo_datasets()) # # Load the COCO-2017 validation split into a FiftyOne dataset # # This will download the dataset from the web, if necessary # dataset = foz.load_zoo_dataset("coco-2017", split="validation") # Give the dataset a new name, and make it persistent so that you can # work with it in future sessions dataset.name = "coco-2017-validation-example" dataset.persistent = True # Visualize the in the App session = fo.launch_app(dataset) |
今回は人・車・椅子の3つを学習させるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#COCOのデータセットから700のtrainデータと300のvalデータを出力する #COCO形式で "person", "car", "chair"の3つのラベルで出力する classes = ["person", "car", "chair"] train_dataset = dataset[:700] val_dataset = dataset[700:1000] test_dataset = dataset[1000:1500] # COCO形式でエクスポート train_dataset.export( export_dir=f"/content/data/train/", dataset_type=fo.types.COCODetectionDataset, split="train", classes=classes, ) val_dataset.export( export_dir=f"/content/data/val/", dataset_type=fo.types.COCODetectionDataset, split="val", classes=classes, ) test_dataset.export( export_dir=f"/content/data/test/", dataset_type=fo.types.COCODetectionDataset, split="test", classes=classes, ) |
YOLOX-Tinyでの学習
YOLOXの中にも何個かのモデルに分かれています。
詳細はYOLOXのGithubを見てもらえればと思います。(というか筆者が説明できない)
https://github.com/Megvii-BaseDetection/YOLOX
今回は軽量モデル(Light Models)のYOLOX-tinyを使って学習していきます。
ダウンロードしたデータを学習できるように整理します。
1 2 3 4 5 6 7 8 9 10 11 |
# YOLOX用にフォルダ作成・データセットをコピー !mkdir dataset !mkdir dataset/images !mkdir dataset/images/train2017 !mkdir dataset/images/val2017 !mkdir dataset/annotations !cp -rf /content/data/train/data/*.jpg dataset/images/train2017 !cp -rf /content/data/val/data/*.jpg dataset/images/val2017 !cp -rf /content/data/train/labels.json dataset/annotations/train_annotations.json !cp -rf /content/data/val/labels.json dataset/annotations/validation_annotations.json |
YOLOXのインストールは公式通りです。
1 2 3 4 5 |
#YOLOXをインストール !git clone https://github.com/Megvii-BaseDetection/YOLOX.git %cd YOLOX !pip3 install -v -e . # or python3 setup.py develop |
YOLOXフォルダにあるYOLOX-tiny.pyのファイルを修正します
1 2 |
#YOLOX-tinyを使用 !cp /content/YOLOX/exps/default/yolox_tiny.py /content/YOLOX |
Colab上でも修正できますので、データセットのパスを追記します。
1 2 3 4 5 6 7 8 9 |
#yolox-tiny.pyにデータセットのパスを指定する。 #/content/YOLOX/yolox_tiny.pyを開いて下記を追記する # Define yourself dataset path self.data_dir = "/content/dataset/images" self.train_ann = "/content/dataset/annotations/train_annotations.json" self.val_ann = "/content/dataset/annotations/validation_annotations.json" self.num_classes = 3 |
あとはYOLOXの学習をさせるだけです。2~3時間ぐらいかかりました。
1 2 3 4 5 6 7 |
#yolox-tinyで学習させる(約2時間ぐらいかかる) !python tools/train.py \ -f yolox_tiny.py \ -d 1 \ -b 16 \ --fp16 \ -o |
学習したモデルで画像認識します
学習済のモデルは下記に保存されました。
/content/YOLOX/YOLOX_outputs/yolox_tiny/best_ckpt.pth
学習したモデルで画像認識できるか一度テストしています。
下記はテスト時にOPENCV関連のエラーが出たので再インストールしているだけです。
1 2 3 |
#後のコードでOPENCVのエラーが出たので一度最新をインストール !pip uninstall opencv-python; !pip install opencv-python |
実際にテスト用の画像データとモデルパスを貼り付けて、テストさせます。
1 2 3 4 5 6 7 8 9 10 11 |
#テスト用の画像データのパスを貼り付けて、学習させたモデルでテスト(demo.py)する TEST_IMAGE_PATH = "/content/data/test/data/000000121673.jpg" MODEL_PATH = "/content/YOLOX/YOLOX_outputs/yolox_tiny/best_ckpt.pth" !python tools/demo.py image \ -f yolox_tiny.py \ -c {MODEL_PATH} \ --path {TEST_IMAGE_PATH} \ --tsize 416 \ --save_result \ --device gpu |
テストすると画像認識された結果が下記フォルダに入っていました。
/content/YOLOX/YOLOX_outputs/yolox_tiny/vis_res/***/***.jpg"
***箇所に関しては日付やファイル名で適宜変わります。
1 2 3 4 5 6 |
#テスト(demo.py)して画像認識させた結果を表示する #下記パスはテストの日付入った一例なので適宜修正すること from PIL import Image OUTPUT_IMAGE_PATH = "/content/YOLOX/YOLOX_outputs/yolox_tiny/vis_res/2022_05_21_12_43_34/000000121673.jpg" Image.open(OUTPUT_IMAGE_PATH) |
テスト用の画像データから、人(person)をしっかり認識できました。
Googleドライブに学習結果を保存します
必要に応じて、出力結果をGoogleドライブに保存します。
(Colabで作成されたファイル・フォルダは閉じてしまうと保存されないため)
1 2 3 4 5 |
#Googleドライブの作業用フォルダの作成・マウント from google.colab import drive drive.mount('/content/drive') #!mkdir -p '/content/drive/My Drive/work/' %cd '/content/drive/My Drive/work/' |
1 2 |
#Googleドライブにコピー cp -rf /content/YOLOX/YOLOX_outputs /content/drive/MyDrive/work |
参考記事
YOLOX+Colabの学習に関して、下記記事を非常に参考にさせていただきました。
この場を借りてお礼申し上げます。
https://github.com/Kazuhito00/YOLOX-Colaboratory-Training-Sample
GitHubのGist
同様にテストしたい、実行履歴を確認したい方はGitHubのGistが下記となっています。
ご自由にお使い下さい。
まとめ
YOLOX+COCOの学習を紹介させていただきました。
よろしければ皆さまも試してみて下さい。
コメント