Ultralytics YOLO27: ウェイトリストに登録する。
Get Started
高性能YOLOデータセットの構築·定義する·レッスン 1/10
レッスン初級

ビジネス目標から始める

画像を1枚も収集する前に、ビジネス目標をビジョンタスク、定義済みクラス、コードとして実行できる受け入れテストに落とし込みます。

ラベル付き画像データセットを表示するノートPC、分類された写真プリント、クラス名を書いた付箋、データセットのチェックリストが置かれた机

倉庫チームが1か月間あらゆるものを撮影した後、安全責任者が関心を持っているのは、走行中のフォークリフト付近にいる人だけだと判明し、ラベルの半分をやり直すことになります。最初の撮影前に合意した1ページの目標があれば、こうした事態を防げます。作成には半日かかりますが、このコースで後から行うすべての選択、つまり収集対象、ラベル付け対象、モデルを出荷可能と判断する基準が決まります。

成果

1ページの目標を作成し、その成功指標を、任意のモデルに対してPASSまたはFAILを出力する受け入れテストスクリプトに落とし込みます。

短期集中コース
すでに使い方をご存じの方は、こちらをご覧ください。
  1. 期限を含め、ビジネス目標を測定可能な1文で記述します。

  2. 目的を達成できる7つのビジョンタスクの中から、最もシンプルなものを選びます。

  3. 3~10個のクラスをそれぞれ1文で定義し、各クラスに含めない類似対象を明記します。

  4. 指標、しきい値、未使用のホールドアウトデータを含む受け入れテストを作成し、コードとして実行します。

  5. v1では対応しない項目を列挙します。

実践的

1ページの目標#

Ultralytics YOLOのタスク出力を並べて表示:detect、pose、segment、classify、OBB、セマンティックセグメンテーション、depth

後続のすべてのステップの前提となる問いに、5つの行で答えます。プロジェクト目標の定義のガイドでは、同じ内容をより詳しく解説しています。以下は、このコースで使用する倉庫の記入例です。

項目答える質問倉庫の例
ビジネス目標ビジネスにどのような変化をもたらし、いつまでに達成しますか?6か月以内に、搬入口でのニアミス事故を30%削減します。
ビジョンタスクモデルは何を出力しますか?物体検出:フォークリフトと人を囲むボックス。
クラス何にラベルを付けますか?forklift、person、pallet。それ以外はすべて背景です。
受け入れテスト何をもって「出荷可能」と判断しますか?トレーニングで使用していないカメラの500フレームで、personの適合率が0.85以上の場合、再現率は0.95以上。
対象範囲外v1で対応しないことは何ですか?真っ暗な搬入口、ラックの陰に完全に隠れた人、手動式パレットジャッキ。

チーム全員が確認できる場所にこのページを掲示します。後から関係者が項目に異議を唱えた場合は、データセットより先にページを変更します。

問いに答えられる最もシンプルなタスクを選ぶ#

同じ猫と犬の場面を3つの方法で捉えた例:画像分類では猫かどうかを問い、物体検出では何がどこにあるかを問い、画像セグメンテーションではどのピクセルがどの物体に属するかを問います

タスクによってアノテーターが描くものが決まり、それがラベリング予算の大部分を左右します。この判断ツリーを順にたどり、ビジネス上の問いに答えられる最初のタスクで止めます。

Ultralytics YOLOは7つのタスクに対応しています。データセットの計画で重要なのは、それぞれのラベル付けにどれほどのコストがかかるかです。Computer Vision Foundationsでは、ビジョンタスクのレッスンで各タスクを詳しく比較しています。

