LaiCai Flowガイド
YOLO · ONNX · LaiCai Flow

カスタムオブジェクト検出モデルを訓練するLaiCai Flow

このガイドでは、生のスクリーンショットからLaiCai互換のONNXモデルまでお手伝いします。実際の小さなオブジェクトゲームデータセットを作業例として使用していますが、同じプロセスはアプリのコントロール、製品、アイコン、ツール、およびその他の表示可能なターゲットにも適用されます。

テスト済みのレシピYOLO26n · 960 px · 17クラス · デスクトップとAndroidエージェントモデルの契約 (Android Agent)
鉱石、木、モンスターの周りに検出ボックスがある一般的なゲームシーン
1つのモデルは、リソース、キャラクター、オブジェクトの状態など、同じシーン内の複数の関連クラスを検出できます。
カスタムオブジェクト検出モデルを訓練するLaiCai Flow
YouTube

完全なパス

  1. 捕獲様々なフレームを集める
  2. ラベルタイトなボックスを描きます
  3. マージするクラスIDを安定させます。
  4. 電車見えないフレームで検証する
  5. 輸出生のONNX出力を作成する
  6. 輸入config.jsonを追加する

始める前に

LaiCaiが画面上のオブジェクトの位置を特定する必要がある場合は、オブジェクト検出を使用します。画像分類は、画像全体に含まれる内容のみを返し、境界ボックスは返しません。

鉱石、木材、モンスターは1つのモデルにすべきですか?

通常、同じゲームやアプリに表示され、同じスクリーンショットスケールを使用し、同じフローで検出する必要がある場合、はいを使用します。シーンが関連性がなく、クラスリストが非常に大きくなる場合、またはグループが異なる入力サイズまたはパフォーマンスターゲットを必要とする場合にのみ、別のモデルを使用します。

01

役立つスクリーンショットを用意する

LaiCaiが表示する正確なデバイス、解像度、ズームレベル、および視覚品質からフレームを収集します。 ほとんど同じに見える連続したビデオフレームを保存するよりも、多様性が重要になります。

  • 異なる位置、サイズ、照明、背景、アニメーションフレーム、および部分的な遮蔽を含める。
  • 難しい例を保持します。小さなオブジェクト、エッジオブジェクト、ぼやけ、ポップアップ、および視覚的に似た非ターゲットです。
  • ターゲットクラスが表示されない背景画像を追加します。そのラベルファイルは空です。
  • 普遍的な最低値はありません。最初のテストでは、クラスごとに少なくとも50個のさまざまなボックスを目指してください。難しいクラスや類似のクラスは通常、100〜200個以上が必要です。
02

ラベル付けする前にクラスリストを設計する

クラスは、フローが取る必要がある1つの視覚的決定を表す必要があります。同じ順序が使用されるため、名前は短く、ユニークで安定したものでなければなりません。YOLOラベル、data.yaml、config.json、およびvision.detectクラスセレクタ。

視覚的に異なる状態を別のクラスとして扱う

収集されたリソースがまだ使用可能なリソースに似ている場合は、たとえば銅と銅枯渇の2つの状態の両方をラベル付けします。 信頼水準だけで2つの実際の視覚状態を確実に区別できるとは期待しないでください。

利用可能な銅資源と枯渇した資源の並べ替え比較、それぞれに別々の検出ボックスがあります。
自動化が2つの状態に対して異なる反応をする必要がある場合は、別のクラスを使用します。
  • すべてのターゲットクラスのすべての可視インスタンスはラベル付けする必要があります。ラベル付けされていないターゲットは背景として学習されます。
  • すべての場所で同じボックスポリシーを使用してください。目に見えるオブジェクトの周りはタイトにし、大きな余白を残さないでください。
  • ラベル付けツールでスペースを変更する場合は、CopperDepleted や copper_depleted などの名前を使用することをお勧めします。
03

MakeSense.aiでラベル付けする

MakeSense.aiは、ブラウザベースの無料ラベル付けツールです。LaiCaiモデルの場合、オブジェクト検出を選択し、長方形ボックスを使用し、エクスポートします。YOLO注釈。 (Object Detection)

  1. 1

    MakeSense.aiを開き、ソース画像をアップロードします。元の画像フォルダを残しておいてください。エクスポートされたラベルZIPはそれを置き換えるものではありません。

  2. 2

    画像認識ではなく、オブジェクト検出を選択してください。 (Object Detection · Image Recognition)

  3. 3

    固定された順序で最終クラスのリストを作成し、各ターゲットインスタンスの周りに長方形を描画します。

  4. 4

    エクスポートする前に、空の画像、見逃したオブジェクト、間違ったクラス、そして緩いボックスを確認してください。

  5. 5

    Rect 注釈を ZIP パッケージとしてエクスポートするYOLOフォーマット。 (Rect annotations)

