LaiCai Flowprzewodnik
YOLO · ONNX · LaiCai Flow

Trenuj niestandardowy model wykrywania obiektówLaiCai Flow

Ten przewodnik zabierze Cię z surowych zrzutów ekranu do modelu ONNX kompatybilnego z LaiCai. Używa prawdziwego zbioru danych o małych obiektach, ale ten sam proces stosuje się do kontroli aplikacji, produktów, ikon, narzędzi i innych widocznych celów.

Przepis testowanyYOLO26n · 960 px · 17 klas · Desktop i Android Agent model umowy
Generyczna scena gry z wykrywaniem pól wokół rudy, drzewa i potwora
Jeden model może wykryć wiele powiązanych klas w tej samej scenie, takich jak zasoby, znaki i stany obiektu.
Trenuj niestandardowy model wykrywania obiektówLaiCai Flow
YouTube

Pełna ścieżka

  1. UchwytZbierz zróżnicowane ramy
  2. EtykietaRysuj mocno pola
  3. PołączenieZachowaj stabilne identyfikatory klasy
  4. PociągSprawdzić na niewidocznych ramach
  5. EksportUtwórz surowe wyjście ONNX
  6. ImportDodaj config.json

Zanim zaczniesz

Użyj detekcji obiektu, gdy LaiCai musi znaleźć obiekt na ekranie. Klasyfikacja obrazka odpowiada tylko na to, co zawiera cały obraz i nie zwraca bounding box.

Czy ruda, drewno i potwory powinny być w jednym modelu?

Zazwyczaj tak, gdy pojawiają się w tej samej grze lub aplikacji, używać tej samej skali zrzutu ekranu, i muszą być wykryte w tym samym Flow. Oddzielne modele tylko wtedy, gdy sceny nie są powiązane, lista klas staje się bardzo duża, lub jedna grupa potrzebuje innego rozmiaru wejścia lub celu wydajności.

01

Przygotowanie przydatnych zrzutów ekranu

Zbierz ramki z dokładnego urządzenia, rozdzielczości, poziomu zoom i jakości wizualnej, które LaiCai zobaczy. Różnorodność ma więcej znaczenia niż ratowanie wielu kolejnych ram wideo, które wyglądają prawie identycznie.

  • Obejmują różne pozycje, rozmiary, oświetlenie, tło, ramy animacji i częściową okluzję.
  • Zachować trudne przykłady: małe obiekty, obiekty krawędziowe, rozmazane, wyskakujące i wizualnie podobne nie-cele.
  • Dodaj kilka obrazków w tle, gdzie nie pojawiają się żadne z klas docelowych. Ich pliki etykiet są puste.
  • Nie ma uniwersalnego minimum. Do pierwszego badania należy dążyć do co najmniej 50 różnych pól na klasę; klasy trudne lub podobne zazwyczaj wymagają 100- 200 lub więcej.
02

Zaprojektuj listę klas przed oznakowaniem

Klasa powinna reprezentować jedną wizualną decyzję, którą Flow musi podjąć. Zachowaj nazwy krótkie, unikatowe i stabilne, ponieważ ta sama kolejność jest stosowana wYOLOetykiety, data.yaml, config.json i vision.detect selector klasy.

Traktować wizualnie różne stany jako oddzielne klasy

Jeśli zbierane zasoby nadal przypominają dostępne zasoby, należy oznaczyć oba stany, na przykład Copper i CopperDepleted. Nie oczekujcie, że sam próg ufności będzie niezawodnie oddzielał dwa rzeczywiste stany widzenia.

Porównanie boczne dostępnego zasobu miedzi i zasobu zubożonego, z osobnym polu detekcji
Użyj oddzielnych klas, gdy automatyzacja musi reagować inaczej do obu stanów.
  • Każdy widoczny punkt każdej klasy docelowej musi być oznaczony. Nieoznaczony cel jest uczony jako tło.
  • Użyj tej samej polityki pola wszędzie: ciasno wokół widzialnego obiektu, bez dużych marginesów.
  • Preferowane nazwy, takie jak CopperDepleted lub miedź _ zubożony, gdy narzędzie etykietujące zmienia spacje.
03

Etykieta w MakeSense.ai

