LaiCai FlowHướng dẫn
YOLO · ONNX · LaiCai Flow

Huấn luyện một mô hình phát hiện đối tượng tùy chỉnh choLaiCai Flow

Hướng dẫn này sẽ đưa bạn từ ảnh chụp màn hình thô đến một mô hình ONNX tương thích với LaiCai. Nó sử dụng một tập dữ liệu trò chơi thực tế về các đối tượng nhỏ làm ví dụ đã được thực hiện, nhưng quy trình tương tự áp dụng cho các điều khiển ứng dụng, sản phẩm, biểu tượng, công cụ và các mục tiêu khác có thể nhìn thấy.

Công thức đã được thử nghiệmYOLO26n · 960 px · 17 lớp · hợp đồng mô hình máy tính để bàn và Android Agent
Cảnh trò chơi chung với các hộp phát hiện xung quanh quặng, một cái cây và một con quái vật
Một mô hình có thể phát hiện nhiều lớp liên quan trong cùng một cảnh, chẳng hạn như tài nguyên, nhân vật và trạng thái đối tượng.
Huấn luyện một mô hình phát hiện đối tượng tùy chỉnh choLaiCai Flow
YouTube

Đường dẫn đầy đủ

  1. bắt giữThu thập các khung hình đa dạng
  2. nhãnVẽ các hộp chặt chẽ
  3. hợp nhấtGiữ ổn định ID lớp học
  4. xe lửaXác thực trên các khung hình chưa được xem
  5. xuất khẩuTạo đầu ra ONNX thô
  6. nhập khẩuThêm config.json

Trước khi bạn bắt đầu

Sử dụng nhận dạng đối tượng khi LaiCai phải tìm ra vị trí của đối tượng trên màn hình. Phân loại hình ảnh chỉ trả lời những gì toàn bộ hình ảnh chứa và không trả về hộp giới hạn.

Liệu quặng, gỗ và quái vật có nên nằm trong cùng một mô hình không?

Thông thường là có khi chúng xuất hiện trong cùng một trò chơi hoặc ứng dụng, sử dụng cùng tỷ lệ chụp màn hình và cần được phát hiện trong cùng một Flow. Chỉ nên tách các mô hình riêng biệt khi các cảnh không liên quan, danh sách lớp trở nên rất lớn hoặc một nhóm cần kích thước đầu vào hoặc mục tiêu hiệu suất khác nhau.

01

Chuẩn bị các ảnh chụp màn hình hữu ích

Thu thập các khung hình từ thiết bị chính xác, độ phân giải, mức phóng to và chất lượng hình ảnh mà LaiCai sẽ thấy. Sự đa dạng quan trọng hơn là lưu trữ nhiều khung hình video liên tiếp trông gần như giống hệt nhau.

  • Bao gồm các vị trí, kích thước, ánh sáng, nền, khung hoạt hình và che khuất một phần khác nhau.
  • Giữ các ví dụ khó: các vật thể nhỏ, vật thể rìa, mờ, cửa sổ bật lên và các mục tiêu không tương tự về mặt trực quan.
  • Thêm một số hình nền nơi không có lớp mục tiêu nào của bạn xuất hiện. Các tệp nhãn của chúng rỗng.
  • Không có mức tối thiểu chung nào. Đối với bài kiểm tra đầu tiên, hãy đặt mục tiêu ít nhất 50 hộp khác nhau cho mỗi lớp; các lớp khó hoặc tương tự thường cần 100-200 hoặc nhiều hơn.
02

Thiết kế danh sách lớp trước khi dán nhãn

Một lớp nên đại diện cho một quyết định trực quan mà Flow cần đưa ra. Giữ tên ngắn gọn, độc đáo và ổn định vì cùng một thứ tự được sử dụng trongYOLOcác nhãn, data.yaml, config.json và trình chọn lớp vision.detect.

Xử lý các trạng thái khác biệt về mặt hình ảnh như các lớp riêng biệt

