LaiCai Flowguia
YOLO · ONNX · LaiCai Flow

Treinar um modelo personalizado de detecção de objetos paraLaiCai Flow

Este guia leva você de imagens cruas para um modelo ONNX compatível com o LaiCai. Ele usa um verdadeiro conjunto de dados de jogos de pequenos objetos como o exemplo trabalhado, mas o mesmo processo se aplica a controles de aplicativos, produtos, ícones, ferramentas e outros alvos visíveis.

Receita testadaYOLO26n · 960 px · 17 classes · desktop e Android Agent modelo contrato
Cena de jogo genérica com caixas de detecção em torno de minério, uma árvore e um monstro
Um modelo pode detectar múltiplas classes relacionadas na mesma cena, como recursos, caracteres e estados de objetos.
Treinar um modelo personalizado de detecção de objetos paraLaiCai Flow
YouTube

O caminho completo

  1. CapturarColetar quadros variados
  2. LegendaDesenhar as caixas apertadas
  3. JuntarManter os IDs da classe estáveis
  4. ComboioValidar em quadros invisíveis
  5. ExportaçãoCriar saída ONNX em bruto
  6. ImportarAdicionar config.json

Antes de começar

Use a detecção de objetos quando LaiCai deve encontrar onde um objeto está na tela. A classificação das imagens só responde ao que uma imagem inteira contém e não devolve uma caixa delimitadora.

Deve o minério, a madeira e os monstros estar em um modelo?

Normalmente sim quando eles aparecem no mesmo jogo ou aplicativo, use a mesma escala de captura de tela, e precisa ser detectado no mesmo fluxo. Modelos separados apenas quando as cenas não estão relacionadas, a lista de classes torna-se muito grande, ou um grupo precisa de um tamanho de entrada diferente ou alvo de desempenho.

01

Preparar imagens úteis

Colete quadros do dispositivo exato, resolução, nível de zoom e qualidade visual que a LaiCai verá. Diversidade importa mais do que salvar muitos quadros de vídeo consecutivos que parecem quase idênticos.

  • Inclua diferentes posições, tamanhos, iluminação, fundos, quadros de animação e oclusão parcial.
  • Mantenha exemplos difíceis: pequenos objetos, objetos de borda, desfoque, popups e não alvos visualmente semelhantes.
  • Adicionar algumas imagens de fundo onde nenhuma das suas classes alvo aparecer. Seus arquivos de etiqueta estão vazios.
  • Não há um mínimo universal. Para um primeiro teste, procure pelo menos 50 caixas variadas por classe; classes difíceis ou semelhantes geralmente precisam de 100–200 ou mais.
02

Desenhar a lista de classes antes de rotular

Uma classe deve representar uma decisão visual que o Flow precisa fazer. Mantenha os nomes curtos, únicos e estáveis porque a mesma ordem é usada emYOLOetiquetas, data.yaml, config.json e o seletor de classe vision.detecte.

Tratar estados visualmente diferentes como classes separadas

Se um recurso coletado ainda se assemelha ao recurso disponível, rotule ambos os estados, por exemplo Copper e CopperDepleted. Não espere um limiar de confiança sozinho para separar de forma confiável dois estados visuais reais.

Comparação lado a lado de um recurso de cobre disponível e um recurso esgotado, cada um com uma caixa de detecção separada
Use classes separadas quando a automação deve reagir de forma diferente aos dois estados.
  • Cada instância visível de cada classe alvo deve ser rotulada. Um alvo não marcado é aprendido como fundo.
  • Use a mesma política de caixa em todos os lugares: apertado em torno do objeto visível, sem grandes margens.
  • Preferir nomes como CopperDepleted ou copper depleted quando uma ferramenta de rotulagem muda de espaços.
03

Rótulo em MakeSense.ai

