Yolov4の最小限のPytorch実装。
Paper Yolo V4:https://arxiv.org/abs/2004.10934
ソースコード:https://github.com/alexeyab/darknet
詳細:http://pjreddie.com/darknet/yolo/
推論
電車
├── 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
darknet2pytorchを使用して自分で変換するか、変換されたモデルをダウンロードできます。
Yolov4を使用して、独自のデータをトレーニングします
重量をダウンロードしてください
データを変換します
COCOデータセットの場合、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 ...
...
...
電車
cfg.pyでパラメーターを設定できます。
python train.py -g [GPU_ID] -dir [Dataset direction] ...
onnxおよびtensortモデルは、pytorch(tianxiaomo)から変換されます:pytorch-> onnx-> tensorrt。コンバージョンの詳細については、次のセクションを参照してください。
| モデルタイプ | AP | AP50 | AP75 | APS | APM | apl |
|---|---|---|---|---|---|---|
| darknet(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 |
| tensort 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 |
| モデルタイプ | AP | AP50 | AP75 | APS | APM | apl |
|---|---|---|---|---|---|---|
| darknet(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 |
| tensort 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 |
画像入力サイズは320 * 320 416 * 416 512 * 512および608 * 608で制限されていません。 320 * 608など、別の入力比で入力サイズを調整できます。入力サイズが大きいほど、ターゲットが小さいことを検出するのに役立ちますが、GPUメモリが枯渇する可能性があります。
height = 320 + 96 * n , n in { 0 , 1 , 2 , 3 , ...}
width = 320 + 96 * m , m in { 0 , 1 , 2 , 3 , ...}推論を行うために、前処理されたダークネットモデルとダークネット重量をロードします(画像サイズはすでにCFGファイルで構成されています)
python demo.py -cfgfile < cfgFile > -weightfile < weightFile > -imgfile < imgFile >推論を行うには、Pytorchウェイト(PTHファイル)をロードします
python models.py < num_classes > < weightfile > < imgfile > < IN_IMAGE_H > < IN_IMAGE_W > < namefile(optional) >変換されたonnxファイルを実行するように推論を行う(セクション3および4を参照)
変換されたTensortエンジンファイルをロードして推論を行う(セクション5を参照)
2つの推論出力があります。
[batch, num_boxes, 1, 4]で、各境界ボックスのx1、y1、x2、y2を表します。[batch, num_boxes, num_classes]の形状の境界ボックスのスコアです。各境界ボックスのすべてのクラスのスコアを示しています。これまで、NMSを含む小処理の小さな部分が必要です。後処理の時間と複雑さを最小限に抑えようとしています。
このスクリプトは、公式の前提条件のダークネットモデルをONNXに変換することです
Pytorchバージョンがお勧めします:
onnxruntimeをインストールします
pip install onnxruntimePythonスクリプトを実行してONNXモデルを生成し、デモを実行します
python demo_darknet2onnx.py < cfgFile > < namesFile > < weightFile > < imageFile > < batchSize > このスクリプトを使用して、訓練されたPytorchモデルをONNXに変換できます
Pytorchバージョンがお勧めします:
onnxruntimeをインストールします
pip install onnxruntimePythonスクリプトを実行してONNXモデルを生成し、デモを実行します
python demo_pytorch2onnx.py < weight_file > < image_path > < batch_size > < n_classes > < IN_IMAGE_H > < IN_IMAGE_W >例えば:
python demo_pytorch2onnx.py yolov4.pth dog.jpg 8 80 416 416次のコマンドを実行して、Yolov4 OnnxモデルをTensortエンジンに変換します
trtexec --onnx= < onnx_file > --explicitBatch --saveEngine= < tensorRT_engine_file > --workspace= < size_in_megabytes > --fp16次のコマンドを実行して、Yolov4 OnnxモデルをTensortエンジンに変換します
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 > --fp16例えば:
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 >ここでのこのデモは、batchsizeが動的(1がダイナミックレンジ内にある必要がある)またはbatchsize = 1である場合にのみ機能しますが、他のダイナミックまたは静的バッチサイズのためにこのデモを少し更新できます。
Note1:input_hとinput_wは、元のonnxファイルの入力サイズに同意する必要があります。
Note2:Tensort出力には追加のNMS操作が必要です。このデモではtool/utils.pyのPython NMSコードを使用します。
最初:ONNXへの変換
Tensorflow> = 2.0
1:ありがとう:github:https://github.com/onnx/onnx-tensorflow
2:git clone https://github.com/onnx/onnx-tensorflow.git && cd onnx-tensorflow run pip install -eを実行します。
注:少なくとも私にとっては、「PIPインストールONNX-TF」を使用するとエラーが発生します。ソースコードのインストールを使用することをお勧めします
cd DeepStream
make
シングルバッチの場合、
trtexec --onnx=<onnx_file> --explicitBatch --saveEngine=<tensorRT_engine_file> --workspace=<size_in_megabytes> --fp16
マルチバッチの場合、
trtexec --onnx=<onnx_file> --explicitBatch --shapes=input:Xx3xHxW --optShapes=input:Xx3xHxW --maxShapes=input:Xx3xHxW --minShape=input:1x3xHxW --saveEngine=<tensorRT_engine_file> --fp16
注:マックスシェイプは、モデルの元の形状よりも大きくできませんでした。
参照:
@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}
}