Esta seção por enquanto está disponível só em inglês.
Documentação principal
Tarefas experimentais

O que vem depois

Os caminhos de detecção e segmentação são o núcleo validado. Esta página documenta as novas cabeças de tarefas e técnicas de treinamento que estamos desenvolvendo sobre eles: classificação, caixas orientadas, pose e fine-tuning eficiente em parâmetros.

Visão geral

O LibreYOLO é um framework multitarefa: a mesma família de modelos pode usar cabeças diferentes. Além dos caminhos validados de detecção e segmentação, várias tarefas novas estão chegando às duas famílias carro-chefe, YOLO9 e RF-DETR. Todas elas se conectam à mesma fábrica LibreYOLO(...) e ao mesmo contêiner Results, então são pequenas adições para quem já conhece a API principal.

  • Classificação para YOLO9 e RF-DETR. Labels da imagem inteira com probabilidades top-1 / top-5.
  • Caixas orientadas (OBB) para YOLO9 e RF-DETR. Bounding boxes rotacionados para imagens aéreas e de documentos.
  • Keypoints / pose para YOLO9 e RF-DETR. Keypoints COCO-17 de pessoas.
  • Detecção de objetos pequenos com YOLO9-P2, uma variante do YOLOv9 com uma escala de stride 4 para objetos de 4-16 px em imagens aéreas e de drones, incluindo um checkpoint de prévia de pesquisa no VisDrone.
  • Fine-tuning com LoRA / DoRA para RF-DETR. Adapte o backbone transformer usando uma fração da memória.

Leia isto primeiro

Tudo nesta página é experimental, e parte ainda está em desenvolvimento em branches de recursos. As APIs, os padrões e os formatos de labels podem mudar antes de serem promovidos ao núcleo validado. A seção Estabilidade acompanha exatamente o estado de cada recurso.

Seleção de uma tarefa

Todas as famílias usam detecção por padrão. Você seleciona outra tarefa de uma entre três formas, resolvidas nesta ordem de precedência:

PrioridadeMecanismoExemplo
1Argumento explícitotask="obb"
2Metadados do checkpointtarefa registrada dentro de um .pt treinado
3Sufixo do nome do arquivo-cls, -obb, -pose
4Padrão da famíliadetect

Como a fábrica pública LibreYOLO(...) espera um arquivo de pesos real, a forma mais limpa de iniciar uma dessas tarefas do zero é construir a classe da família diretamente e passar task=. Os checkpoints treinados voltam a ser carregados pela fábrica unificada, que detecta a tarefa automaticamente.

python
1from libreyolo import LibreYOLO, LibreYOLO9, LibreRFDETR
2
3# Start a task from scratch via the family class
4m = LibreYOLO9(None, size="t", task="classify", nb_classes=10)
5
6# Load a trained checkpoint via the unified factory (task auto-detected)
7m = LibreYOLO("LibreYOLO9t-obb.pt")

Classificação de Imagens

YOLO9: t, s, m, cRF-DETR: n, s, m, l

A classificação fornece uma única label para a imagem inteira. O YOLO9 mantém seu backbone e adiciona uma cabeça de classificação leve. O RF-DETR reutiliza seu encoder DINOv2 e adiciona uma cabeça linear com pooling. Ambos rodam em 224 por 224.

Inferência e o resultado Probs

A predição retorna um objeto Results cujo campo probs contém um softmax sobre as classes.

python
1from libreyolo import LibreYOLO
2
3model = LibreYOLO("LibreYOLO9t-cls.pt")
4r = model.predict("cat.jpg")
5
6print(r.probs.top1) # class id of the argmax
7print(r.probs.top1conf) # its probability
8print(r.probs.top5) # [id, id, id, id, id]
9print(model.names[r.probs.top1]) # human-readable label
CampoTipoSignificado
probs.top1intID da classe argmax.
probs.top5list[int]IDs das classes top-5, em ordem decrescente.
probs.top1conffloatProbabilidade da classe top-1.
probs.top5conftensorProbabilidades das classes top-5.
probs.datatensorVetor softmax completo.

Formato do dataset e treinamento

A classificação usa uma estrutura ImageFolder, não um YAML. Os nomes das classes são os nomes ordenados das subpastas, fixados de acordo com a divisão de treino.

dataset/
1dataset/
2 train/
3 cat/ img001.jpg ...
4 dog/ img104.jpg ...
5 val/
6 cat/ ...
7 dog/ ...