04

1つきれいに構築するYOLOデータセット

各画像を同じ名前の.txtラベルファイルとペアリングします。トレーニングと検証間で隣接するビデオフレームをランダムに散らばらせるのではなく、録画セッションまたは時間範囲で分割します。

Dataset
dataset/
├── images/
│   ├── train/
│   └── val/
├── labels/
│   ├── train/
│   └── val/
└── data.yaml
data.yaml
path: /absolute/path/to/dataset
train: images/train
val: images/val

names:
  0: Copper
  1: CopperDepleted
  2: Wood
  3: Monster

実用的で最初の分割率は80%のトレーニングと20%の検証です。検証セットには、実際に見たことのないシーンが含まれている必要があります。

  • 新しい注釈バッチの場合、古い画像をMakeSense.aiに再度アップロードする必要はありません。
  • 新しい画像とラベルをオフラインで統合し、元の順序が変更されないように、クラス名で数値クラスIDを再マッピングします。
  • 完全な古い+新しいデータセットで再トレーニングします。新しい画像のみをトレーニングすると、古いクラスは背景のように振る舞う可能性があります。
例YOLOクラスごとのラベル付けされたインスタンスの数とボックスサイズの表示するデータセットチャート
トレーニングの前にクラス数を確認してください。いくつかの例しかないクラスは、全体的なスコアが良好に見える場合でも不安定な指標を生成します。
05

Ultralyticsをインストールしてトレーニングします。

以下の例は、このワークフローで検証されたバージョンを使用しています。ナノモデルは、継続的な検出の最も安全な出発点です。大きなオブジェクトの場合は640ピクセル、重要なターゲットが小さい場合は960ピクセルを使用してください。

孤立した環境を作成する
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install ultralytics==8.4.138 onnx==1.22.0 \
  onnxruntime==1.29.0 onnxslim==0.1.96

推奨される開始パラメータ

パラメータ開始値なぜ
modelYOLO26n最初の回のために小さくて速い。
imgsz960 / 640小さなターゲットには960を使用し、ターゲットが大きい場合や速度がより重要な場合は640を使用します。
epochs200寛大な上限を設定し、早期停止により早く終了できます。
patience40検証が40エポック連続で改善されない場合、停止します。
batch8メモリが足りなくなる場合は、4または2に減らします。測定後にのみ増やしてください。
devicemps / 0 / cpuアップルのシリコンはmpsを使用し、NVIDIAは0を使用し、どのマシンでもCPUを使用できます。
workers4保守的なクロスプラットフォームの出発点。
seed42データセットとトレーニングの比較を再現しやすくなります。
close_mosaic15最後のエポックがより自然な画像を見るように、最後の部分近くのモザイクを無効にします。
train.py
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.train(
    data="dataset/data.yaml",
    imgsz=960,
    epochs=200,
    patience=40,
    batch=8,
    device="mps",  # NVIDIA: 0 · CPU: "cpu"
    workers=4,
    seed=42,
    close_mosaic=15,
)
06

損失曲線だけでなく、モデルを検証する

最高のチェックポイントを使用し、見えないスクリーンショットでの予測を確認し、各クラスを個別にレビューします。 高いグローバルスコアは、弱いレアクラスを隠すことができます。

  • 精度:報告された検出のうち、正しい検出の数。
  • 復習:実際に何個のオブジェクトが見つかったか。
  • mAP50とmAP50-95:閾値全体でのローカリゼーションと分類の品質。
  • 混同行列:どのクラスが互いに誤解されているか、または背景と誤解されているか。
例:ウルトラライトのトレーニング損失と検証指標曲線 (Ultralytics)
トレーニング損失は検証メトリックが安定するにつれて低下傾向にあるはずです。最終エポックを自動的に使用するのではなく、保存されたbest.ptを使用してください。
マルチクラスゲームオブジェクト検出器の例の正規化された混淆行列
対角線と背景の行と列を確認します。類似状態のクラスは独自のチェックを受けるに値します。
07

LaiCai互換のONNXモデルをエクスポートする

LaiCaiは、training.ptファイルではなくONNXをインポートします。静的NCHW RGB入力、バッチ1、float32またはfloat16、および生のワンツーマニー予測を1つエクスポートして、LaiCaiが信頼度フィルタリングとNMSを適用できるようにします。

