YOLO-NAS
Um detector convolucional cujo backbone e neck saíram da busca de arquiteturas da Deci.AI, construído com blocos RepVGG preparados para quantização. Seus pesos são da Deci.AI, licenciados apenas para uso não comercial, e o LibreYOLO não publica nenhum deles.
- Tarefas
- detection, pose
- Tamanhos
- s, m, l at 640 px
- Instalação
pip install libreyolo- Nível de suporte
- Núcleo, desde a v1.1.0. Detectores treináveis do núcleo: os recursos chegam depois dos carros-chefe na mesma leva de versões.
- Origem
- YOLO-NAS por Deci.AI, Deci.AI proprietary, non-commercial. Artigo, código-fonte
- Licenças
- Código Apache-2.0, pesos Deci.AI proprietary, non-commercial. Uso comercial
Instalação
O YOLO-NAS não precisa de nada além do pacote base.
pip install libreyoloPredição
Um nome de checkpoint que ainda não esteja em disco é baixado da CDN pública da Deci, não da organização do LibreYOLO, que não hospeda nenhum desses pesos. Antes de a transferência começar, a biblioteca imprime os termos de licença da Deci uma vez por processo, e antes de o arquivo baixado ser aberto seu SHA-256 é conferido contra um valor fixado. O que esses termos permitem está em licenciamento.
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Um nome que ainda não esteja em disco é baixado da CDN da Deci. O# download imprime antes os termos de licença da Deci; ficar com o# arquivo significa aceitá-los.model = LibreYOLO("LibreYOLONASs.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreYOLONASs.pt save=True \ source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpgfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # O sufixo -pose seleciona a cabeça de pose e seu próprio conjunto de pesos.model = LibreYOLO("LibreYOLONASs-pose.pt")result = model(SAMPLE_IMAGE) print(result.keypoints.xy)O objeto Results devolvido é o mesmo que toda família devolve, então trocar
por outro detector é uma mudança de uma linha. conf define o limiar de
confiança e iou o limiar do NMS. Veja predição para fontes,
streaming e tratamento de resultados.
Variantes
Detecção e pose são a mesma arquitetura sob cabeças diferentes, e aceitam os mesmos argumentos. Os tamanhos da tabela abaixo são os de detecção; pose é publicado nesses e em um tamanho menor. A cabeça de pose prevê o conjunto de keypoints do COCO.
| Checkpoint | Entrada (px) | mAP 50-95 | Parâmetros (M) |
|---|---|---|---|
| LibreYOLONASl | 640 | 56.3 | 66.98 |
| LibreYOLONASm | 640 | 55.4 | 51.18 |
| LibreYOLONASs | 640 | 51.8 | 19.05 |
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("LibreYOLONASs.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)libreyolo train model=LibreYOLONASs.pt data=my-dataset.yaml \ epochs=100 imgsz=640 batch=16from libreyolo import LibreYOLONAS # Nenhum checkpoint da Deci é tocado: o modelo parte de pesos aleatórios,# então o que sai da execução deriva apenas dos seus dados.model = LibreYOLONAS(None, size="s")model.train(data="my-dataset.yaml", imgsz=640, batch=16)epochs, lr0 e amp são resolvidos por tarefa quando você os omite, então
uma execução de pose parte de padrões diferentes dos de uma execução de
detecção. O otimizador é o AdamW por padrão. O número de classes vem do YAML do
dataset e a cabeça é reconstruída para ele antes da primeira época; na cabeça de
pose o número de keypoints é tratado do mesmo jeito, então um checkpoint de pose
do COCO pode receber fine-tuning sobre um esqueleto de outro tamanho.
O fine-tuning parte dos pesos da Deci, que é o que a licença da Deci cobre. Treinar a partir de um modelo inicializado aleatoriamente não envolve nenhum checkpoint da Deci, e é isso que o terceiro snippet acima faz.
Veja treinamento para datasets, data augmentation, multi-GPU e loggers.
Validação
val() devolve 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("LibreYOLONASs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreYOLONASs.pt data=my-dataset.yaml# O yaml do COCO que vem junto carrega um script de download embutido,# então precisa de permissão explícita a menos que o dataset já esteja local.libreyolo val model=LibreYOLONASl.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: compatível | Detection to ncnn: compatível | Detection to TFLite: compatível | Detection to CoreML: incompatível | Detection to Core AI: compatível |
| Pose | Pose to ONNX: compatível | Pose to TorchScript: compatível | Pose to ExecuTorch: compatível | Pose to TensorRT: compatível | Pose to OpenVINO: compatível | Pose to Paddle: compatível | Pose to MNN: incompatível | Pose to RKNN: incompatível | Pose to ncnn: compatível | Pose to TFLite: incompatível | Pose to CoreML: incompatível | Pose to Core AI: incompatível |
Um artefato exportado é carregado de volta pelo LibreYOLO() conforme o 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. Cada formato instala um extra diferente e aceita alguns
argumentos próprios. Os dois estão na página daquele formato.
Uma exportação é outra cópia dos mesmos pesos em um contêiner diferente. Exportar um checkpoint da Deci não muda nem de onde os pesos vieram nem a licença que os cobre.
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")model.export(format="onnx", imgsz=640)libreyolo export model=LibreYOLONASs.pt format=onnx imgsz=640from libreyolo import LibreYOLO, SAMPLE_IMAGE # A fábrica resolve pelo sufixo do arquivo, então um artefato exportado# carrega como qualquer checkpoint e devolve o mesmo objeto Results.model = LibreYOLO("LibreYOLONASs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)Checkpoints
Não há nenhum para listar. A licença da Deci proíbe a redistribuição, então a
organização do LibreYOLO não publica pesos do YOLO-NAS e o download é resolvido
em outro lugar: um nome no formato LibreYOLONAS<size>.pt, ou
LibreYOLONAS<size>-pose.pt para pose, corresponde ao objeto equivalente na CDN
pública da Deci.
Só dá para baixar assim os checkpoints cujo SHA-256 a biblioteca fixa. Qualquer
outra coisa falha de forma fechada em vez de abrir um pickle de terceiros não
verificado, e precisa ser baixada à mão e passada como caminho. Um arquivo que
já esteja em disco carrega a partir do seu caminho, sem download e sem barreira
de checksum. Isso inclui um .pth da Deci com o nome original, que o carregador
reconhece.
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
- YOLO-NAS, Deci.AI
- Licença original
- Deci.AI proprietary, non-commercial
- Código-fonte original
- github.com/Deci-AI/super-gradients
- Código do LibreYOLO
- MIT
- Pesos
- Deci.AI proprietary, non-commercial, distribuído pelos autores. O LibreYOLO não hospeda nem espelha esses pesos.
- Interpretação
- Two licenses apply here and they are not the same. The SuperGradients source this port follows is Apache-2.0 and LibreYOLO's own implementation is MIT, so nothing restricts the architecture or the training code. Deci's published checkpoints are a different matter: the YOLO-NAS license grants a revocable, non-transferable right to use them and nothing more. It forbids redistribution and sublicensing, forbids offering them as a managed or remote service, restricts modification and reverse engineering, and rules out commercial use, including any model running in a production environment, unless you hold a separate agreement with Deci. LibreYOLO therefore does not mirror them, and prints those terms once before the download starts. Weights trained from a randomly initialized model on your own data derive from no Deci checkpoint.
O LibreYOLO não hospeda nem espelha esses pesos: não existe nada desta família na organização do LibreYOLO no Hugging Face. Em vez disso, todo download automático vai para a CDN pública da Deci, imprime os termos da Deci uma vez por processo antes de começar, e é conferido contra um SHA-256 fixado antes de o arquivo ser aberto.
Treinar a partir de um modelo inicializado aleatoriamente é a alternativa. A arquitetura é Apache-2.0 no upstream e MIT aqui, então um modelo treinado desse jeito com os seus próprios dados não deriva de nenhum checkpoint da Deci.
Citação
O YOLO-NAS foi lançado sem paper. A entrada abaixo é a que os autores pedem, e cobre o SuperGradients, a biblioteca em que ele foi distribuído.
@misc{supergradients,
doi = {10.5281/ZENODO.7789328},
url = {https://zenodo.org/record/7789328},
author = {Aharon, Shay and {Louis-Dupont} and {Ofri Masad} and Yurkova, Kate and {Lotem Fridman} and {Lkdci} and Khvedchenya, Eugene and Rubin, Ran and Bagrov, Natan and Tymchenko, Borys and Keren, Tomer and Zhilko, Alexander and {Eran-Deci}},
title = {Super-Gradients},
publisher = {GitHub},
journal = {GitHub repository},
year = {2021},
}Copiado do bloco de citação dos autores em github.com/Deci-AI/super-gradients#citing.