YOLOモデルにおける構成ファイルの重要性
YOLO(You Only Look Once)ファミリーは、リアルタイム物体検出において高い評価を受けているディープラーニングアーキテクチャ群です。特にYOLOv5以降のバージョンでは、学習パイプラインの簡素化が進み、data.yamlのような構成ファイルを通じてデータセットの情報を効率的に伝達できるようになっています。このファイルはモデルがどのデータを使用し、どのようなクラスを認識すべきかを定義する中心的な役割を果たします。
data.yamlの基本構造
data.yamlはYAML形式で記述されるテキストファイルであり、主に以下の要素で構成されます:
- 訓練・検証・テストパス:各データセットの画像ディレクトリを指定
- クラス数(nc):検出対象のカテゴリ総数
- クラス名リスト(names):各カテゴリのラベル名
以下は実際の設定例です:
train: ../datasets/custom/train/images
val: ../datasets/custom/val/images
test: ../datasets/custom/test/images
nc: 4
names: [person, bicycle, car, motorcycle]
パスの指定方法:絶対パス vs 相対パス
データセットへのアクセスには2種類のパス表記が利用可能です。
絶対パスの使用
ファイルシステムのルートから始まる完全なパスを記述します。サーバー環境や複数ユーザーが共有する環境では推奨されます。
train: /home/user/datasets/vision_2024/train/images
相対パスの使用
プロジェクト内の相対位置に基づく記述です。ポータブル性が高く、Gitリポジトリなどでの管理に適しています。
val: ./dataset/validation/images
この場合、YAMLファイルからの相対位置として解釈されます。
クラス情報の正確な定義
物体検出モデルの性能は、ncとnamesの整合性に大きく依存します。
クラス数(nc)の設定
これは単なる数値ではなく、アノテーションファイル内で使用されている最大クラスIDに対応する必要があります。例えば、COCO形式のラベルでクラスIDが0〜79まで使われていれば、nc: 80と設定しなければなりません。
ラベル名の順序の重要性
names配列のインデックスは、アノテーション上のクラスIDと厳密に一致させる必要があります。
names: ['cat', 'dog', 'bird']
このとき、ID=0のバウンディングボックスは「cat」、ID=1は「dog」として解釈されます。順番がずれると誤検出が発生します。
前処理パラメータの拡張設定
最新版のYOLO実装では、data.yaml内に前処理に関する追加オプションを含めるケースもあります。
入力サイズの調整(imgsz)
推論および訓練時の入力画像サイズを定義します。正方形または矩形に対応可能です。
# 正方形入力(640×640)
imgsz: 640
# 矩形入力(高さ480、幅640)
imgsz: [480, 640]
大規模な画像サイズは精度向上に寄与する一方、VRAM消費量が増加するため、利用可能なGPUメモリとトレードオフとなります。
データ拡張関連の外部参照
一部のカスタムトレーニングパイプラインでは、data.yamlから別のAugmentation設定ファイルを参照する仕組みがあります。
augment: ../configs/augs/default_aug.yaml
これにより、データ増強戦略を独立して管理することが可能になります。
マルチモーダルデータへの対応
近年の高度なユースケースでは、RGB画像以外のセンサーデータも併用されることがあります。このような場合でも、data.yamlは柔軟に対応できます。
sensors:
- type: rgb
path: ../data/sensor_fusion/rgb/train
- type: thermal
path: ../data/sensor_fusion/thermal/train
ただし、標準的なYOLO実装ではこの機能はサポートされていないため、カスタムローダーが必要です。
実践的なチェックリスト
正しくdata.yamlを作成するために、以下の確認項目を推奨します:
- 全てのパスが実際に存在するか?
- クラス数(nc)と
namesリストの長さが一致しているか? - ラベル名にスペースや特殊文字が含まれていないか?
- 訓練・検証データに未定義のクラスIDが含まれていないか?
- 相対パスを使用する場合、作業ディレクトリは正しいか?
バージョン間の互換性
YOLOv5、v8、v11は内部アーキテクチャが異なるものの、data.yamlの基本フォーマットは共通しています。したがって、一度正しく作成された構成ファイルは、異なるバージョン間で再利用可能な場合が多いです。ただし、拡張機能(例:Transformerヘッド用の特別な前処理)を利用する場合は、対応バージョンのドキュメントを確認する必要があります。