O argumento data= aceita uma pasta, uma URL .zip ou um nome conhecido para download automático (imagenette160 e imagenet10). A cabeça é reconstruída automaticamente para corresponder ao número de classes do dataset.

python
1from libreyolo import LibreYOLO9
2
3model = LibreYOLO9(None, size="t", task="classify", nb_classes=10)
4result = model.train(
5 data="imagenette160", # folder, .zip URL, or known name
6 epochs=10, batch=64, imgsz=224,
7 optimizer="adamw", lr0=1e-3,
8)
9# Validation reports metrics/accuracy_top1 and metrics/accuracy_top5

Execuções de referência

Verificações rápidas de sanidade feitas durante o desenvolvimento: YOLO9-t atingiu top-1 0.79 / top-5 0.975 no imagenette160 (10 épocas), e RF-DETR-n atingiu top-1 0.69 / top-5 0.96 (6 épocas). O RF-DETR se beneficia do acesso à internet na primeira execução para buscar seu backbone DINOv2. Offline, ele usa inicialização aleatória como fallback.

Caixas Orientadas (OBB)

YOLO9: t, s, m, cRF-DETR: n, s, m, l

As caixas orientadas têm um ângulo de rotação, necessário em imagens aéreas, documentos e cenas densamente ocupadas. O YOLO9 adiciona uma ramificação de ângulo à sua cabeça de detecção. O RF-DETR adiciona um embedding de ângulo aprendível ao seu decoder.

Inferência e o resultado OBB

Results expõe um campo obb. Os ângulos estão em radianos.

python
1from libreyolo import LibreYOLO
2
3model = LibreYOLO("LibreYOLO9t-obb.pt")
4r = model.predict("aerial.jpg")
5
6for i in range(len(r.obb.cls)):
7 cx, cy, w, h, angle = r.obb.xywhr[i] # angle in radians
8 corners = r.obb.xyxyxyxy[i] # 4 (x, y) corner points
9 conf, cls = r.obb.conf[i], r.obb.cls[i]
CampoFormatoSignificado
obb.xywhrN x 5[cx, cy, w, h, angle], ângulo em radianos.
obb.xyxyxyxyN x 4 x 2Quatro pontos de canto por bounding box.
obb.confNConfiança por bounding box.
obb.clsNID da classe por bounding box.

Formato do dataset e treinamento

OBB usa um YAML de dados padrão no estilo de detecção, mas as labels são arquivos de texto YOLO-OBB com exatamente nove campos por linha: um ID de classe seguido por quatro pontos de canto normalizados. O ângulo é derivado dos cantos, não armazenado.

labels/aerial_001.txt
1# class_id x1 y1 x2 y2 x3 y3 x4 y4 (all normalized to [0, 1])
20 0.51 0.32 0.66 0.38 0.62 0.55 0.47 0.49
32 0.10 0.71 0.18 0.69 0.20 0.80 0.12 0.82

Um checkpoint simples de detecção não pode ser carregado diretamente em um modelo OBB. A passagem de detecção para OBB só é permitida como warm-start de treinamento: passe pretrained=True (YOLO9) ou a flag explícita de transferência no RF-DETR. Mosaic e mixup ficam desativados para OBB até a chegada de um data augmentation que considere os cantos, e a inferência por blocos (tiles) não é compatível.

python
1from libreyolo import LibreYOLO9
2
3model = LibreYOLO9(None, size="t", task="obb")
4# Warm-start the backbone from a same-family detect checkpoint
5result = model.train(data="dota8.yaml", pretrained=True, epochs=100, imgsz=640)
6
7# CLI equivalent
8# libreyolo train model=LibreYOLO9t.pt data=dota8.yaml --task obb

A validação usa AP com IoU rotacionada, informada como mAP50 e mAP50-95 no grupo de métricas OBB.

Keypoints / Estimativa de Pose

YOLO9 + RF-DETR: landing soonYOLO-NAS, EdgeCrafter: available

A estimativa de pose prediz keypoints por instância detectada. A estrutura padrão é de keypoints de pessoas COCO-17. Na primeira versão, pose com YOLO9 e RF-DETR terá uma única classe, apenas para pessoas. Pose com YOLO-NAS e EdgeCrafter já está disponível no código.

Inferência e o resultado Keypoints

Results expõe um campo keypoints com formato (N, K, 3), em que o último canal representa visibilidade ou confiança, nas coordenadas de pixels da imagem original.