export.py
from ultralytics import YOLO

model = YOLO("runs/detect/train/weights/best.pt")
model.export(
    format="onnx",
    imgsz=960,
    batch=1,
    dynamic=False,
    simplify=True,
    nms=None,
)

モデルディレクトリをパッケージ化する

LaiCaiのモデルライブラリのディレクトリ自体を選択します。ディレクトリには、config.jsonとmodelFileで名前付けられたONNXファイルが含まれている必要があります。クラスIDは0から始まり、連続している必要があります。

Model directory
game-objects/
├── config.json
└── model.onnx
config.json
{
  "id": "game-objects-v1",
  "name": "Game Objects v1",
  "type": "yolo",
  "modelFile": "model.onnx",
  "outputFormat": "raw_yolo_no_objectness",
  "id2label": {
    "0": "Copper",
    "1": "CopperDepleted",
    "2": "Wood",
    "3": "Monster"
  },
  "label2id": {
    "Copper": 0,
    "CopperDepleted": 1,
    "Wood": 2,
    "Monster": 3
  }
}

警告付きでインポートされましたか?

LaiCaiがconfig.jsonが欠落しているか読み込めないと表示される場合は、ONNXファイルまたは不完全なフォルダを選択した可能性があります。完全なモデルディレクトリをインポートし、id2labelまたはlabel2idがすべてのクラスを定義していることを確認してください。

08

LaiCaiでインポートしてテストする

開くLaiCai Flow、モデルライブラリに移動し、準備されたディレクトリを読み込み、モデルが「互換性がある」とマークされていることを確認してから、vision.detectで使用してください。

  • モデルライブラリのモデルを選択し、入力、出力、出力形式、クラスリストを確認します。
  • クラスと、0.5 などの合理的な開始しきい値を使用して、テスト現在の画面を使用します。
  • 陽性フレームと否定的なフレーム、または混乱するフレームの両方をテストします。 成功した推論呼び出しは、検出されたオブジェクトとは異なります。
  • デスクトップの検証後、Flowが携帯電話で実行される場合は、同じモデルをAndroid Agentで別々にテストします。
V2+

次のバージョンをどのように改善するか

元の画像を保存してください。YOLOラベル、クラスリスト、data.yaml、トレーニングコマンド、およびbest.ptを一緒に使用します。これらのファイルは、再利用可能なデータセットソースです。エクスポートされたONNXファイルだけでは、信頼性の高い再トレーニングには十分ではありません。

  1. 実際の実行から偽陽性、見落としられたオブジェクト、新しい環境、および新しい視覚状態を収集します。
  2. MakeSense.aiで新しい画像のみを最終クラスポリシーを使用してラベル付けします。
  3. 古いデータと新しいデータを統合し、クラスIDを名前で保持してから、セッションごとに再度分割します。
  4. クラスマッピングが互換性がある場合、以前のbest.ptから新しい実行を開始し、古いケースと新しいケースを検証します。
新しい画像に目立つ古いクラスをラベルなしで残さないでください。それらはトレーニング中に背景として扱われます。

よくある質問

古いすべての画像をMakeSense.aiに再インポートする必要がありますか?

いいえ。新しいバッチにラベルを付け、エクスポートして、オフラインで保存した古いデータセットと統合します。古い注釈を修正する必要がある場合にのみ古いデータを再インポートします。

新しいクラスを一つ追加してもいいですか?

はい、ただし、既存のクラスの後に追加し、新しいエクスポートをクラス名で再マッピングします。 次に、完全なデータセットで再トレーニングして、古いクラスを引き続き表示できるようにします。

なぜモデルは収集されたリソースをまだ検出するのですか?

2つの状態は視覚的に似ており、モデルは区別を学習していません。別の消耗状態クラスまたは検証済みのハードネガティブ例を追加し、その後、混同行列を再訓練してレビューします。

すべての偽陽性を修正するために、自信のしきい値を上げるべきですか?

いいえ。閾値は、精度をリコールと交換できるかもしれませんが、欠落したクラス、一貫性のないラベル、または混乱を招く否定的な例を補うことはできません。

公式参照

このガイドのコマンドと互換性選択は、現在の公式ドキュメントとLaiCaiモデル契約と比較してチェックされています。

で続行するLaiCai Flow

モデルが互換性がある後、vision.detectを使用してクラス、閾値、および画面領域を選択し、成功または失敗パスを次のFlowアクションに接続します。