Una implementación mínima de Pytorch de Yolov4.
Paper Yolo V4: https://arxiv.org/abs/2004.10934
Código fuente: https: //github.com/alexeyab/Darknet
Más detalles: http://pjreddie.com/darknet/yolo/
Inferencia
Tren
├── README.md
├── dataset.py dataset
├── demo.py demo to run pytorch --> tool/darknet2pytorch
├── demo_darknet2onnx.py tool to convert into onnx --> tool/darknet2pytorch
├── demo_pytorch2onnx.py tool to convert into onnx
├── models.py model for pytorch
├── train.py train models.py
├── cfg.py cfg.py for train
├── cfg cfg --> darknet2pytorch
├── data
├── weight --> darknet2pytorch
├── tool
│ ├── camera.py a demo camera
│ ├── coco_annotation.py coco dataset generator
│ ├── config.py
│ ├── darknet2pytorch.py
│ ├── region_loss.py
│ ├── utils.py
│ └── yolo_layer.py
Puede usar DarkNet2PyTorch para convertirlo usted mismo o descargar mi modelo convertido.
Use yolov4 para entrenar sus propios datos
Descargar peso
Transformar datos
Para el conjunto de datos de Coco, puede usar Tool/Coco_annotation.py.
# train.txt
image_path1 x1,y1,x2,y2,id x1,y1,x2,y2,id x1,y1,x2,y2,id ...
image_path2 x1,y1,x2,y2,id x1,y1,x2,y2,id x1,y1,x2,y2,id ...
...
...
Tren
Puede establecer parámetros en cfg.py.
python train.py -g [GPU_ID] -dir [Dataset direction] ...
Los modelos ONNX y Tensorrt se convierten de Pytorch (Tianxiaomo): Pytorch-> Onnx-> Tensorrt. Consulte las siguientes secciones para obtener más detalles de las conversiones.
| Tipo de modelo | AP | AP50 | AP75 | APS | APM | APL |
|---|---|---|---|---|---|---|
| Darknet (papel yolov4) | 0.471 | 0.710 | 0.510 | 0.278 | 0.525 | 0.636 |
| Pytorch (Tianxiaomo) | 0.466 | 0.704 | 0.505 | 0.267 | 0.524 | 0.629 |
| Tensorrt FP32 + BatchednmsPlugin | 0.472 | 0.708 | 0.511 | 0.273 | 0.530 | 0.637 |
| Tensorrt FP16 + BatchednmsPlugin | 0.472 | 0.708 | 0.511 | 0.273 | 0.530 | 0.636 |
| Tipo de modelo | AP | AP50 | AP75 | APS | APM | APL |
|---|---|---|---|---|---|---|
| Darknet (papel yolov4) | 0.412 | 0.628 | 0.443 | 0.204 | 0.444 | 0.560 |
| Pytorch (Tianxiaomo) | 0.404 | 0.615 | 0.436 | 0.196 | 0.438 | 0.552 |
| Tensorrt FP32 + BatchednmsPlugin | 0.412 | 0.625 | 0.445 | 0.200 | 0.446 | 0.564 |
| Tensorrt FP16 + BatchednmsPlugin | 0.412 | 0.625 | 0.445 | 0.200 | 0.446 | 0.563 |
El tamaño de la entrada de la imagen no está restringido en 320 * 320 , 416 * 416 , 512 * 512 y 608 * 608 . Puede ajustar sus tamaños de entrada para una relación de entrada diferente, por ejemplo: 320 * 608 . El tamaño de entrada más grande podría ayudar a detectar objetivos más pequeños, pero puede ser más lento y la memoria de GPU agotando.
height = 320 + 96 * n , n in { 0 , 1 , 2 , 3 , ...}
width = 320 + 96 * m , m in { 0 , 1 , 2 , 3 , ...}Cargue el modelo DarkNet Pretraned y los pesos DarkNet para hacer la inferencia (el tamaño de la imagen ya está configurado en el archivo CFG)
python demo.py -cfgfile < cfgFile > -weightfile < weightFile > -imgfile < imgFile >Cargar pesos de pytorch (archivo PTH) para hacer la inferencia
python models.py < num_classes > < weightfile > < imgfile > < IN_IMAGE_H > < IN_IMAGE_W > < namefile(optional) >Cargar el archivo ONNX convertido para hacer inferencia (consulte la Sección 3 y 4)
Cargue el archivo de motor Tensorrt convertido para hacer inferencia (consulte la Sección 5)
Hay 2 salidas de inferencia.
[batch, num_boxes, 1, 4] que representa x1, y1, x2, y2 de cada cuadro delimitador.[batch, num_boxes, num_classes] que indican puntajes de todas las clases para cada cuadro delimitador.Hasta ahora, todavía se requiere una pequeña pieza de postprocesamiento que incluya NMS. Estamos tratando de minimizar el tiempo y la complejidad del postprocesamiento.
Este script es convertir el modelo oficial de Darknet previamente practicado en ONNX
Versión de Pytorch recomendada:
Instalar onnxruntime
pip install onnxruntimeEjecute el script de Python para generar el modelo ONNX y ejecutar la demostración
python demo_darknet2onnx.py < cfgFile > < namesFile > < weightFile > < imageFile > < batchSize > Puede convertir su modelo Pytorch capacitado en ONNX utilizando este script
Versión de Pytorch recomendada:
Instalar onnxruntime
pip install onnxruntimeEjecute el script de Python para generar el modelo ONNX y ejecutar la demostración
python demo_pytorch2onnx.py < weight_file > < image_path > < batch_size > < n_classes > < IN_IMAGE_H > < IN_IMAGE_W >Por ejemplo:
python demo_pytorch2onnx.py yolov4.pth dog.jpg 8 80 416 416Ejecute el siguiente comando para convertir el modelo Yolov4 ONNX en motor Tensorrt
trtexec --onnx= < onnx_file > --explicitBatch --saveEngine= < tensorRT_engine_file > --workspace= < size_in_megabytes > --fp16Ejecute el siguiente comando para convertir el modelo Yolov4 ONNX en motor Tensorrt
trtexec --onnx= < onnx_file >
--minShapes=input: < shape_of_min_batch > --optShapes=input: < shape_of_opt_batch > --maxShapes=input: < shape_of_max_batch >
--workspace= < size_in_megabytes > --saveEngine= < engine_file > --fp16Por ejemplo:
trtexec --onnx=yolov4_-1_3_320_512_dynamic.onnx
--minShapes=input:1x3x320x512 --optShapes=input:4x3x320x512 --maxShapes=input:8x3x320x512
--workspace=2048 --saveEngine=yolov4_-1_3_320_512_dynamic.engine --fp16python demo_trt.py < tensorRT_engine_file > < input_image > < input_H > < input_W >Esta demostración aquí solo funciona cuando BatchSize es dinámica (1 debe estar dentro del rango dinámico) o BatchSize = 1, pero puede actualizar esta demostración un poco para otros tamaños de lotes dinámicos o estáticos.
Nota1: Input_h y Input_W deben estar de acuerdo con el tamaño de entrada en el archivo ONNX original.
Nota 2: Se necesitan operaciones adicionales de NMS para la salida Tensorrt. Esta demostración utiliza el código Python NMS de tool/utils.py .
Primero: conversión a ONNX
tensorflow> = 2.0
1: Gracias: GitHub: https: //github.com/onnx/onnx-tensorflow
2: Ejecute Git Clone https://github.com/onnx/onnx-tensorflow.git && cd onnx tensorflow ejecute pip install -e.
Nota: Se producirán errores al usar "Instalar PIP ONNX-TF", al menos para mí, se recomienda usar la instalación del código fuente
cd DeepStream
make
Para un solo lote,
trtexec --onnx=<onnx_file> --explicitBatch --saveEngine=<tensorRT_engine_file> --workspace=<size_in_megabytes> --fp16
Para múltiples lotes,
trtexec --onnx=<onnx_file> --explicitBatch --shapes=input:Xx3xHxW --optShapes=input:Xx3xHxW --maxShapes=input:Xx3xHxW --minShape=input:1x3xHxW --saveEngine=<tensorRT_engine_file> --fp16
NOTA: Las capas máximas no podrían ser más grandes que la forma original del modelo.
Referencia:
@article{yolov4,
title={YOLOv4: YOLOv4: Optimal Speed and Accuracy of Object Detection},
author={Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao},
journal = {arXiv},
year={2020}
}