python
1from libreyolo import LibreYOLO
2
3model = LibreYOLO("LibreYOLO9t-pose.pt")
4r = model.predict("athletes.jpg")
5
6kp = r.keypoints
7print(kp.xy.shape) # (N, 17, 2) pixel coordinates
8print(kp.conf) # (N, 17) per-keypoint visibility / confidence
9print(kp.xyn) # normalized coordinates
10print(r.boxes.xyxy) # person boxes still come along
CampoFormatoSignificado
keypoints.xyN x K x 2Coordenadas dos keypoints em pixels.
keypoints.xynN x K x 2Coordenadas normalizadas dos keypoints.
keypoints.confN x KVisibilidade / confiança por keypoint.
keypoints.has_visibleN x KMáscara booleana de visibilidade.

Formato do dataset e treinamento

Pose usa um YAML de dados que precisa declarar kpt_shape: [K, 2|3] e, para data augmentation com inversão horizontal, um flip_idx. As labels são linhas de texto YOLO-pose: um ID de classe, um bounding box normalizado e, depois, K trios de keypoints (x, y, v), com visibilidade v em {0, 1, 2}.

coco8-pose.yaml
1path: coco8-pose
2train: images/train
3val: images/val
4nc: 1
5names:
6 0: person
7kpt_shape: [17, 3]
8flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
python
1from libreyolo import LibreYOLO9
2
3# Warm-start from a detection checkpoint; the keypoint head is reinitialized
4model = LibreYOLO9("LibreYOLO9t.pt", size="t", task="pose")
5model.train(data="coco8-pose.yaml", epochs=100, imgsz=640)
6
7# Validation reports OKS-based AP via the pose validator

Em desenvolvimento ativo

Pose com YOLO9 e RF-DETR está em uma branch de recurso e ainda não foi incorporada. Considere a API acima o contrato pretendido, não um contrato congelado. Os pesos de pose do YOLO-NAS são vinculados da origem, não espelhados, e precisam ser preparados manualmente.

Detecção de Objetos Pequenos (YOLO9-P2)

YOLO9-P2: t, sVisDrone research preview

YOLO9-P2 é um YOLOv9 com uma quarta escala de detecção em stride 4. O YOLOv9 padrão detecta nos strides 8/16/32, então objetos abaixo de ~16 px ficam menores que sua grade mais fina. A cabeça P2 captura o intervalo de 4-16 px que predomina em imagens aéreas e de drones.

Em um teste A/B controlado no VisDrone (mesma receita, mesma resolução, mesma inicialização. A única mudança foi a cabeça P2), o AP de objetos pequenos melhorou +49% em relação ao YOLOv9 padrão do mesmo tamanho. O aumento da resolução de treinamento e o uso do tamanho s maior praticamente dobraram o AP de objetos pequenos em todo o projeto:

ModeloAPAP50AP_small
YOLO9-t padrão @640 (controle)0.1230.2200.047
YOLO9-P2-t @640 (A/B com a mesma receita)0.1380.2540.070
YOLO9-P2-s @768 (prévia lançada)0.2260.3850.141

Validação no VisDrone2019-DET (548 imagens), pycocotools, uma única seed. Considere ±1 ponto como ruído.

A prévia de pesquisa no VisDrone

Um checkpoint treinado foi publicado como LibreYOLO9P2s-visdrone. A família foi incorporada à branch dev, mas ainda não está em uma versão no PyPI. Até a próxima versão, instale a partir do código-fonte.

python
1from libreyolo import LibreYOLO
2
3# Auto-downloads from the LibreYOLO Hugging Face org
4model = LibreYOLO("LibreYOLO9P2s-visdrone.pt")
5
6# Evaluate/predict at 768 - the resolution it was trained at
7results = model.predict("aerial.jpg", imgsz=768, conf=0.25)

Licença não comercial

O checkpoint de prévia foi treinado no VisDrone2019-DET (AISKYEYE, Universidade de Tianjin), sob a licença CC BY-NC-SA 3.0: somente para uso não comercial, ao contrário do código MIT do LibreYOLO e dos pesos padrão do COCO. Ele detecta as 10 classes aéreas do VisDrone, não as do COCO. O card do modelo inclui a receita de treinamento exata, as métricas por época e um conversor de dataset desenvolvido em sala limpa, para que você possa reproduzi-lo ou retreiná-lo nos seus próprios dados.

Quando usar (ou não)

