Detecção de objetos de estágio único rápido e preciso com otimização de GPU de ponta a ponta.
O ODTK é um detector de objetos de tiro único com vários backbones e cabeças de detecção. Isso permite trade-offs de desempenho/precisão.
É otimizado para o processamento de GPU de ponta a ponta usando:
Este repositório agora suporta detecções de caixas delimitadoras rotadas. Consulte Treinamento rotacionado de detecções e detecções rotacionadas Documentos de inferência para obter mais informações sobre como usar o comando --rotated-bbox .
As anotações da caixa delimitadora são descritas por [x, y, w, h, theta] .
O pipeline de detecção permite que o usuário selecione um backbone específico, dependendo do trade-off de precisão de latência preferida.
A precisão do modelo de retinanet ODTK e latência de inferência e FPS (quadros por segundos) para Coco 2017 (Train/Val) após o cronograma de treinamento completo. Os resultados da inferência incluem caixas delimitadoras após o processamento para um tamanho de lotes de 1. Inferência medida em --resize 800 usando --with-dali em um motor Tensorrt FP16.
| Espinha dorsal | mapa @[IOU = 0,50: 0,95] | Tempo de treinamento no DGX1V | Latência de inferência FP16 no V100 | Latência de inferência Int8 em T4 | Latência de inferência FP16 no A100 | Latência de inferência Int8 na A100 |
|---|---|---|---|---|---|---|
| Resnet18fpn | 0,318 | 5 horas | 14 ms; 71 fps | 18 ms; 56 fps | 9 ms; 110 fps | 7 ms; 141 fps |
| MobileNetv2fpn | 0,333 | 14 ms; 74 fps | 18 ms; 56 fps | 9 ms; 114 fps | 7 ms; 138 fps | |
| Resnet34fpn | 0,343 | 6 horas | 16 ms; 64 fps | 20 ms; 50 fps | 10 ms; 103 fps | 7 ms; 142 fps |
| Resnet50fpn | 0,358 | 7 horas | 18 ms; 56 fps | 22 ms; 45 fps | 11 ms; 93 fps | 8 ms; 129 fps |
| Resnet101fpn | 0,376 | 10 horas | 22 ms; 46 fps | 27 ms; 37 fps | 13 ms; 78 fps | 9 ms; 117 fps |
| Resnet152fpn | 0,393 | 12 horas | 26 ms; 38 fps | 33 ms; 31 fps | 15 ms; 66 fps | 10 ms; 103 fps |
Para melhor desempenho, use o mais recente contêiner Pytorch NGC Docker. Clone este repositório, construa e execute sua própria imagem:
git clone https://github.com/nvidia/retinanet-examples
docker build -t odtk:latest retinanet-examples/
docker run --gpus all --rm --ipc=host -it odtk:latest O treinamento, a inferência, a avaliação e a exportação de modelos podem ser feitos através do utilitário odtk . Para mais detalhes, incluindo uma lista de parâmetros, consulte a documentação de treinamento e inferência.
Treine um modelo de detecção no Coco 2017 da Backbone pré-treinado:
odtk train retinanet_rn50fpn.pth --backbone ResNet50FPN
--images /coco/images/train2017/ --annotations /coco/annotations/instances_train2017.json
--val-images /coco/images/val2017/ --val-annotations /coco/annotations/instances_val2017.jsonTune um modelo pré-treinado no seu conjunto de dados. No exemplo abaixo, usamos Pascal Voc com as anotações JSON:
odtk train model_mydataset.pth --backbone ResNet50FPN
--fine-tune retinanet_rn50fpn.pth
--classes 20 --iters 10000 --val-iters 1000 --lr 0.0005
--resize 512 --jitter 480 640 --images /voc/JPEGImages/
--annotations /voc/pascal_train2012.json --val-annotations /voc/pascal_val2012.json Nota: O lado mais curto das imagens de entrada será redimensionado para resize desde que o lado mais longo não fique maior que max-size . Durante o treinamento, as imagens serão redimensionadas aleatoriamente para um novo tamanho dentro da faixa jitter .
Avalie seu modelo de detecção no Coco 2017:
odtk infer retinanet_rn50fpn.pth --images /coco/images/val2017/ --annotations /coco/annotations/instances_val2017.jsonExecute a inferência no seu conjunto de dados:
odtk infer retinanet_rn50fpn.pth --images /dataset/val --output detections.jsonPara inferência mais rápida, exporte o modelo de detecção para um mecanismo Tensorrt FP16 otimizado:
odtk export model.pth engine.planAvalie o modelo com o back -end Tensorrt no Coco 2017:
odtk infer engine.plan --images /coco/images/val2017/ --annotations /coco/annotations/instances_val2017.jsonPara uma inferência ainda mais rápida, faça a calibração INT8 para criar um mecanismo Tensorrt Int8 otimizado:
odtk export model.pth engine.plan --int8 --calibration-images /coco/images/val2017/Isso criará um arquivo INT8CalibrationTable que pode ser usado para criar mecanismos Tensorrt Int8 para o mesmo modelo posteriormente, sem precisar fazer calibração.
Ou crie um mecanismo Tensorrt Int8 otimizado usando uma tabela de calibração em cache:
odtk export model.pth engine.plan --int8 --calibration-table /path/to/INT8CalibrationTableA RetinAnet suporta anotações no formato Coco JSON. Ao converter as anotações do seu próprio conjunto de dados em JSON, são necessárias as seguintes entradas:
{
"images": [{
"id" : int,
"file_name" : str
}],
"annotations": [{
"id" : int,
"image_id" : int,
"category_id" : int,
"bbox" : [x, y, w, h] # all floats
"area": float # w * h. Required for validation scores
"iscrowd": 0 # Required for validation scores
}],
"categories": [{
"id" : int
]}
}
Se estiver usando o sinalizador --rotated-bbox para detecções rotacionadas, adicione um float theta adicional às anotações. Para obter pontuações de validação, você também precisa preencher a seção segmentation .
"bbox" : [x, y, w, h, theta] # all floats, where theta is measured in radians anti-clockwise from the x-axis.
"segmentation" : [[x1, y1, x2, y2, x3, y3, x4, y4]]
# Required for validation scores.
Este é um projeto de pesquisa, não um produto oficial da NVIDIA.
Esta filial usa Tensorrt 7. Se você estiver treinando e inferindo modelos usando Pytorch, ou está criando motores de tensort em GPUs Tesla (por exemplo, V100, T4), você deve usar esta ramificação.
Se você deseja implantar seu modelo em um dispositivo Jetson (por exemplo - Jetson Agx Xavier) executando o JetPack versão 4.3, use a ramificação 19.10 deste repositório.