タスクアノテーターが作成するものラベリングの工数選択する状況
分類画像ごとに1つのラベル最小画像ごとに1つの回答で十分な場合
検出物体ごとにクラスと軸に平行なボックス低物体を数える、または位置を特定する必要がある場合
OBB物体ごとにクラスと回転ボックス中物体が細長い場合、または上から見た場合
姿勢物体ごとにクラスと名前付きキーポイント高関節または部位の位置が重要です
インスタンスセグメンテーションオブジェクトごとにクラスとポリゴン高各オブジェクトの輪郭が重要です
セマンティックセグメンテーションすべてのピクセルにクラスを割り当てます最高数えられるオブジェクトではなく、領域が必要です
深度推定何も描画しません。通常は深度センサーから取得した、画像ごとの深度マップです撮影ハードウェアによって異なりますすべてのピクセルの距離が必要です

バナナの房に対する画像アノテーションの種類:分類では存在がわかり、検出では位置と個数が加わります。セマンティックセグメンテーションではバナナに該当するピクセルが示され、インスタンスセグメンテーションではバナナごとの大きさと形状が加わります

バナナの図を価格表のように見てください。検出だけで存在、位置、個数がわかり、大きさと形状が加わるのは2つのセグメンテーションの図だけですが、アノテーションコストは大幅に高くなります。ビジネス上の要件が「バナナはいくつあるか」だけなら、検出で十分です。ポリゴンは予算の無駄になります。

デフォルトのセグメンテーションでは予算がすぐ尽きる

チームは、より精密に見えるという理由でセグメンテーションを選びがちですが、夜勤、雨、2つ目の拠点を網羅する前にラベル付け予算が尽きてしまいます。ポリゴンは、物体1つあたりボックスの数倍のコストがかかります。面積の測定やマスクによる切り抜きなど、目的の項目で輪郭自体が必要な場合に限ってセグメンテーションを選択します。

アノテーターが適用できるクラスを定義します#

2人のアノテーターが同じオブジェクトに同じラベルを付けられる場合に限り、そのクラスは有用です。各クラスについて、紛らわしい対象のうち何を含めないかを明記した一文の定義を書きます。

  • forklift:フォークとマストを含む動力式フォークリフトです。ハンドパレットトラックは含みません。
  • person:一部が見えている人、座っている人、車両の運転席内にいる人を含む、あらゆる人です。反射像とポスターは含みません。
  • pallet:積載状態や空の状態を問わない、木製またはプラスチック製の輸送用パレットです。パレットの土台がない積み重ねたコンテナは含みません。

次に、粒度を意図的に選びます。「車両」のような粗いクラスはコストが低く、収束も速くなります。「セダン」「ピックアップ」のような細かいクラスは後工程で役立ちますが、一貫性を保つのが難しくなります。まずはビジネス上の要件に合わせてください。細かいラベルは後から1行のコードで粗いクラスに統合できますが、粗いラベルを分割するには再ラベリングが必要です。

書き起こせないルールでは、アノテーターもラベル付けできない

「危険そうに見えるものすべて」や「通路をふさいでいるもの」はクラスではありません。アノテーターごとの判断に委ねることになり、ばらつきのある判断で学習したモデルは、そのばらつきを学んでしまいます。定義だけを見て新しいアノテーターが適用できるよう、曖昧なクラスを書き直すか、検出後に適用するルールに変えます(たとえば、「通路のポリゴン内にあるpalletすべて」)。

指標を実行可能な受け入れテストに変えます#

ミスのコストに合った指標を選びます。

  • 見逃しのコストが高い(安全、欠陥):そのクラスの再現率を合格基準にします。
  • 誤検知のコストが高い(部品の自動却下、スタッフへの通知):適合率を合格基準にします。
  • すべてのクラスを同等に重視する(カウント、在庫管理):クラスごとのAPを合格基準にし、平均値の陰に隠れるクラスがないようにします。

YOLOの性能指標ガイドでは、各指標を解説しています。次に、「十分な性能か」という問いが議論にならないよう、テストをコードで記述します。このスクリプトは、事前学習済みモデルを使ってCOCO8のデモデータセットで今すぐ実行でき、後で独自のチェックポイントとホールドアウトデータにも使えます。

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # later: your fine-tuned runs/detect/train/weights/best.pt
metrics = model.val(data="coco8.yaml", classes=[0], verbose=False)  # 0 = person; later: your holdout YAML