Adapte a arquitetura ao cenário. Em dados semelhantes ao COCO ("pequeno" significa 16-32 px), a cabeça P2 não ajuda. O YOLOv9 padrão é a melhor escolha nesse caso. Use o YOLO9-P2 quando seus objetos tiverem menos de ~16 px: imagens aéreas e de drones, câmeras de segurança distantes e blocos de imagens de satélite. A escala extra praticamente dobra a computação e o número de âncoras. Esse é o preço da grade de stride 4.

Treinamento do seu próprio modelo

O YOLO9-P2 é inicializado por transferência a partir de checkpoints de detecção do YOLOv9 padrão: o backbone, o neck compartilhado e as torres das cabeças existentes são carregados. Os novos módulos P2 começam do zero. A receita abaixo reúne o que aprendemos da maneira mais difícil com dados de objetos minúsculos:

python
1from libreyolo import LibreYOLO9P2
2
3model = LibreYOLO9P2(None, size="s")
4model.train(
5 data="/abs/path/tiny_objects.yaml",
6 imgsz=768, # resolution is the biggest lever for tiny objects
7 lr0=0.005, # the family default 0.01 diverges on transfer init
8 mosaic_prob=0.0, # mosaic tiling shrinks tiny objects below detectability
9 mixup_prob=0.0,
10 hsv_prob=1.0, flip_prob=0.5,
11 max_labels=600, # dense aerial frames exceed the default 100-box cap
12 pretrained="LibreYOLO9s.pt", # transfer init from stock YOLOv9
13 epochs=60,
14)

Fine-Tuning com LoRA / DoRA

RF-DETR: n, s, m, l

Adaptadores no estilo LoRA permitem fazer fine-tuning do backbone transformer do RF-DETR treinando um pequeno conjunto de matrizes de baixo posto enquanto os pesos base permanecem congelados. Isso reduz o uso de memória do otimizador e dos gradientes, o que é ideal para adaptar um checkpoint forte a um novo domínio em hardware modesto.

Como ativar

Toda a API pública se resume a uma única flag em train(). Não há controles de posto, alfa ou módulo-alvo para ajustar. A receita é fixa em uma configuração bem testada. Nos bastidores, a implementação usa DoRA (LoRA com decomposição de pesos, posto 16) aplicado às projeções de consulta, chave e valor da atenção do DINOv2.

python
1from libreyolo import LibreYOLO
2
3model = LibreYOLO("rf-detr-nano.pth") # sizes n, s, m, l
4result = model.train(
5 data="data.yaml",
6 lora=True, # DoRA on the frozen DINOv2 backbone
7 epochs=100, batch_size=4, lr=1e-4,
8)
9
10# Resume: LoRA is auto-detected from the checkpoint, no need to repeat the flag
11model.train(data="data.yaml", resume=True)
bash
1# CLI equivalent
2libreyolo train --model rf-detr-nano.pth --data data.yaml --lora

Checkpoints e exportação

  • Os checkpoints de treinamento mantêm os tensores do adaptador, e a configuração registra que LoRA foi usado. Assim, o carregamento e a retomada reconstroem o grafo do adaptador automaticamente.
  • A cabeça de detecção sempre permanece treinável, então você ainda pode adaptá-la a uma nova quantidade de classes.
  • export() reincorpora os adaptadores aos pesos densos. Os modelos exportados são comuns e não têm dependência de peft.
  • LoRA é exclusivo do RF-DETR. Passar lora=True para outras famílias gera um erro claro.

Instalar o extra

O treinamento com LoRA precisa da dependência de adaptadores: pip install "libreyolo[lora]", que instala a stack do RF-DETR e peft. Modelos exportados (mesclados) não precisam dela durante a inferência.

Estabilidade

O estado atual de cada recurso. Tudo aqui é experimental. Esta tabela é o mapa fiel.

RecursoFamíliasEstado
ClassificaçãoYOLO9, RF-DETRPR aberto
Caixas orientadas (OBB)YOLO9, RF-DETRExperimental
Keypoints / estimativa de poseYOLO9, RF-DETRChega em breve
Keypoints / estimativa de poseYOLO-NAS, EdgeCrafterDisponível
Detecção de objetos pequenosYOLO9-P2Prévia de pesquisa
LoRA / DoRARF-DETRRevisado

Procurando o caminho estável?

Para trabalho em produção, o núcleo validado é a detecção com YOLO9 e a detecção e segmentação com RF-DETR. Consulte a documentação principal para essas opções e o LibreVLM para detecção de vocabulário aberto.

Acompanhe o progresso e o código-fonte no GitHub