萊彩 Flow 使用教學
YOLO · ONNX · LaiCai Flow

為萊彩 Flow 訓練自訂物件偵測模型

本教學會帶你從原始截圖一路完成萊彩可用的 ONNX 模型。範例來自小目標遊戲資料集,但相同流程也適用於 App 按鈕、商品、圖示、工具與其他畫面目標。

已驗證方案YOLO26n · 960 像素 · 17 個類別 · 符合桌面端與 Android Agent 模型契約
通用遊戲場景,礦石、樹木與怪物周圍帶有偵測框
同一個模型可以辨識相同場景中的多個相關類別,例如資源、角色與物件狀態。
為萊彩 Flow 訓練自訂物件偵測模型
YouTube

完整流程

  1. 擷取收集有差異的畫面
  2. 標註緊貼目標畫框
  3. 合併保持類別 ID 穩定
  4. 訓練用未見畫面驗證
  5. 匯出產生原始 ONNX 輸出
  6. 匯入補齊 config.json

開始之前

當萊彩需要知道目標在畫面中的位置時,應選擇物件偵測。圖片分類只能判斷整張圖片包含什麼,不會回傳目標框。

礦石、木材與怪物要放進同一個模型嗎?

通常可以。只要它們出現在同一款遊戲或 App、截圖比例一致,並且需要在同一個 Flow 裡辨識,就適合放進一個模型。只有場景完全無關、類別非常多,或某一組目標需要不同輸入尺寸與效能目標時,才考慮拆分模型。

01

準備真正有用的截圖

使用萊彩實際會看到的裝置、解析度、縮放與畫質來擷取。畫面的多樣性,比從影片連續儲存大量幾乎相同的影格更重要。

  • 涵蓋不同位置、大小、光線、背景、動畫階段與部分遮擋。
  • 保留難例:很小的目標、畫面邊緣目標、模糊、彈窗,以及與目標很像的非目標。
  • 加入一部分完全沒有目標類別的背景圖;這些圖片對應的標籤檔為空。
  • 沒有通用的最低數量。第一次測試可先確保每類至少 50 個有差異的框;難分或相似類別通常需要 100–200 個甚至更多。
02

標註前先確定類別表

每個類別都應對應 Flow 需要做出的一個視覺判斷。名稱要短、唯一且保持不變,因為 YOLO 標籤、data.yaml、config.json 與 vision.detect 類別選擇都會使用相同順序。

視覺狀態不同,就分成不同類別

如果資源採集後仍然很像可採集狀態,就把兩種狀態都標出來,例如 Copper 與 CopperDepleted。不要只靠調整信心分數來區分兩個真實視覺狀態。

可採集銅礦與已採集銅礦的並排比較,兩種狀態分別帶有偵測框
當自動化需要對兩種狀態採取不同動作時,應使用兩個類別。
  • 圖片中所有目標類別的每一個可見實例都必須標註;漏標的目標會被當成背景學習。
  • 所有圖片採用同一套畫框規則:緊貼可見物件,不要留下大片空白。
  • 如果標註工具會處理空格,優先使用 CopperDepleted 或 copper_depleted 這類名稱。
03

在 MakeSense.ai 中標註

MakeSense.ai 是免費的瀏覽器標註工具。為萊彩製作模型時,應選擇 Object Detection、使用矩形框,並匯出 YOLO 標註。

  1. 1

    開啟 MakeSense.ai 並上傳原始圖片。原圖資料夾要自行保留;匯出的標籤 ZIP 不能取代原圖。

  2. 2

    選擇 Object Detection,不要選擇 Image Recognition。

  3. 3

    依固定順序建立最終類別表,再為每一個目標實例畫矩形框。

  4. 4

    匯出前檢查空圖片、漏標、錯標與過鬆的框。

  5. 5

    將 Rect annotations 匯出為 YOLO 格式 ZIP。

04

整理成一個乾淨的 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 並開始訓練

以下使用這套流程已驗證的版本。持續偵測建議先從 Nano 模型開始;目標較大時用 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 個 epoch 沒有改善就停止。
batch8記憶體不足時先降到 4 或 2;只在實際量測後提高。
devicemps / 0 / cpuApple 晶片使用 mps,NVIDIA 使用 0,任何機器都可使用 cpu。
workers4較保守的跨平台起點。
seed42方便重現與比較資料集及不同訓練版本。
close_mosaic15最後階段關閉 mosaic,讓模型在更自然的圖片上收尾。
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

驗證模型,而不只是看損失曲線

使用最佳 checkpoint,在未見過的截圖上檢查預測,並分別查看每一個類別。整體高分可能掩蓋某個稀有類別很弱。

  • Precision:模型回報的目標中,有多少是真的。
  • Recall:畫面中的真實目標,有多少被找到。
  • mAP50 與 mAP50-95:在不同門檻下綜合衡量定位與分類品質。
  • 混淆矩陣:哪些類別會互相認錯,或被判定為背景。
Ultralytics 訓練損失與驗證指標曲線範例
訓練損失應整體下降,驗證指標逐漸穩定。應使用儲存的 best.pt,而不是直接取最後一個 epoch。
多類別遊戲物件偵測模型的正規化混淆矩陣範例
重點查看對角線與 background 行列;相似狀態類別要另外檢查。
07

匯出萊彩相容的 ONNX 模型

萊彩匯入的是 ONNX,不是訓練用 .pt。應匯出單一靜態 NCHW RGB 輸入、batch 1、float32 或 float16,以及原始 one-to-many 預測,讓萊彩執行信心分數篩選與 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,
)

封裝模型目錄

在萊彩模型庫中選擇的是整個目錄。目錄內必須同時有 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
  }
}

為什麼顯示「已匯入,但有警告」?

若萊彩提示 config.json 遺失或無法讀取,表示你選了單獨的 ONNX 檔,或目錄內容不完整。請匯入完整模型目錄,並確認 id2label 或 label2id 定義所有類別。

08

匯入萊彩並實際測試

開啟萊彩 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 嗎?

不需要。標註新批次、匯出後,與保存的舊資料集離線合併即可。只有需要修正舊標註時,才重新匯入舊資料。

可以只新增一個類別嗎?

可以,但要把新類別附加在舊類別後面,並按類別名稱重新對應新匯出的標籤。接著使用完整資料集重新訓練,確保舊類別仍有樣本。

為什麼已採集的資源仍然會被辨識?

兩種狀態外觀相近,而模型尚未學會區別。增加獨立的已採集狀態類別,或加入確認過的難負樣本,再重新訓練並檢查混淆矩陣。

提高信心分數,可以解決所有誤報嗎?

不行。門檻只能在召回率與精確率之間取捨,不能取代缺失類別、一致的標註規則或容易混淆的負樣本。

官方參考資料

本教學中的命令與相容性選擇,已依目前官方文件與萊彩實際模型契約核對。

繼續在萊彩 Flow 中使用

模型相容後,在 vision.detect 中選擇類別、門檻與畫面區域,再把成功或失敗路徑連接到下一個 Flow 動作。