YOLO|Ubuntu18.04配置darknet环境实现YOLOv4目标检测(五)——darknet YOLOv4和YOLOv4-tiny模型转ONNX转TensorRT部署
文章目录
- 1. github开源代码
- 2. darknet模型转ONNX模型
- 3. ONNX模型转TensorRT模型
-
- 3.1 概述
- 3.2 编译
- 3.3 运行
- 4. 推理结果
1. github开源代码 开源代码位置在这里,darknet转ONNX模型代码基于python,TensorRT推理代码基于C++。
2. darknet模型转ONNX模型 通过export_onnx.py文件可以将darknet模型转换为ONNX模型,目前可以支持YOLOv3,YOLOv3-SPP,YOLOv4等模型。
parser = argparse.ArgumentParser(description='Transform YOLO weights to ONNX.')
parser.add_argument('--cfg_file', type=str, default='yolov4.cfg', help='yolo cfg file')
parser.add_argument('--weights_file', type=str, default='yolov4.weights', help='yolo weights file')
parser.add_argument('--output_file', type=str, default='yolov4.onnx', help='yolo onnx file')
parser.add_argument('--neck', type=str, default='PAN', help='use which kind neck')
args = parser.parse_args()
cfg_file
是darknet的cfg文件的路径,weights_file
是darknet的weights文件的路径,output_file
是输出的ONNX文件的名称,neck
是YOLO的模型结构,YOLOv3相关模型输入FPN,YOLOv4模型相关输入PAN。输入以下命令后,可以将darknet模型转为ONNX模型。python3 export_onnx.py
【YOLO|Ubuntu18.04配置darknet环境实现YOLOv4目标检测(五)——darknet YOLOv4和YOLOv4-tiny模型转ONNX转TensorRT部署】导出yolov4-tiny模型的命令是:
python3 export_onnx.py --cfg_file yolov4-tiny.cfg --weights_file yolov4-tiny.weights --output_file yolov4-tiny.onnx --strides 32 16 --neck FPN
转换后的模型加入了transpose,将所有YOLO层的输出结果进行了concat,最终结构如下:
文章图片
3. ONNX模型转TensorRT模型 3.1 概述 TensorRT模型即TensorRT的推理引擎,代码中通过C++实现。相关配置写在config.yaml文件中,如果存在
engine_file
的路径,则读取engine_file
,否则从onnx_file
生成engine_file
。void YOLOv5::LoadEngine() {
// create and load engine
std::fstream existEngine;
existEngine.open(engine_file, std::ios::in);
if (existEngine) {
readTrtFile(engine_file, engine);
assert(engine != nullptr);
} else {
onnxToTRTModel(onnx_file, engine_file, engine, BATCH_SIZE);
assert(engine != nullptr);
}
}
config.yaml文件可以设置batch size,图像的size及模型的anchor等。
Yolov4:
onnx_file:"../yolov4.onnx"
engine_file:"../yolov4.trt"
labels_file:"../coco.names"
BATCH_SIZE:1
INPUT_CHANNEL: 3
IMAGE_WIDTH:608
IMAGE_HEIGHT:608
obj_threshold: 0.4
nms_threshold: 0.45
stride:[8, 16, 32]
anchors:[[12, 16], [19, 36], [40, 28], [36, 75], [76, 55], [72, 146], [142, 110], [192, 243], [459, 401]]
3.2 编译 通过以下命令对项目进行编译,生成
Yolov4_trt
mkdir build && cd build
cmake ..
make -j
3.3 运行 通过以下命令运行项目,得到推理结果
./Yolov4_trt ../config.yaml ../samples
4. 推理结果 推理结果如下图所示:
文章图片
可以看到输出结果与darknet模型的输出结果包括置信度完全一致,在输出的信息中,每张图片的平均处理时间约为16ms,单独engine的推理时间约为7ms。
推荐阅读
- Deep|分享(YOLO-Darknet 安装)
- YOLO-Darknet|YOLO-Darknet实战(一)(Darknet安装与测试)
- 数据结构与算法|数据结构(第四章)
- c++|C++中关于进制输出的总结
- C++避坑指南|vector.earse()避坑指南(引发了异常: 读取访问权限冲突。_Mycont 是 nullptr。)
- c++|leetcode452之番外
- 深度学习|TensorFlow 对数据集标记的xml文件解析记录
- 机器学习|收藏版|史上最全机器学习优化器Optimizer汇总
- 算法|2022五一数学建模有何思路模型?