YOLO v8 のファインチューニング
カテゴリ:deeplearning
解説記事は The Comprehensive Guide to Training and Running YOLOv8 Models on Custom Datasets や公式ページが詳しい。
必要なもの
- モデル(Ultralytics/YOLOv8 からダウンロードできる)
- セグメンテーションの場合は Instance Segmentation
- データセット
- GPU(CPU でも学習可能だが GPU で実行すればすぐに終わる)
データセット
データ数はクラスあたり最低 100 は必要。
アノテーションツール
- ログインが必要だが CVAT が有名。動画アノテーションや共同作業などもサポートするエンタープライズ級ツール
- オフライン動作なら python 製の LabelImg が人気が高い。解説はアノテーションツール『labelImg』を使ったAIモデル作成を参照。
- データ量が少ないならローカルブラウザで動作する Make Sense AI が便利。プロジェクトの中断・再開機能がないので大規模データセットには不向き。
- VGG Image Annotator (VIA) もオフライン動作
フォルダ構造
train のみが必須で val と test はなくてもいい。val は1エポックごとに性能を評価するのに使う。test は学習終了時に性能を評価するのに使う。
images ├ train ├ val └ test labels ├ train ├ val └ test
画像を images/train に配置し、対応する画像と同じ名前のラベルテキストを labels/train に配置する。
ラベルテキストのフォーマット
物体検出
テキストファイルで、正規化された「クラス(整数)・ボックスの中心 X・Y 座標・ボックスの幅と高さ」が順にスペース区切りで格納されている。画像内にボックスが複数ある場合は改行して入力する。
1 0.9 0.1 0.25 0.2 12 0.9 0.3 0.06 0.02 12 0.8 0.3 0.05 0.025 4 0.5 0.3 0.08 0.03
座標と幅と高さとは正規化されているので0~1の範囲になる。
セグメンテーション
ツールは JSON 形式でファイルを出力するので JSON2YOLO で YOLO 形式に変更する。
テキストファイルで、「クラス(整数)・正規化された頂点位置のリスト(x1 y1 x2 y2 x3 y3...)」が順にスペース区切りで格納されている。画像内にクラスが複数ある場合は改行して入力する。
1 0.9 0.1 0.25 0.2 0.3 0.83 12 0.9 0.3 0.06 0.02 0.87 0.1 0.55 0.26
学習フォルダとクラスの設定
クラス整数に対応する文字列は yaml ファイルに指定する。この記事の例では config.yaml。
path: ./ # プロジェクトの相対パス test: test/images # テスト画像フォルダの相対パス train: train/images # 学習画像フォルダの相対パス val: val/images # バリデーション画像フォルダの相対パス # classes。検出対象が1つの場合、0: bottle だけで十分。bottle を任意の文字に変更する names: 0: bottle 1: person 2: car
学習コード
config.yaml にデータセットのディレクトリやクラスを設定し以下のコードで学習できる。
from ultralytics import YOLO
import torch
device = "cuda:0" if torch.cuda.is_available() else "cpu" # 可能なら GPU を利用する
model = YOLO("yolov8n.pt")
train_results = model.train(
data="config.yaml", # path to dataset YAML
epochs=100, # number of training epochs
imgsz=640, # 画像を 640 px * 640 px にリサイズする
device=device)
path = model.export(format="onnx") # return path to exported model