データセット用YAMLを作成する
Ultralyticsにフォルダーの場所を指定し、クラス名を定義するdata.yamlを作成します。どこからでもパスを解決できるようにし、yolo valで動作確認します。
データセットYAMLは、フォルダーとすべてのUltralyticsコマンドを結び付ける契約です。パスを間違えると処理が実行されません。クラスの順序を間違えると、警告が一切表示されないまま処理は実行され、すべての予測に誤った名前が付けられます。
このレッスンでは、錠剤データセット用のdata.yamlを作成し、チームメンバーのマシンでも動作するようにUltralyticsがパスを解決する仕組みを詳しく学びます。さらに、1行の検証コマンドを実行して動作を確認し、学習で上回る必要のあるベースラインを取得します。
実践的
ファイルを作成する#

Ultralytics Platform上のデータセットには、それぞれ独自のクラスと分割があり、data=ul://username/datasets/nameのようなURIで学習時に指定します。自分のマシンで作業する場合は、YAMLがその契約にあたります。次の内容をmy_dataset/data.yamlとして保存します。
path: my_dataset # dataset root: absolute, or relative to where you run yolo
train: images/train # relative to path
val: images/val # relative to path
# test: images/test # optional held-out split
names:
0: pill| キー | 必須 | 意味 |
|---|---|---|
path | いいえ | データセットのルート。train、val、testはこのルートからの相対パスです。省略した場合はYAMLファイルが置かれているフォルダーになります。 |
train, val | はい | 画像フォルダー、画像パスを記載した.txtファイル、またはいずれかのリストです。 |
test | いいえ | 学習から除外したtest画像。評価にはsplit=testのみを使用します。 |
names | はい | クラスインデックス → 名前。要素数によってクラス数が決まります。 |
download | いいえ | 画像が見つからない場合にデータセットを取得するURLまたはスクリプト |
trainとvalは画像フォルダーを指します。ラベルはimagesをlabelsに置き換えて検索されます。coco8 YAMLは最小構成の動作する例で、VOC YAMLはより大規模な例です。
実例:動作確認を行う#
事前学習済みモデルを使った検証は、エンドツーエンドで確認する最も速い方法です。すべての画像とラベルを読み込み、問題を報告し、指標を計算します。
yolo val model=yolo26n.pt data=my_dataset/data.yamlval: Scanning my_dataset/labels/val... 23 images, 0 backgrounds, 0 corrupt: 100%
Class Images Instances Box(P R mAP50 mAP50-95)
all 23 399 0.0256 0.00251 0.001 0.0002順番に確認します。
Scanning my_dataset/labels/val:Ultralyticsが実際に解決したフォルダーです。想定したフォルダーか確認してください。23 images, 0 backgrounds, 0 corrupt:すべての検証画像に有効なラベルファイルがあります。意図しない背景画像や破損ファイル数がある場合は、前のレッスンに戻ってください。399個のインスタンス:ラベルファイルには錠剤が399個記録されています。- mAP50-95が0.0002:この値で正しく、壊れているわけではありません。COCOには錠剤クラスがないため、事前学習済みモデルは錠剤を検出できません。このほぼゼロのスコアがベースラインです。人物や車など、対象クラスがCOCOに含まれている場合は、同じコマンドで意味のあるベースラインを取得できます。
どこからでもパスを解決できるようにする#
「画像が見つかりません」というエラーの多くは、パスの誤りが原因です。Ultralyticsはpathを次のように解決します。
datasets_dirはUltralyticsの設定項目です。yolo settingsで現在の値を表示でき、設定ガイドでは変更方法を説明しています。組み込みデータセットはこのフォールバックを利用します。coco8.yamlがpath: coco8とdownload:のURLを設定するため、data=coco8.yamlはどのフォルダーからでも動作します。
判断の目安:
- 自分だけが使い、常にプロジェクトフォルダーから実行しますか? 相対パスの
pathで問題ありません。 - 別フォルダーにあるチームメイト、サーバー、CI、ノートブックから使いますか? 絶対パスの
pathを使用します。 - データが別の場所にあり、自動で取得させたいですか? zip URLを指定して
download:を追加します。
クラスインデックスを契約として維持する#
各ラベル行の先頭にある整数は、names 内のインデックスです。Ultralyticsは範囲(Label class 1 exceeds dataset class count 1)をチェックしますが、意味までは確認できません。ラベリングツールが 0: forklift, 1: person をエクスポートし、YAMLに 0: person, 1: forklift と記述されていた場合、学習は成功し、検証時の mAP も問題ないように見えますが、すべての予測に誤った名前が付けられます。ラベリングツール、変換スクリプト、YAML、デプロイコードで共有するクラスリストを、唯一の信頼できる情報源として維持してください。
次の間違いに注意する#
症状: FileNotFoundError: Dataset 'data.yaml' images not found, missing path '.../datasets/my_dataset/images/val' が表示され、データセットのダウンロードディレクトリーに関するメッセージが出ます。原因: 別のフォルダーから実行したため、相対パス path が存在せず、Ultralyticsは代わりに datasets_dir を参照しました。対処: プロジェクトフォルダーから実行するか、path を絶対パスにしてください。
ラベルを付け直さずに names の項目を入れ替えたり削除したりすると、すべてのラベルの意味が気付かないうちに変わります。モデルはエラーを出さずにトレーニングされ、誤ったクラスを予測します。新しいクラスは次の空きインデックスで末尾に追加し、既存のクラス番号は変更しないでください。
val: [images/val_day, images/val_night] は両方のフォルダーを1つの検証セットに統合し、1つの数値を報告します。昼と夜を別々に確認する場合や、厳選した回帰テストセットと新しい本番サンプルを並べて確認する場合は、セットごとにYAMLファイルを用意して、それぞれを検証してください。split=test を使って一度しか評価しない test 分割については、データセットを正しく分割するで説明しています。
データ拡張やキャッシュなどの学習設定は、YAMLキーではなく train の引数です。すべて設定リファレンスに記載されています。
解答を表示
path: /home/you/projects/pills/my_dataset # absolute path to the dataset root
train: images/train
val: images/val
names:
0: pillval: Scanning /home/you/projects/pills/my_dataset/labels/val... 23 images, 0 backgrounds, 0 corrupt
all 23 399 0.0256 0.00251 0.001 0.0002別のフォルダーから実行すると、相対パス版は Dataset ... images not found で失敗しました。そこには my_dataset がなく、フォールバック先の datasets_dir にもコピーがなかったためです。絶対パスの path を使えば、この検索の問題は解消されます。ベースラインのmAP50-95は約0です。事前学習済みモデルには錠剤クラスがありません。