Eine minimale Pytorch -Implementierung von Yolov4.
Papier Yolo V4: https://arxiv.org/abs/2004.10934
Quellcode: https: //github.com/alexeyab/darknet
Weitere Details: http://pjreddie.com/darknet/yolo/
Schlussfolgerung
Zug
├── 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
Sie können DarkNet2PyTorch verwenden, um es selbst zu konvertieren oder mein konvertiertes Modell herunterzuladen.
Verwenden Sie Yolov4, um Ihre eigenen Daten zu trainieren
Gewicht herunterladen
Daten transformieren
Für Coco -Datensatz können Sie Tool/Coco_annotation.py verwenden.
# 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 ...
...
...
Zug
Sie können Parameter in cfg.py festlegen.
python train.py -g [GPU_ID] -dir [Dataset direction] ...
ONNX- und Tensorrt-Modelle werden aus Pytorch (Tianxiaomo) umgewandelt: Pytorch-> Onnx-> Tensorrt. Weitere Informationen zu Conversions finden Sie in den folgenden Abschnitten.
| Modelltyp | AP | AP50 | AP75 | APS | APM | Apl |
|---|---|---|---|---|---|---|
| Darknet (Yolov4 Paper) | 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 |
| Modelltyp | AP | AP50 | AP75 | APS | APM | Apl |
|---|---|---|---|---|---|---|
| Darknet (Yolov4 Paper) | 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 |
Die Bildeingangsgröße ist in 320 * 320 , 416 * 416 , 512 * 512 und 608 * 608 nicht eingeschränkt. Sie können Ihre Eingangsgrößen für ein anderes Eingangsverhältnis einstellen, zum Beispiel: 320 * 608 . Eine größere Eingangsgröße könnte dazu beitragen, kleinere Ziele zu erkennen, kann jedoch langsamer und GPU -Speicher anstrengend sein.
height = 320 + 96 * n , n in { 0 , 1 , 2 , 3 , ...}
width = 320 + 96 * m , m in { 0 , 1 , 2 , 3 , ...}Laden Sie das vorgezogene DarkNet -Modell und DarkNet -Gewichte, um die Inferenz zu erledigen (Bildgröße wird bereits in der CFG -Datei konfiguriert)
python demo.py -cfgfile < cfgFile > -weightfile < weightFile > -imgfile < imgFile >Laden Sie die Pytorch -Gewichte (PTH -Datei), um die Inferenz durchzuführen
python models.py < num_classes > < weightfile > < imgfile > < IN_IMAGE_H > < IN_IMAGE_W > < namefile(optional) >Laden Sie die konvertierte ONNX -Datei, um inferenz zu werden (siehe Abschnitt 3 und 4)
Laden Sie die konvertierte Tensorrt -Engine -Datei, um inferenziert zu werden (siehe Abschnitt 5)
Es gibt 2 Inferenzausgänge.
[batch, num_boxes, 1, 4] , die x1, y1, x2, y2 jedes Begrenzungsfelds darstellen.[batch, num_boxes, num_classes] enthält, die Bewertungen aller Klassen für jedes Begrenzungsfeld angeben.Bisher ist bisher noch ein kleines Stück Nachverarbeitung einschließlich NMS erforderlich. Wir versuchen, Zeit und Komplexität der Nachbearbeitung zu minimieren.
Dieses Skript soll das offizielle vorbereitete DarkNet -Modell in ONNX umwandeln
Pytorch -Version empfohlen:
Installieren Sie onnxruntime
pip install onnxruntimeFühren Sie das Python -Skript aus, um ein OnNX -Modell zu generieren und die Demo auszuführen
python demo_darknet2onnx.py < cfgFile > < namesFile > < weightFile > < imageFile > < batchSize > Mit diesem Skript können Sie Ihr geschultes Pytorch -Modell in ONNX umwandeln
Pytorch -Version empfohlen:
Installieren Sie onnxruntime
pip install onnxruntimeFühren Sie das Python -Skript aus, um ein OnNX -Modell zu generieren und die Demo auszuführen
python demo_pytorch2onnx.py < weight_file > < image_path > < batch_size > < n_classes > < IN_IMAGE_H > < IN_IMAGE_W >Zum Beispiel:
python demo_pytorch2onnx.py yolov4.pth dog.jpg 8 80 416 416Führen Sie den folgenden Befehl aus, um das Yolov4 -ONNX -Modell in den Tensorrt Engine umzuwandeln
trtexec --onnx= < onnx_file > --explicitBatch --saveEngine= < tensorRT_engine_file > --workspace= < size_in_megabytes > --fp16Führen Sie den folgenden Befehl aus, um das Yolov4 -ONNX -Modell in den Tensorrt Engine umzuwandeln
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 > --fp16Zum Beispiel:
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 >Diese Demo funktioniert hier nur, wenn BatchSize dynamisch ist (1 sollte sich innerhalb des Dynamikbereichs befinden) oder batchsize = 1, aber Sie können diese Demo ein wenig für andere dynamische oder statische Chargengrößen aktualisieren.
Note1: Input_h und input_w sollten der Eingabemaßnahmen in der ursprünglichen ONNX -Datei zustimmen.
Hinweis 2: Für die Tensorrt -Ausgabe sind zusätzliche NMS -Vorgänge erforderlich. Diese Demo verwendet den Python -NMS -Code von tool/utils.py .
Erstens: Konvertierung zu ONNX
TensorFlow> = 2.0
1: Danke: GitHub: https: //github.com/onnx/onnx-sorflow
2: Git Clone https://github.com/onnx/onnx-tensorflow.git && cd onnx-sorflow run pip install -e.
HINWEIS: Bei Verwendung "PIP-Installation von ONNX-TF" werden zumindest für mich empfohlen, die Quellcode-Installation zu verwenden
cd DeepStream
make
Für Single Charge,
trtexec --onnx=<onnx_file> --explicitBatch --saveEngine=<tensorRT_engine_file> --workspace=<size_in_megabytes> --fp16
Für Multi-Batch,
trtexec --onnx=<onnx_file> --explicitBatch --shapes=input:Xx3xHxW --optShapes=input:Xx3xHxW --maxShapes=input:Xx3xHxW --minShape=input:1x3xHxW --saveEngine=<tensorRT_engine_file> --fp16
HINWEIS: Die Maxshapes konnten nicht größer als die modellische Originalform sein.
Referenz:
@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}
}