MakeSense.ai to darmowe narzędzie do etykiet oparte na przeglądarce. Dla modeli LaiCai wybierz Wykrywanie obiektów, użyj prostokątnych pól i eksportuYOLOadnotacje. (Object Detection)

  1. 1

    Otwórz MakeSense.ai i przesłać zdjęcia źródłowe. Zachowaj oryginalny folder obrazkowy; eksportowana etykieta ZIP go nie zastępuje.

  2. 2

    Wybierz wykrywanie obiektów, nie rozpoznawanie obrazów. (Object Detection · Image Recognition)

  3. 3

    Utwórz ostateczną listę klas w stałej kolejności, a następnie narysuj prostokąt wokół każdej instancji docelowej.

  4. 4

    Przejrzyj puste obrazy, pominięte obiekty, złe klasy i luźne pola przed wywozem.

  5. 5

    Eksportuj adnotacje Rect jako pakiet ZIP wYOLOformat. (Rect annotations)

04

Zbuduj jeden czystyYOLOzbiór danych

Powiąż każdy obraz z pliku etykiet .txt o tej samej nazwie. Podział przez nagrywanie sesji lub zakresu czasowego, a nie przez losowo rozrzucanie sąsiadujących ram wideo przez pociąg i walidację.

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

Praktyczny rozłam początkowy to 80% pociągów i 20% walidacji. Zestaw walidacji musi zawierać rzeczywiście niewidoczne sceny.

  • Dla nowej partii adnotacji, nie trzeba wysyłać starych obrazów do MakeSense.ai ponownie.
  • Połącz nowe obrazy i etykiety offline, a następnie remap identyfikatory klasy numerycznej według nazwy klasy tak oryginalny porządek pozostaje bez zmian.
  • Retrain z kompletnym starym + nowy zestaw danych. Trening tylko na nowych zdjęciach może sprawić, że stare klasy zachowują się jak tło.
PrzykładYOLOwykres zbioru danych pokazujący liczbę oznaczonych instancji dla każdej klasy i wielkości pól
Sprawdzanie klasy liczy się przed treningiem. Klasa z zaledwie kilkoma przykładami wytwarza niestabilne wskaźniki nawet jeśli ogólny wynik wygląda dobrze.
05

Instalacja Ultralytics i pociągu

Poniższy przykład wykorzystuje wersje zweryfikowane przy pomocy tego przepływu pracy. Model Nano jest najbezpieczniejszym punktem wyjściowym dla ciągłego wykrywania. Użyj 640 px dla większych obiektów i 960 px, gdy ważne cele są małe.

Tworzenie izolowanego środowiska
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

Zalecane parametry startowe

ParametrWartość wyjściowaDlaczego?
modelYOLO26nWystarczająco mały i szybki jak na pierwszą iterację.
imgsz960 / 640Użyj 960 dla małych celów; użyj 640, gdy cele są większe lub prędkość ma większe znaczenie.
epochs200Ustawia hojny sufit, podczas gdy wcześniejsze zatrzymanie może skończyć się wcześniej.
patience40Zatrzymanie po walidacji nie poprawiło się przez 40 epok.
batch8Zmniejszyć do 4 lub 2, jeśli skończy się pamięć; zwiększyć tylko po zmierzeniu.
devicemps / 0 / cpuKrzem jabłkowy używa pomp, NVIDIA używa 0, a każda maszyna może używać cpu.
workers4Konserwatywny punkt wyjścia.
seed42Ułatwia odtwarzanie zbioru danych i porównań treningowych.
close_mosaic15Wyłącza mozaikę przy końcu, więc ostateczne epoki widzą więcej naturalnych obrazów.
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

Sprawdzić model, nie tylko krzywą strat

Użyj najlepszego punktu kontrolnego, sprawdź przewidywania na niewidocznych zrzutach ekranu i przejrzyj każdą klasę oddzielnie. Wysoki wynik globalny może ukryć słabe rzadkie klasy.

  • Precyzja: ile zgłoszonych wykryć są poprawne.
  • Przypomnij: ile prawdziwych obiektów znaleziono.
  • maP50 i maP50- 95: ogólna lokalizacja i jakość klasyfikacji w różnych progach.
  • Matryca splątania: które klasy są mylone ze sobą lub z tła.
Przykład Utrata treningu Ultralytics i krzywe metryczne walidacji
Utrata treningu powinna ulegać zmniejszeniu podczas stabilizacji wskaźników walidacji. Użyj zapisanego best.pt, a nie automatycznie ostatniej epoki.
Przykład znormalizowanej matrycy dezorientacji dla wieloklasowego detektora obiektów game-
Sprawdź przekątną oraz wiersz tła i kolumnę. Klasy stanowe zasługują na własne czeki.
07

