YOLOv9
Um detector convolucional de estágio único: uma passada pontua uma grade densa de caixas e o NMS descarta as duplicadas. O LibreYOLO traz três variantes dele, uma delas sem etapa de NMS.
- Tarefas
- detection
- Tamanhos
- yolo9: t, s, m, c at 640 px; yolo9_p2: t, s at 640 px
- Instalação
pip install libreyolo- Nível de suporte
- Carro-chefe, desde a v1.0.0. Os recursos são projetados e validados por completo em GPU aqui primeiro.
- Origem
- YOLOv9 por MultimediaTechLab, MIT. Artigo, código-fonte
- Licenças
- Código MIT, pesos MIT. Uso comercial
Instalação
O YOLOv9 não precisa de nenhum extra além do pacote base.
pip install libreyoloPredição
Os pesos são baixados do Hugging Face no primeiro uso e ficam em cache localmente.
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreYOLO9s.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreYOLO9s.pt save=True \ source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpgfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Mesma chamada, checkpoint diferente. A cabeça end-to-end devolve suas# próprias predições de maior pontuação, então nenhum NMS roda e iou é ignorado.model = LibreYOLO("LibreYOLO9E2Es.pt")result = model(SAMPLE_IMAGE, conf=0.25, max_det=300) print(len(result.boxes))O objeto Results retornado é o mesmo que todas as famílias retornam, então
trocar por outro detector é uma mudança de uma linha. Nos modelos base e de
stride 4, conf define o limiar de confiança e iou o limiar do NMS. O modelo
end-to-end não roda NMS e ignora iou, então conf e max_det são o que dá
forma à saída dele. Veja predição para fontes, streaming e
tratamento de resultados.
Variantes
Três variantes compartilham um backbone. As três só detectam, e aceitam os mesmos argumentos.
O modelo base prediz em três escalas de características e elimina as caixas duplicadas com NMS.
O modelo end-to-end mantém essa cabeça e acrescenta ao lado dela um ramo de correspondência um-para-um. A inferência lê só o ramo um-para-um e pega as predições de maior pontuação dele, então nenhum NMS roda. Escolha esse quando o runtime em que você faz deploy não tiver operador de NMS.
O modelo de stride 4 puxa mais um nível acima no backbone, estende o neck até ele e prediz em quatro escalas em vez de três. A escala extra é para objetos que cobrem poucos pixels; o único checkpoint publicado para ele é treinado com imagens aéreas. Checkpoints de detecção base se transferem para ele: o backbone e o neck carregam sem alterações, as três torres de cabeça pré-treinadas sobem uma posição e a torre de stride 4 parte de inicialização aleatória.
| Checkpoint | Entrada (px) | mAP 50-95 | Parâmetros (M) |
|---|---|---|---|
| LibreYOLO9c | 640 | 56.4 | 25.5 |
| LibreYOLO9m | 640 | 55.3 | 20.12 |
| LibreYOLO9s | 640 | 55.9 | 7.2 |
| LibreYOLO9t | 640 | 54.0 | 2.02 |
COCO val2017, 500 images. Medido pelo conjunto de testes de benchmark do LibreYOLO e publicado no Vision Analysis, onde a latência entre hardwares e runtimes é comparada e os registros completos das execuções ficam disponíveis.
Treinamento
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \ epochs=100 imgsz=640 batch=16from libreyolo import LibreYOLO9P2 # A variante de stride 4 não tem checkpoint COCO próprio, então indique# um de detecção base: o backbone e o neck dele carregam sem alterações# e a torre da cabeça de stride 4 parte de inicialização aleatória.model = LibreYOLO9P2(None, size="s")model.train(data="my-dataset.yaml", epochs=100, pretrained="LibreYOLO9s.pt")pretrained decide de onde a execução parte. Passe True para carregar o
checkpoint publicado do mesmo modelo e tamanho, ou um nome ou caminho para
qualquer outra coisa. Tensores cuja forma não bate são pulados em vez de
recusados, e a execução registra quantos foram carregados, então um checkpoint
treinado com um número diferente de classes ainda é um ponto de partida
utilizável.
O modelo de stride 4 não tem checkpoint COCO publicado próprio, então True
resolve ali para um arquivo que não existe e o download falha. Indique um
checkpoint de detecção base no lugar.
Veja treinamento para datasets, data augmentation, multi-GPU e loggers.
Validação
val() retorna um dicionário de chaves metrics/ cobrindo precisão, recall,
mAP 50 e mAP 50-95, medidos contra qualquer dataset no formato em que você
treinou.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreYOLO9s.pt data=my-dataset.yaml# O yaml de COCO que vem junto carrega um script de download embutido,# então ele precisa de permissão explícita a menos que o dataset já esteja local.libreyolo val model=LibreYOLO9c.pt data=coco.yaml imgsz=640 \ allow_download_scripts=TrueExportação
| Tarefa | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX: compatível | Detection to TorchScript: compatível | Detection to ExecuTorch: compatível | Detection to TensorRT: compatível | Detection to OpenVINO: compatível | Detection to Paddle: compatível | Detection to MNN: compatível | Detection to RKNN: incompatível | Detection to ncnn: compatível | Detection to TFLite: incompatível | Detection to CoreML: incompatível | Detection to Core AI: compatível |
Uma marca vale para as três variantes: onde elas diferem, a matriz traz a mais fraca das três.
Um artefato exportado é recarregado pelo LibreYOLO() a partir do sufixo do
arquivo, então um arquivo .onnx ou .engine se comporta como um checkpoint e
devolve o mesmo Results. Rodar o grafo em um runtime puro, sem o LibreYOLO
instalado, também é suportado, mas aí o pré-processamento e o pós-processamento
ficam por sua conta.
Para o modelo de detecção base, a metade de pós-processamento disso pode ir para
dentro do grafo. nms=True em uma exportação para ONNX coloca a supressão
dentro do modelo, e a primeira saída passa a ser um tensor fixo
(1, max_det, 6) cujas linhas são x1, y1, x2, y2, score, class, preenchidas
com zeros além da contagem de detecções. Esse grafo é de batch 1 e não carrega
eixos dinâmicos. Os modelos end-to-end e de stride 4 não aceitam a flag.
Cada formato instala um extra diferente e aceita alguns argumentos próprios. As duas coisas estão na página daquele formato.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.export(format="onnx", imgsz=640)libreyolo export model=LibreYOLO9s.pt format=onnx imgsz=640libreyolo export model=LibreYOLO9s.pt format=onnx nms=True \ conf=0.25 iou=0.45 max_det=300from libreyolo import LibreYOLO, SAMPLE_IMAGE # A factory decide pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreYOLO9s.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Todos os arquivos de pesos publicados desta família.
| Arquivo | Entrada (px) | Licença dos pesos |
|---|---|---|
| Detection | ||
| LibreYOLO9t.pt | 640 | mit |
| LibreYOLO9s.pt | 640 | mit |
| LibreYOLO9m.pt | 640 | mit |
| LibreYOLO9c.pt | 640 | mit |
| LibreYOLO9E2Et.pt | 640 | mit |
| LibreYOLO9E2Es.pt | 640 | mit |
| LibreYOLO9E2Em.pt | 640 | mit |
| LibreYOLO9E2Ec.pt | 640 | mit |
| LibreYOLO9P2s-visdrone.pt | cc-by-nc-sa-3.0 | |
Todos os arquivos acima existem hoje na organização LibreYOLO e são baixados no primeiro uso.
Licenciamento
Confira a licença no repositório do Hugging Face correspondente aos pesos que você baixar. Cada checkpoint na organização LibreYOLO tem uma licença, e ela nem sempre é a mesma em toda a família. Esse repositório é a fonte oficial. O resumo abaixo descreve o que se aplicava na última verificação desta página.
Esta é uma descrição das licenças envolvidas, não uma orientação jurídica. Se a resposta tiver importância comercial, leia as licenças e procure sua própria assessoria.
- Trabalho original
- YOLOv9, MultimediaTechLab
- Licença original
- MIT
- Código-fonte original
- github.com/MultimediaTechLab/YOLO
- Código do LibreYOLO
- MIT
- Pesos
- MIT, republicado em huggingface.co/LibreYOLO
- Interpretação
- MIT is a permissive license, so these weights can be used in commercial and closed-source products. The one standing obligation is to keep the license text and the copyright notice, Kin-Yiu Wong and Hao-Tang Tsui, with any copy you redistribute. It places no condition on your own application code, and a model you train yourself on your own data is yours. Two things are worth knowing beyond that. The port follows the authors' MIT re-release of YOLOv9, not the GPL-3.0 repository that carries the same model, so the permissive terms come from the source LibreYOLO actually derives from. And one checkpoint in this family is not MIT: the stride-4 model trained on VisDrone2019-DET inherits that dataset's CC BY-NC-SA 3.0 terms, which rule out commercial use and require share-alike on anything derived from it.
Um checkpoint aqui não é MIT. O modelo de stride 4 treinado no VisDrone2019-DET herda os termos CC BY-NC-SA 3.0 desse dataset: só uso não comercial, share-alike em tudo que derivar dele, e fora da licença permissiva sob a qual o resto desta família é distribuído. Ele prediz as classes aéreas do VisDrone em vez das do COCO. A biblioteca imprime tudo isso antes de baixar o arquivo.
Citação
@inproceedings{wang2024yolov9,
title={{YOLOv9}: Learning What You Want to Learn Using Programmable Gradient Information},
author={Wang, Chien-Yao and Yeh, I-Hau and Liao, Hong-Yuan Mark},
year={2024},
booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
}Copiado do bloco de citação dos autores em github.com/MultimediaTechLab/YOLO#citations.