MakeSense.ai é uma ferramenta de rotulagem gratuita baseada em navegador. Para modelos LaiCai, escolha Detecção de Objetos, use caixas retangulares e exporteYOLOAnotações. (Object Detection)

  1. 1

    Abra MakeSense.ai e faça upload das imagens de origem. Mantenha sua pasta de imagem original; a etiqueta exportada ZIP não a substitui.

  2. 2

    Escolha a Detecção de Objectos, não o Reconhecimento de Imagens. (Object Detection · Image Recognition)

  3. 3

    Crie a lista de classes final em uma ordem fixa, em seguida, desenhe um retângulo em torno de cada instância alvo.

  4. 4

    Reveja imagens vazias, objetos perdidos, classes erradas e caixas soltas antes de exportar.

  5. 5

    Exportar anotações Rect como um pacote ZIPYOLOformato. (Rect annotations)

04

Construir um limpoYOLOconjunto de dados

Emparelhe cada imagem com um arquivo de etiqueta .txt com o mesmo nome. Dividir por gravação de sessão ou intervalo de tempo, não espalhando aleatoriamente quadros de vídeo adjacentes através do trem e validação.

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

Uma divisão de partida prática é 80% trem e 20% validação. O conjunto de validação deve conter cenas genuinamente invisíveis.

  • Para um novo lote de anotação, você não precisa carregar as imagens antigas para MakeSense.ai novamente.
  • Mesclar as novas imagens e rótulos offline, em seguida, remape IDs de classe numérica pelo nome da classe para que a ordem original permaneça inalterada.
  • Retreine com o conjunto de dados antigo completo + novo. O treinamento apenas nas novas imagens pode fazer com que as classes antigas se comportem como fundo.
ExemploYOLOgráfico do conjunto de dados que mostra o número de instâncias marcadas por tamanho de classe e caixa
Verifique a contagem das aulas antes do treino. Uma classe com apenas alguns exemplos produz métricas instáveis, mesmo que a pontuação global pareça boa.
05

Instalar Ultralytics e trem

O exemplo abaixo usa versões verificadas com este fluxo de trabalho. Um modelo Nano é o ponto de partida mais seguro para detecção contínua. Use 640 px para objetos maiores e 960 px quando alvos importantes são pequenos.

Criar um ambiente isolado
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

Parâmetros de partida recomendados

ParâmetroValor inicialPorquê?
modelYOLO26nPequeno e rápido o suficiente para a primeira iteração.
imgsz960 / 640Use 960 para alvos pequenos; use 640 quando os alvos são maiores ou a velocidade importa mais.
epochs200Define um teto generoso enquanto a parada precoce pode terminar mais cedo.
patience40Paradas após a validação não melhorou para 40 épocas.
batch8Reduza para 4 ou 2 se a memória acabar; aumente apenas após a medição.
devicemps / 0 / cpuO silicone da Apple usa mps, NVIDIA usa 0 e qualquer máquina pode usar cpu.
workers4Um ponto de partida conservador entre plataformas.
seed42Torna as comparações de dados e treinamento mais fáceis de reproduzir.
close_mosaic15Desabilita mosaico perto do fim para que as épocas finais vejam mais imagens naturais.
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

Validar o modelo, não apenas a curva de perda

Use o melhor ponto de controle, inspecione previsões em capturas de tela invisíveis e reveja cada classe separadamente. Uma pontuação global elevada pode esconder uma classe rara fraca.

  • Precisão: quantas detecções relatadas estão corretas.
  • Lembre-se: quantos objetos reais foram encontrados.
  • mAP50 e mAP50-95: localização global e qualidade de classificação entre limiares.
  • Matriz de confusão: quais classes são confundidas entre si ou para fundo.
Exemplo de curvas métricas de perda e validação de treinamento ultralítico (Ultralytics)
A perda de treinamento deve diminuir enquanto as métricas de validação se estabilizam. Use o best.pt salvo, não automaticamente a época final.
Exemplo de matriz de confusão normalizada para um detector multi-classe de objetos de jogo
Inspecione a diagonal e a linha de fundo e coluna. Aulas de Estado semelhantes merecem os seus próprios cheques.
07