Nếu một tài nguyên đã được thu thập vẫn giống với tài nguyên có sẵn, hãy dán nhãn cho cả hai trạng thái, ví dụ như Copper và CopperDepleted. Đừng mong đợi ngưỡng độ tin cậy đơn lẻ để tách biệt đáng tin cậy hai trạng thái trực quan thực tế.

So sánh song song giữa một nguồn tài nguyên đồng có sẵn và một nguồn tài nguyên cạn kiệt, mỗi nguồn có một hộp phát hiện riêng biệt
Sử dụng các lớp riêng biệt khi tự động hóa phải phản ứng khác nhau với hai trạng thái.
  • Mỗi trường hợp hiển thị của mỗi lớp mục tiêu phải được gắn nhãn. Một mục tiêu không được gắn nhãn được học làm nền.
  • Sử dụng chính sách hộp tương tự ở mọi nơi: chặt chẽ xung quanh đối tượng có thể nhìn thấy, không có khoảng trống lớn.
  • Ưu tiên các tên như CopperDepleted hoặc copper_depleted khi công cụ dán nhãn thay đổi khoảng trắng.
03

Thẻ trong MakeSense.ai

MakeSense.ai là một công cụ gắn nhãn dựa trên trình duyệt miễn phí. Đối với các mô hình LaiCai, hãy chọn Nhận dạng đối tượng, sử dụng các hộp hình chữ nhật và xuất ra.YOLOghi chú. (Object Detection)

  1. 1

    Mở MakeSense.ai và tải lên các hình ảnh nguồn. Giữ thư mục hình ảnh gốc của bạn; nhãn ZIP đã xuất khẩu sẽ không thay thế nó.

  2. 2

    Chọn Phát hiện đối tượng, không phải Nhận dạng hình ảnh. (Object Detection · Image Recognition)

  3. 3

    Tạo danh sách lớp cuối cùng theo thứ tự cố định, sau đó vẽ một hình chữ nhật xung quanh mỗi đối tượng mục tiêu.

  4. 4

    Xem xét lại các hình ảnh trống, các vật thể bị bỏ lỡ, các lớp sai và các hộp lỏng lẻo trước khi xuất.

  5. 5

    Xuất chú thích Rect dưới dạng gói ZIP trongYOLOcấu trúc. (Rect annotations)

04

Xây dựng một cái sạch sẽYOLOBộ dữ liệu tập hợp

Kết nối mỗi hình ảnh với tệp nhãn .txt có cùng tên. Chia theo phiên ghi hoặc phạm vi thời gian, chứ không phải theo cách ngẫu nhiên phân tán các khung video lân cận trên đường ray và xác thực.

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

Một cách chia nhỏ thực tế là 80% là đào tạo và 20% là xác thực. Bộ xác thực phải chứa các cảnh chưa từng được xem trước.

  • Đối với một lô chú thích mới, bạn không cần phải tải lại các hình ảnh cũ lên MakeSense.ai.
  • Kết hợp các hình ảnh và nhãn mới ngoại tuyến, sau đó định lại ID lớp số bằng tên lớp để thứ tự ban đầu không bị thay đổi.
  • Huấn luyện lại với tập dữ liệu cũ + mới đầy đủ. Việc chỉ huấn luyện trên các hình ảnh mới có thể khiến các lớp cũ hoạt động giống như nền.
Ví dụYOLObiểu đồ tập dữ liệu hiển thị số lượng trường hợp được gắn nhãn theo lớp và kích thước hộp
Kiểm tra số lượng lớp trước khi đào tạo. Một lớp chỉ có một vài ví dụ sẽ tạo ra các chỉ số không ổn định ngay cả khi điểm số tổng thể có vẻ tốt.
05

Cài đặt Ultralytics và huấn luyện

Ví dụ dưới đây sử dụng các phiên bản đã được xác minh với quy trình làm việc này. Mô hình Nano là điểm khởi đầu an toàn nhất cho việc phát hiện liên tục. Sử dụng 640 px cho các đối tượng lớn hơn và 960 px khi các mục tiêu quan trọng nhỏ.

