dskjal
広告
広告

YOLO v8 のファインチューニング

カテゴリ:deeplearning

解説記事は The Comprehensive Guide to Training and Running YOLOv8 Models on Custom Datasets公式ページが詳しい。

必要なもの

データセット

データ数はクラスあたり最低 100 は必要。

アノテーションツール

フォルダ構造

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

広告
広告

カテゴリ