Eksport modelu ONNX kompatybilnego z LaiCai

LaiCai importuje ONNX, a nie plik szkoleniowy .pt. Eksportuj jedno statyczne wejście NCHW RGB, partię 1, float32 lub float16 oraz surowe przewidywania jednogłośne, tak aby LaiCai mógł zastosować filtrowanie zaufania i 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,
)

Opakowanie katalogu modelu

Wybierz sam katalog w bibliotece modelu LaiCai. Katalog musi zawierać config.json i plik ONNX nazwany przez modelFile. Identyfikatory klasy muszą zaczynać się od 0 i pozostać spójne.

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

Przywożone z ostrzeżeniami?

Jeśli LaiCai twierdzi, że config.json zaginął lub nie jest do odczytu, wybrałeś plik ONNX lub niekompletny folder. Importuj kompletny katalog modelu i upewnij się, że id2label lub label2id definiuje każdą klasę.

08

Przywóz i badanie w LaiCai

OtwórzLaiCai Flow, przejść do biblioteki Model, zaimportować przygotowany katalog, i potwierdzić, że model jest oznaczony kompatybilny przed użyciem go w wizji. wykryć. (vision.detect)

  • Wybierz model w bibliotece modelu i potwierdź jego wejście, wyjście, format wyjścia i listę klas.
  • Użyj testowego bieżącego ekranu z klasą i rozsądnym progiem startowym, np. 0.5.
  • Sprawdzić zarówno pozytywne i negatywne lub mylące ramy. Udane wywołanie nie jest tym samym co wykryty obiekt.
  • Po walidacji pulpitu, testować ten sam model oddzielnie na Android Agent, jeśli Flow będzie działać na telefonie.
V2+

Jak ulepszyć następną wersję

Zapisz oryginalne obrazy,YOLOetykiety, lista klas, dane. Yaml, dowództwo treningowe i best.pt razem. Te pliki są Twoim źródłem danych wielokrotnego użytku; sam eksportowany plik ONNX nie wystarczy do niezawodnego przekwalifikowania. (data.yaml)

  1. Zbieraj fałszywe pozytywy, pominięte obiekty, nowe środowiska i nowe stany wizualne z rzeczywistych biegów.
  2. Etykieta tylko nowe obrazy w MakeSense.ai za pomocą końcowej polityki klasy.
  3. Łączenie starych i nowych danych, zachowanie identyfikatorów klasy według nazwy, a następnie podział według sesji ponownie.
  4. Uruchom nowy bieg z poprzedniego best.pt, gdy mapowanie klasowe jest kompatybilne, a także potwierdzaj stare i nowe przypadki.
Nigdy nie pozostawiaj widocznych starych klas nieoznaczonych w nowych obrazach. Będą one traktowane jako tło podczas szkolenia.

Wspólne pytania

Czy muszę importować wszystkie stare obrazy do MakeSense.ai?

Nie. Napisz nową partię, wyeksportuj i połącz ją z zapisanym starym zbiorem danych. Ponowne importowanie starych danych tylko wtedy, gdy trzeba skorygować stare adnotacje.

Mogę dodać jedną nową klasę?

Tak, ale dołącz go po istniejących klasach i remap nowy eksport według nazwy klasy. Następnie przetrenuj na pełnym zbiorze danych, aby stare klasy pozostały reprezentowane.

Dlaczego model nadal wykrywa zgromadzone zasoby?

Oba stany są podobne wizualnie i model nie nauczył się rozróżnienia. Dodaj oddzielną klasę stanu wyczerpanego lub zweryfikowane trudne-negatywne przykłady, a następnie przeszkolenie i przegląd matrycy dezorientacji.

Czy powinienem podnieść próg zaufania, aby naprawić każdy fałszywy wynik pozytywny?

Nie. Próg może handlować pamięcią o dokładności, ale nie może zastąpić brakujących klas, niespójnych etykiet lub mylących negatywnych przykładów.

Dokumenty urzędowe

Polecenia i opcje kompatybilności zawarte w niniejszym przewodniku zostały sprawdzone pod kątem aktualnej oficjalnej dokumentacji i umowy modelu LaiCai.

KontynuujLaiCai Flow

Po kompatybilności modelu, użyj wizji. wykryj, aby wybrać region klasy, progu i ekranu, a następnie podłącz ścieżkę sukcesu lub porażki do następnego działania Flow. (vision.detect)