Exportar um modelo ONNX compatível com o LaiCai

LaiCai importa ONNX, não o arquivo .pt de treinamento. Exportar uma entrada estática NCHW RGB, lote 1, float32 ou float16, e previsões brutas de uma para muitas para que LaiCai possa aplicar filtragem de confiança e 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,
)

Empacotar o diretório do modelo

Selecione o diretório em si na biblioteca Modelo de LaiCai. O diretório deve conter config.json e o arquivo ONNX nomeado pelo modelFile. Os IDs da classe devem começar em 0 e permanecer contíguos.

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

Importado com avisos?

Se LaiCai diz config.json está faltando ou ilegível, você selecionou um arquivo ONNX ou uma pasta incompleta. Importar o diretório completo do modelo e certificar-se de id2label ou label2id define cada classe.

08

Importação e teste em LaiCai

AbrirLaiCai Flow, vá para Model library, importe o diretório preparado, e confirme que o modelo está marcado Compatível antes de usá-lo em visão. detectar. (vision.detect)

  • Selecione o modelo na biblioteca Model e confirme sua entrada, saída, formato de saída e lista de classes.
  • Usar tela de teste atual com uma classe e um limiar de início razoável, como 0.5.
  • Teste ambos os quadros positivos e negativos ou confusos. Uma chamada de inferência bem sucedida não é a mesma que um objeto detectado.
  • Após a validação do desktop, teste o mesmo modelo separadamente no Android Agent se o Flow for executado no telefone.
V2+

Como melhorar a próxima versão

Gravar as imagens originais,YOLOetiquetas, lista de classes, dados. yaml, comando de treino, e best.pt juntos. Estes arquivos são sua fonte de conjunto de dados reutilizável; o arquivo ONNX exportado sozinho não é suficiente para reciclagem confiável. (data.yaml)

  1. Recolha falsos positivos, objetos perdidos, novos ambientes e novos estados visuais de execuções reais.
  2. Rotule apenas as novas imagens em MakeSense.ai usando a política de classe final.
  3. Mesclar dados antigos e novos, preservando IDs de classe pelo nome e, em seguida, dividido por sessão novamente.
  4. Inicie a nova execução do best.pt anterior quando o mapeamento de classes for compatível e valide casos antigos e novos.
Nunca deixe as classes antigas visíveis não marcadas nas novas imagens. Serão tratados como antecedentes durante o treino.

Questões comuns

Preciso reimportar todas as imagens antigas para MakeSense.ai?

Não. Rotular o novo lote, exportá-lo e fundi-lo com o conjunto de dados antigo gravado offline. Reimportar dados antigos apenas quando você precisa corrigir anotações antigas.

Posso simplesmente adicionar uma nova classe?

Sim, mas anexá-lo após as classes existentes e remapear a nova exportação pelo nome da classe. Em seguida, retreine no conjunto de dados completo para que as classes antigas permaneçam representadas.

Por que um modelo ainda detecta um recurso coletado?

Os dois estados são visualmente semelhantes e o modelo não aprendeu a distinção. Adicione uma classe de estado empobrecido separado ou exemplos hard-negativos verificados, então retreine e reveja a matriz de confusão.

Devo aumentar o limite de confiança para corrigir todos os falsos positivos?

Não. Um limiar pode trocar memória por precisão, mas não pode substituir classes em falta, rótulos inconsistentes ou exemplos negativos confusos.

Referências oficiais

Os comandos e as escolhas de compatibilidade neste guia foram verificados com base na documentação oficial atual e no contrato do modelo LaiCai.

Continuar emLaiCai Flow

Após o modelo ser compatível, use a visão. detectar para escolher uma classe, limiar e região de tela, em seguida, conectar o caminho de sucesso ou falha para a próxima ação Flow. (vision.detect)