precision, recall = metrics.box.mp, metrics.box.mr
print(f"person: precision={precision:.2f} recall={recall:.2f}")
print("PASS" if recall >= 0.95 and precision >= 0.85 else "FAIL: below the acceptance test")
                   all          4         10      0.939        0.8      0.848      0.387
person: precision=0.94 recall=0.80
FAIL: below the acceptance test

各行でわかること:

  • classes=[0]はpersonだけを評価するため、ほかのクラスの結果でスコアが底上げされることはありません。安全性に関わる独自のクラスIDを使用してください。
  • 検証結果の行には、4枚の画像とラベル付けされた10人が表示されます。mpとmrは、適合率と再現率のバランスが最もよい信頼度しきい値(F1最大値)での適合率と再現率です。
  • COCOで事前学習したモデルは10人中8人を検出するため、再現率は0.80です。適合率は高いものの、安全性の要件を満たすには不十分です。このFAILこそがテストの役割です。このコースでは、FAILになった場合はハイパーパラメーターではなくデータを見直します。
ホールドアウトの条件は数値と同じくらい重要

学習時と同じカメラや日付から抽出したテストは、実用性ではなく記憶を測定します。目的の中でホールドアウト条件を明記し(「学習に使っていないカメラ」「直近2週間の映像」など)、データセットを正しく分割するに従って構築します。

v1で対応しないことを書き出します#

完璧なモデルはないため、許容できる見逃しをあらかじめ明確にします。保証しない条件(濃霧、完全な暗闇)、混同しても許容する類似対象、v2まで対応を見送るロングテールクラスを挙げてください。この行があれば、目標を達成したモデルが明文化されていない100%基準で評価されるのを防げます。また、現時点で収集チームが労力をかける必要のない対象も明確になります。

試してみる

プロジェクト用の5行の目標表を記入し、ビジネス成果の責任者に送ります。指摘された行はすべて修正してください。次に、acceptance_test.pyをコピーしてクラスIDとしきい値を設定し、事前学習済みモデルで実行します。これにより、データセットが完成する前にテストを用意できます。成果物:objective.mdと動作するacceptance_test.py。

完了条件
以下のすべてを満たすと、レッスンは完了です。
  • ビジネス目標を期限付きの測定可能な一文にまとめ、責任者の合意を得ています。

  • 各クラスに一文の定義があり、除外する類似対象が少なくとも1つ明記されています。

  • acceptance_test.pyを実行すると、指標、しきい値、明記されたホールドアウトに対してPASSまたはFAILが出力されます。

解答を表示

別のプロジェクト、つまり食料品チェーンが棚の空きスペースを検出する場合の目標例:

項目回答
ビジネス目標四半期以内に、売上上位200商品の欠品時間を25%削減します。
ビジョンタスク検出です。店舗が必要としているのは各空きスペースの位置であり輪郭ではないため、ポリゴンよりバウンディングボックスが適しています。
クラスgap:商品の幅以上の空の棚スペースです。買い物客やカートに隠れているスペースは含みません。price_tag:棚の縁に付けられたラベルです。販促用ステッカーは含みません。
受け入れテスト学習に使用していない5店舗の400枚の画像で、gapの再現率が0.90以上、適合率が0.80以上。
対象範囲外反射のある冷凍庫の扉、エンド陳列、青果売り場。

空きスペースの見逃しは販売機会の損失につながる一方、誤検知によるコストはスタッフの短い移動時間だけなので、まず再現率を重視します。acceptance_test.pyで変更するのは3か所だけです。data="holdout_stores.yaml"(未使用の5店舗)、classes=[0](0がgapに変更)、しきい値のrecall >= 0.90 and precision >= 0.80です。

次のステップ

次に、目標をデータセット仕様に変換し、必要な画像の種類と各種類の枚数を定めます。