YOLO-TensorRT8 是基于 TensorRT8 和 Efficient NMS Plugin 实现的端到端检测架构。
利用 PyTorch 中的 torch.autograd.Function 和 symbolic 实现了 Efficient NMS Plugin 注册到 onnx 中。
效果图如图所示:
图中的输出共计 4 个,分别表示:
num_dets: Batch 中每张图片检测的目标数量, 类型为int32;det_boxes: Batch 中每张图片中每个目标的检测框, 目标框格式为左上角和右下角坐标(x0,y0,x1,y1), 类型为float32;det_scores: Batch 中每张图片中每个目标的置信度, 类型为float32;det_classes: Batch 中每张图片中每个目标的类别id,类型为int32;
# 安装环境
pip install -r requirements.txt
# 导出普通的 ONNX
python ./export.py \
--weights ./yolov7.pt \
--version 7 \
--img-size 640 \
--batch-size 1 \
--device cpu \
--simplify \
--opset 12
# 导出带有 Efficient NMS 的 ONNX
python ./export.py \
--weights ./yolov7.pt \
--version 7 \
--img-size 640 \
--batch-size 1 \
--device cpu \
--simplify \
--opset 12 \
--end2end \
--max-obj 100 \
--iou-thres 0.65 \
--score-thres 0.35
# 转换 ONNX 为 TensorRT engine
trtexec --onnx=./yolov7.onnx \
--saveEngine=./yolov7.engine \
--fp16 # 如果使用 fp16--weights: 使用最新版本开源仓库训练好的模型权重。--version: 指定模型版本。目前支持 5:yolov5, 6:yolov6, 7:yolov7; 未来考虑增加 8:airdet, -1:ppyoloe(需要安装PaddleDetection)。--img-size: 输入图片尺寸。--batch-size: 输入批量大小。--device: 指定使用 CPU 或者 CUDA:0 CUDA:1 ...导出 ONNX。--simplify: 使用 onnx-simplifier 简化模型。需要安装最新版本的 onnx-simplifier。--opset: 导出支持 opset 版本算子的 ONNX。--end2end: 导出端到端的带有 Efficient NMS 的 ONNX。--max-obj: 每张图片的最大检测框数量。--iou-thres: NMS 算法中的 IOU 阈值。--conf-thres: NMS 算法中的置信度阈值。
准备模型训练时使用的图片放到 ./calib_data 下,路径格式如下:
# 文件名随意,文件后缀最好是 .jpg
./calib_data/0001.jpg
./calib_data/0002.jpg
./calib_data/0003.jpg
./calib_data/0004.jpg
./calib_data/0005.jpg
....本仓库支持 pytorch 和 cuda-python 作为量化后端喂给 TensorRT 校准数据。
用法:
# pytorch + TensorRT int8量化
python ./build_engine.py \
--onnx yolov7.onnx \
--engine yolov7.engine \
--batch-size 1 \ # 需要和前文导出 onnx 时指定一致
--imgsz 640 \
--device 0 \
--verbose \ # 打印详细日志(未来会使用它增加绘制 TensorRT engine 结构的功能)
--workspace 8 \
--fp16 \ # 如果需要 fp16 + int8 可以同时开启
--int8 \
--calib-data ./calib_data \ # 校准图片路径可以自定义
--cache ./calib.cache \ # 校准集缓存,方便下次使用
--method torch