Tạo một môi trường cô lập
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

Các tham số khởi đầu được đề xuất

tham sốGiá trị ban đầuvì sao
modelYOLO26nĐủ nhỏ và đủ nhanh cho lần lặp đầu tiên.
imgsz960 / 640Sử dụng 960 cho mục tiêu nhỏ; sử dụng 640 khi mục tiêu lớn hơn hoặc tốc độ quan trọng hơn.
epochs200Đặt một trần cao rộng rãi trong khi việc dừng sớm có thể hoàn thành sớm hơn.
patience40Dừng lại sau khi xác thực không cải thiện trong 40 epoch.
batch8Giảm xuống còn 4 hoặc 2 nếu bộ nhớ hết; chỉ tăng sau khi đo lường.
devicemps / 0 / cpuSilicon của Apple sử dụng mps, NVIDIA sử dụng 0 và bất kỳ máy nào cũng có thể sử dụng cpu.
workers4Một điểm khởi đầu đa nền tảng bảo thủ.
seed42Làm cho việc so sánh tập dữ liệu và đào tạo dễ dàng hơn để tái tạo.
close_mosaic15Tắt mosaic gần cuối để các epoch cuối cùng thấy nhiều hình ảnh tự nhiên hơn.
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

Xác minh mô hình, không chỉ là đường cong tổn thất

Sử dụng điểm kiểm tra tốt nhất, kiểm tra dự đoán trên các ảnh chụp màn hình chưa từng thấy và xem xét từng lớp riêng biệt. Điểm số toàn cầu cao có thể che giấu một lớp hiếm yếu.

  • Độ chính xác: có bao nhiêu lần phát hiện được báo cáo là chính xác.
  • Nhớ lại: đã tìm thấy bao nhiêu vật thể thực tế.
  • mAP50 và mAP50-95: chất lượng bản địa hóa và phân loại tổng thể trên các ngưỡng.
  • Mô hình nhầm lẫn: các lớp nào bị nhầm lẫn với nhau hoặc với nền.
Ví dụ về các đường cong chỉ số tổn thất và xác thực đào tạo Ultralytics
Mất mát trong quá trình huấn luyện nên giảm theo xu hướng trong khi các chỉ số xác thực ổn định. Sử dụng best.pt đã lưu trữ, chứ không phải epoch cuối cùng một cách tự động.
Ví dụ ma trận nhầm lẫn chuẩn hóa cho một bộ phát hiện đối tượng trò chơi đa lớp
Kiểm tra đường chéo và hàng và cột nền. Các lớp trạng thái tương tự xứng đáng với các kiểm tra riêng của chúng.
07

Xuất một mô hình ONNX tương thích với LaiCai

LaiCai nhập ONNX, không phải tệp training .pt. Xuất một đầu vào NCHW RGB tĩnh, lô 1, float32 hoặc float16, và dự đoán một-đến-nhiều thô để LaiCai có thể áp dụng bộ lọc độ tin cậy và 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,
)

Gói gói thư mục mô hình

Chọn thư mục chính trong thư mục Mô hình của LaiCai. Thư mục phải chứa config.json và tệp ONNX có tên bằng modelFile. Các ID lớp phải bắt đầu từ 0 và phải liên tiếp.

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
  }
}

Được nhập với các cảnh báo?

Nếu LaiCai nói config.json bị thiếu hoặc không thể đọc được, bạn đã chọn một tệp ONNX hoặc một thư mục không hoàn chỉnh. Nhập thư mục mô hình đầy đủ và đảm bảo id2label hoặc label2id định nghĩa mọi lớp.

08

Nhập khẩu và thử nghiệm tại LaiCai

