Skip to content

Latest commit

 

History

History

yolov7

YOLOv7 (YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors)

内容

模型库

YOLOv7 on COCO

基础模型

网络网络 输入尺寸 图片数/GPU 学习率策略 模型推理耗时(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
YOLOv7-L 640 32 300e 7.4 51.0 70.2 37.62 106.08 下载链接 配置文件
YOLOv7-X 640 32 300e 12.2 53.0 70.8 71.34 190.08 下载链接 配置文件
网络网络 输入尺寸 图片数/GPU 学习率策略 模型推理耗时(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
YOLOv7u-L 640 32 300e 9.0 52.1 68.8 43.59 130.10 下载链接 配置文件

P6大尺度模型

网络网络 输入尺寸 图片数/GPU 学习率策略 模型推理耗时(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
YOLOv7P6-W6 1280 16 300e 25.5 54.4 71.8 70.43 360.26 下载链接 配置文件
YOLOv7P6-E6 1280 10 300e 31.1 55.7 73.0 97.25 515.4 下载链接 配置文件
YOLOv7P6-D6 1280 8 300e 37.4 56.1 73.3 133.81 702.92 下载链接 配置文件
YOLOv7P6-E6E 1280 6 300e 48.7 56.5 73.7 151.76 843.52 下载链接 配置文件

tiny模型(LeakyReLU)

网络网络 输入尺寸 图片数/GPU 学习率策略 模型推理耗时(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
YOLOv7-tiny 640 32 300e 2.4 37.3 54.5 6.23 13.80 下载链接 配置文件
YOLOv7-tiny 416 32 300e 1.3 33.3 49.5 6.23 5.82 下载链接 配置文件
YOLOv7-tiny 320 32 300e - 29.1 43.8 6.23 3.46 下载链接 配置文件

注意:

  • YOLOv7模型训练使用COCO train2017作为训练集,Box AP为在COCO val2017上的mAP(IoU=0.5:0.95)结果;
  • YOLOv7u 模型表示YOLOv7结构使用YOLOv8的head和loss,并结合YOLOR的ImplicitA和ImplicitM,是Anchor Free的检测方案,具体可参照YOLOv7u
  • YOLOv7模型训练过程中默认使用8 GPUs进行混合精度训练,默认lr为0.01为8卡总batch_size的设置,如果GPU卡数或者每卡batch size发生改动,也不需要改动学习率,但为了保证高精度最好使用总batch size大于64的配置去训练;
  • YOLOv7模型训练的图片数/GPU(每卡batch size)默认是采用32G V100并且开启--amp混合精度训练的,其中P6模型也可以在配置文件中设置use_aux: False以使用更大的batch size。
  • YOLOv7P6模型计算Params和FLOPs需设置成use_aux: False
  • YOLOv7仅tiny模型采用LeakyReLU激活函数,基础模型和P6模型均采用SiLU激活函数。
  • 模型推理耗时(ms)为TensorRT-FP16下测试的耗时,不包含数据预处理和模型输出后处理(NMS)的耗时。测试采用单卡Tesla T4 GPU,batch size=1,测试环境为paddlepaddle-2.3.2, CUDA 11.2, CUDNN 8.2, GCC-8.2, TensorRT 8.0.3.4,具体请参考速度测试
  • 如果你设置了--run_benchmark=True, 你首先需要安装以下依赖pip install pynvml psutil GPUtil

部署模型

网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
YOLOv7-l 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv7-x 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv7P6-W6 1280 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv7P6-E6 1280 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv7P6-D6 1280 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv7P6-E6E 1280 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)

使用教程

0. 一键运行全流程

将以下命令写在一个脚本文件里如run.sh,一键运行命令为:sh run.sh,也可命令行一句句去运行。

model_name=yolov7 # 可修改,如 ppyoloe
job_name=yolov7_tiny_300e_coco # 可修改,如 ppyoloe_plus_crn_s_80e_coco

config=configs/${model_name}/${job_name}.yml
log_dir=log_dir/${job_name}
# weights=https://bj.bcebos.com/v1/paddledet/models/${job_name}.pdparams
weights=output/${job_name}/model_final.pdparams

# 1.训练(单卡/多卡),加 --eval 表示边训边评估,加 --amp 表示混合精度训练
# CUDA_VISIBLE_DEVICES=0 python tools/train.py -c ${config} --eval --amp
python -m paddle.distributed.launch --log_dir=${log_dir} --gpus 0,1,2,3,4,5,6,7 tools/train.py -c ${config} --eval --amp

# 2.评估,加 --classwise 表示输出每一类mAP
CUDA_VISIBLE_DEVICES=0 python tools/eval.py -c ${config} -o weights=${weights} --classwise

# 3.预测 (单张图/图片文件夹)
CUDA_VISIBLE_DEVICES=0 python tools/infer.py -c ${config} -o weights=${weights} --infer_img=demo/000000014439_640x640.jpg --draw_threshold=0.5
# CUDA_VISIBLE_DEVICES=0 python tools/infer.py -c ${config} -o weights=${weights} --infer_dir=demo/ --draw_threshold=0.5

# 4.导出模型,以下3种模式选一种
## 普通导出,加trt表示用于trt加速,对NMS和silu激活函数提速明显
CUDA_VISIBLE_DEVICES=0 python tools/export_model.py -c ${config} -o weights=${weights} # trt=True

## exclude_post_process去除后处理导出,返回和YOLOv5导出ONNX时相同格式的concat后的1个Tensor,是未缩放回原图的坐标+分类置信度
# CUDA_VISIBLE_DEVICES=0 python tools/export_model.py -c ${config} -o weights=${weights} exclude_post_process=True # trt=True

## exclude_nms去除NMS导出,返回2个Tensor,是缩放回原图后的坐标和分类置信度
# CUDA_VISIBLE_DEVICES=0 python tools/export_model.py -c ${config} -o weights=${weights} exclude_nms=True # trt=True

# 5.部署预测,注意不能使用 去除后处理 或 去除NMS 导出后的模型去预测
CUDA_VISIBLE_DEVICES=0 python deploy/python/infer.py --model_dir=output_inference/${job_name} --image_file=demo/000000014439_640x640.jpg --device=GPU

# 6.部署测速,加 “--run_mode=trt_fp16” 表示在TensorRT FP16模式下测速,注意如需用到 trt_fp16 则必须为加 trt=True 导出的模型
CUDA_VISIBLE_DEVICES=0 python deploy/python/infer.py --model_dir=output_inference/${job_name} --image_file=demo/000000014439_640x640.jpg --device=GPU --run_benchmark=True # --run_mode=trt_fp16

# 7.onnx导出,一般结合 exclude_post_process去除后处理导出的模型
paddle2onnx --model_dir output_inference/${job_name} --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 12 --save_file ${job_name}.onnx

# 8.onnx trt测速
/usr/local/TensorRT-8.0.3.4/bin/trtexec --onnx=${job_name}.onnx --workspace=4096 --avgRuns=10 --shapes=input:1x3x640x640 --fp16
/usr/local/TensorRT-8.0.3.4/bin/trtexec --onnx=${job_name}.onnx --workspace=4096 --avgRuns=10 --shapes=input:1x3x640x640 --fp32

1. 训练

执行以下指令使用混合精度训练YOLOv7

python -m paddle.distributed.launch --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/yolov7/yolov7_l_300e_coco.yml --amp --eval

注意:

  • --amp表示开启混合精度训练以避免显存溢出,--eval表示边训边验证。

2. 评估

执行以下命令在单个GPU上评估COCO val2017数据集

CUDA_VISIBLE_DEVICES=0 python tools/eval.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams

3. 推理

使用以下命令在单张GPU上预测图片,使用--infer_img推理单张图片以及使用--infer_dir推理文件中的所有图片。

# 推理单张图片
CUDA_VISIBLE_DEVICES=0 python tools/infer.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams --infer_img=demo/000000014439_640x640.jpg

# 推理文件中的所有图片
CUDA_VISIBLE_DEVICES=0 python tools/infer.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams --infer_dir=demo

4.导出模型

YOLOv7在GPU上推理部署或benchmark测速等需要通过tools/export_model.py导出模型。

当你使用Paddle Inference但不使用TensorRT时,运行以下的命令导出模型

python tools/export_model.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams

当你使用Paddle Inference且使用TensorRT时,需要指定-o trt=True来导出模型。

python tools/export_model.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams trt=True

如果你想将YOLOv7模型导出为ONNX格式,参考 PaddleDetection模型导出为ONNX格式教程,运行以下命令:

# 导出推理模型
python tools/export_model.py -c configs/yolov7/yolov7_l_300e_coco.yml --output_dir=output_inference -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams

# 安装paddle2onnx
pip install paddle2onnx

# 转换成onnx格式
paddle2onnx --model_dir output_inference/yolov7_l_300e_coco --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 11 --save_file yolov7_l_300e_coco.onnx

注意: ONNX模型目前只支持batch_size=1

5.推理部署

YOLOv7可以使用以下方式进行部署:

运行以下命令导出模型

python tools/export_model.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams trt=True

注意:

  • trt=True表示使用Paddle Inference且使用TensorRT进行测速,速度会更快,默认不加即为False,表示使用Paddle Inference但不使用TensorRT进行测速。
  • 如果是使用Paddle Inference在TensorRT FP16模式下部署,需要参考Paddle Inference文档,下载并安装与你的CUDA, CUDNN和TensorRT相应的wheel包。

5.1.Python部署

deploy/python/infer.py使用上述导出后的Paddle Inference模型用于推理和benchnark测速,如果设置了--run_benchmark=True, 首先需要安装以下依赖pip install pynvml psutil GPUtil

# Python部署推理单张图片
python deploy/python/infer.py --model_dir=output_inference/yolov7_l_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu

# 推理文件夹下的所有图片
python deploy/python/infer.py --model_dir=output_inference/yolov7_l_300e_coco --image_dir=demo/ --device=gpu

5.2. C++部署

deploy/cpp/build/main使用上述导出后的Paddle Inference模型用于C++推理部署, 首先按照docs编译安装环境。

# C++部署推理单张图片
./deploy/cpp/build/main --model_dir=output_inference/yolov7_l_300e_coco/ --image_file=demo/000000014439_640x640.jpg --run_mode=paddle --device=GPU --threshold=0.5 --output_dir=cpp_infer_output/yolov7_l_300e_coco

速度测试

为了公平起见,在模型库中的速度测试结果均为不包含数据预处理和模型输出后处理(NMS)的数据(与YOLOv4(AlexyAB)测试方法一致),需要在导出模型时指定-o exclude_nms=True。测速需设置--run_benchmark=True, 首先需要安装以下依赖pip install pynvml psutil GPUtil

使用Paddle Inference但不使用TensorRT进行测速,执行以下命令:

# 导出模型
python tools/export_model.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams exclude_nms=True

# 速度测试,使用run_benchmark=True
python deploy/python/infer.py --model_dir=output_inference/yolov7_l_300e_coco --image_file=demo/000000014439_640x640.jpg --run_mode=paddle --device=gpu --run_benchmark=True

使用Paddle Inference且使用TensorRT进行测速,执行以下命令:

# 导出模型,使用trt=True
python tools/export_model.py -c configs/yolov7/yolov7_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/yolov7_l_300e_coco.pdparams exclude_nms=True trt=True

# 速度测试,使用run_benchmark=True
python deploy/python/infer.py --model_dir=output_inference/yolov7_l_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True

# tensorRT-FP32测速
python deploy/python/infer.py --model_dir=output_inference/yolov7_l_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True --run_mode=trt_fp32

# tensorRT-FP16测速
python deploy/python/infer.py --model_dir=output_inference/yolov7_l_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_benchmark=True --run_mode=trt_fp16

注意:

  • 导出模型时指定-o exclude_nms=True仅作为测速时用,这样导出的模型其推理部署预测的结果不是最终检出框的结果。
  • 模型库中的速度测试结果为tensorRT-FP16测速后的最快速度,为不包含数据预处理和模型输出后处理(NMS)的耗时。

引用

@article{wang2022yolov7,
  title={{YOLOv7}: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors},
  author={Wang, Chien-Yao and Bochkovskiy, Alexey and Liao, Hong-Yuan Mark},
  journal={arXiv preprint arXiv:2207.02696},
  year={2022}
}