はじめに
はじめまして。今回が初投稿になります。
データサイエンスに興味があり、勉強も兼ねてこれから投稿していこうと思います。
よろしくお願いします。
今回は ①自作データセットを準備 し、 ②YOLOv7で学習+物体検出 に挑戦してみました。
環境
Google Colaboratoryの無料枠を使用しました。
Googleアカウントがあれば手軽に始められるので便利ですよね。
①自作データセットを準備
今回はYOLOv7で自宅で飼っている犬を判別していこうと思います。
まずは、↓こんな感じにiPhoneを使って飼い犬の画像を準備します。
画像サイズが大きいと学習に時間がかかるため、320x320にリサイズしています。
画像形式はjpeg形式にしています。
アノテーションの設定
VoTTを使用して、バウンディングボックスで犬にタグ付けを行っていきます[1]。タグ付けが完了したら結果をVoTT JSON形式でエクスポートします。
次にroboflowを使って、先ほどのVoTTのエクスポート結果をYOLOv7用に変換します[2,3]。
変換時にデータセットをトレーニングデータとバリデーションデータに分割できます。
今回は合計39枚の画像をトレーニングデータ:30枚、バリデーションデータ:9枚になるように分けました。
roboflowによる変換後のデータはzipでダウンロードします。
その際に、データフォーマットが選べるので「YOLO v7 PyTorch」を選択します。
zip解凍後のディレクトリ構造は以下のようになっていました。
myDog.v1i.yolov7pytorch/
├─ data.yaml
├─ README.dataset.txt
├─ README.roboflow.txt
├─ train/
│ ├─ images/
│ │ ├─ XXX.jpg
│ │ └─ ...
│ └─ labels/
│ ├─ XXX.txt
│ └─ ...
└─ valid/
├─ images/
│ ├─ XXX.jpg
│ └─ ...
└─ labels/
├─ XXX.txt
└─ ...
ここまででデータセットの作成が完了です。
②YOLOv7で学習+物体検出
以下であげていただいているソースを使用して、学習と物体検出を行っていきます。
コマンドについては[4,5]を参考にしました。
実行環境の準備
作業ディレクトリに移動し、cloneします。
cd /content/drive/MyDrive
!git clone https://github.com/WongKinYiu/yolov7
cloneしたフォルダに移動し、実行に必要なパッケージをダウンロードします。
その後、学習済みの重みをダウンロードします。
cd yolov7
pip install -r requirements.txt
!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-e6e.pt
次に先ほど作成したデータセットを配置していきます。
まずはデータセットを配置するためのフォルダ(dataset)を作成します。
mkdir dataset
datasetの下に自作データセットのtrainとvalidを配置します。
またdataの下にも同じく先ほど作成されたdata.yamlを配置します。
drive/
└─ MyDrive/
└─ yolov7/
├─ dataset/
│ ├─ train/
│ │ ├─ images/
│ │ │ ├─ XXX.jpg
│ │ │ └─ ...
│ │ └─ labels/
│ │ ├─ XXX.txt
│ │ └─ ...
│ └─ valid/
│ ├─ images/
│ │ ├─ XXX.jpg
│ │ └─ ...
│ └─ labels/
│ ├─ XXX.txt
│ └─ ...
├─ data
│ ├─ data.yaml
│ └─ ...
└─ ...
トレーニングデータとバリデーションデータを取得するため、data.yamlに記載されているパスの変更が必要です。
(変更前)
train: ../train/images
val: ../valid/images
(変更後)
train: /content/drive/MyDrive/yolov7/dataset/train/images
val: /content/drive/MyDrive/yolov7/dataset/valid/images
自作データセットで学習
先ほど配置したtrain内のデータを用いて学習します。
!python train_aux.py --workers 8 --batch-size 16 --data data/data.yaml --cfg cfg/training/yolov7-e6.yaml --weights 'checkpoints/yolov7-e6.pt' --name yolov7-e6-myDog --hyp data/hyp.scratch.p6.yaml --epochs 200 --device 0
学習済みモデルで推論
valid内のデータを用いて推論します。
結果の保存先は「yolov7/runs/detect/(任意のフォルダ名)」になります。
!python detect.py --weights runs/train/yolov7-e6-myDog/weights/best.pt --conf 0.25 --img-size 640 --source dataset/valid/images --name exp-yolov7-e6-myDog-valid
以下のような推論結果になりました。
myDogというタグがついたバウンディングボックスで、飼い犬を検出することができました。
おわりに
最後までご覧いただきありがとうございました。
今回は ①自作データセットを準備 し、 ②YOLOv7で学習+物体検出 に挑戦してみました。
次回も同じく手を動かしてみた内容を投稿できればと思います。
(この記事を書いている間に最新verの「YOLOv8」が出たようなのでこちらも動かしてみたいですね)
参考文献
[1]【物体検出】アノテーションツールVoTTの使い方
https://sleepless-se.net/2019/06/21/how-to-use-vott/
[2]アノテーションツール VoTT を使って YOLOv5 の学習データセットを作る
https://konchangakita.hatenablog.com/entry/2020/08/24/220000
[3]How To Convert VoTT JSON to YOLOv7 PyTorch TXT
https://roboflow.com/convert/vott-json-to-yolov7-pytorch-txt
[4]YOLOv7を使って自作データセットで物体検出してみた
https://dev.classmethod.jp/articles/yolov7-train-with-customize-dataset/
[5]【物体検出2022】YOLO最新版のYOLOv7を試してみる 〜デモから学習まで〜
https://qiita.com/hkwsdgea_ttt2/items/ba352f6e5ef6032b5dc9)