MởLaiCai Flow, truy cập Thư viện mô hình, nhập thư mục đã chuẩn bị và xác nhận rằng mô hình đã được đánh dấu Tương thích trước khi sử dụng nó trong vision.detect.

  • Chọn mô hình trong Thư viện mô hình và xác nhận đầu vào, đầu ra, định dạng đầu ra và danh sách lớp của nó.
  • Sử dụng Trình kiểm tra Màn hình hiện tại với một lớp và ngưỡng bắt đầu hợp lý như 0,5.
  • Kiểm tra cả khung tích cực và khung âm tính hoặc gây nhầm lẫn. Một cuộc gọi suy luận thành công không giống như một đối tượng được phát hiện.
  • Sau khi xác thực trên máy tính để bàn, hãy thử mô hình tương tự riêng biệt trên Android Agent nếu Flow sẽ chạy trên điện thoại.
V2+

Làm thế nào để cải thiện phiên bản tiếp theo

Lưu lại các hình ảnh gốc,YOLOcác nhãn, danh sách lớp, data.yaml, lệnh huấn luyện và best.pt cùng nhau. Các tệp này là nguồn tập dữ liệu có thể tái sử dụng của bạn; chỉ tệp ONNX được xuất khẩu thôi thì không đủ để huấn luyện lại một cách đáng tin cậy.

  1. Thu thập các trường hợp dương tính giả, các vật thể bị bỏ lỡ, các môi trường mới và các trạng thái hình ảnh mới từ các lần chạy thực tế.
  2. Chỉ dán nhãn cho các hình ảnh mới trong MakeSense.ai bằng cách sử dụng chính sách lớp cuối cùng.
  3. Kết hợp dữ liệu cũ và mới, giữ lại ID lớp theo tên, sau đó chia nhỏ lại theo phiên.
  4. Bắt đầu chạy mới từ best.pt trước đó khi ma trận lớp tương thích và xác thực các trường hợp cũ và mới.
Không bao giờ để lại các lớp cũ có thể nhìn thấy không được dán nhãn trong các hình ảnh mới. Chúng sẽ được xử lý như nền trong quá trình đào tạo.

Những câu hỏi phổ biến

Tôi có cần phải nhập lại tất cả các hình ảnh cũ vào MakeSense.ai không?

Không. Ghi nhãn cho lô hàng mới, xuất nó và hợp nhất nó với tập dữ liệu cũ đã lưu offline. Chỉ nhập lại dữ liệu cũ khi bạn cần chỉnh sửa các chú thích cũ.

Tôi có thể chỉ cần thêm một lớp học mới không?

Vâng, nhưng hãy thêm nó sau các lớp hiện có và định lại tên xuất khẩu mới theo tên lớp. Sau đó, huấn luyện lại trên tập dữ liệu đầy đủ để các lớp cũ vẫn được biểu diễn.

Tại sao một mô hình vẫn phát hiện được một tài nguyên đã được thu thập?

Hai trạng thái về mặt trực quan tương tự nhau và mô hình chưa học được sự khác biệt. Thêm một lớp trạng thái cạn kiệt riêng biệt hoặc các ví dụ tiêu cực cứng đã được xác minh, sau đó huấn luyện lại và xem xét ma trận nhầm lẫn.

Tôi có nên nâng ngưỡng độ tin cậy để sửa chữa mọi trường hợp dương tính giả không?

Không. Một ngưỡng có thể đổi lấy việc gọi lại giao dịch để có độ chính xác, nhưng nó không thể thay thế các lớp thiếu, nhãn không nhất quán hoặc các ví dụ tiêu cực gây nhầm lẫn.

Tham khảo chính thức

Các lệnh và lựa chọn tương thích trong hướng dẫn này đã được kiểm tra so với tài liệu chính thức hiện tại và hợp đồng mô hình LaiCai.

Tiếp tục trongLaiCai Flow

Sau khi mô hình tương thích, hãy sử dụng vision.detect để chọn lớp, ngưỡng và vùng màn hình, sau đó kết nối đường dẫn thành công hoặc thất bại với hành động Flow tiếp theo.