Skip to content

Latest commit

 

History

History
239 lines (160 loc) · 14.8 KB

README_cn.md

File metadata and controls

239 lines (160 loc) · 14.8 KB

简体中文 | English

PP-YOLOE

内容

简介

PP-YOLOE是基于PP-YOLOv2的卓越的单阶段Anchor-free模型,超越了多种流行的YOLO模型。PP-YOLOE有一系列的模型,即s/m/l/x,可以通过width multiplier和depth multiplier配置。PP-YOLOE避免了使用诸如Deformable Convolution或者Matrix NMS之类的特殊算子,以使其能轻松地部署在多种多样的硬件上。更多细节可以参考我们的report

PP-YOLOE-l在COCO test-dev2017达到了51.6的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE-s/m/x同样具有卓越的精度速度性价比, 其精度速度可以在模型库中找到。

PP-YOLOE由以下方法组成

模型库

模型 Epoch GPU个数 每GPU图片个数 骨干网络 输入尺寸 Box APval
0.5:0.95
Box APtest
0.5:0.95
Params(M) FLOPs(G) V100 FP32(FPS) V100 TensorRT FP16(FPS) 模型下载 配置文件
PP-YOLOE-s 400 8 32 cspresnet-s 640 43.4 43.6 7.93 17.36 208.3 333.3 model config
PP-YOLOE-s 300 8 32 cspresnet-s 640 43.0 43.2 7.93 17.36 208.3 333.3 model config
PP-YOLOE-m 300 8 28 cspresnet-m 640 49.0 49.1 23.43 49.91 123.4 208.3 model config
PP-YOLOE-l 300 8 20 cspresnet-l 640 51.4 51.6 52.20 110.07 78.1 149.2 model config
PP-YOLOE-x 300 8 16 cspresnet-x 640 52.3 52.4 98.42 206.59 45.0 95.2 model config

综合指标

模型 Epoch AP0.5:0.95 AP0.5 AP0.75 APsmall APmedium APlarge ARsmall ARmedium ARlarge 模型下载 配置文件
PP-YOLOE-s 400 43.4 60.0 47.5 25.7 47.8 59.2 43.9 70.8 81.9 model config
PP-YOLOE-s 300 43.0 59.6 47.2 26.0 47.4 58.7 45.1 70.6 81.4 model config
PP-YOLOE-m 300 49.0 65.9 53.8 30.9 53.5 65.3 50.9 74.4 84.7 model config
PP-YOLOE-l 300 51.4 68.6 56.2 34.8 56.1 68.0 53.1 76.8 85.6 model config
PP-YOLOE-x 300 52.3 69.5 56.8 35.1 57.0 68.6 55.5 76.9 85.7 model config

注意:

  • PP-YOLOE模型使用COCO数据集中train2017作为训练集,使用val2017和test-dev2017作为测试集。
  • 综合指标的表格与模型库的表格里的模型权重是同一个权重,综合指标是使用val2017作为验证精度的。
  • PP-YOLOE模型训练过程中使用8 GPUs进行混合精度训练,如果GPU卡数或者batch size发生了改变,你需要按照公式 lrnew = lrdefault * (batch_sizenew * GPU_numbernew) / (batch_sizedefault * GPU_numberdefault) 调整学习率。
  • PP-YOLOE模型推理速度测试采用单卡V100,batch size=1进行测试,使用CUDA 10.2, CUDNN 7.6.5,TensorRT推理速度测试使用TensorRT 6.0.1.8
  • 参考速度测试以复现PP-YOLOE推理速度测试结果。
  • 如果你设置了--run_benchmark=True, 你首先需要安装以下依赖pip install pynvml psutil GPUtil

垂类应用模型

PaddleDetection团队提供了基于PP-YOLOE的各种垂类检测模型的配置文件和权重,用户可以下载进行使用:

场景 相关数据集 链接
行人检测 CrowdHuman pphuman
车辆检测 BDD100K、UA-DETRAC ppvehicle
小目标检测 VisDrone visdrone

使用说明

训练

执行以下指令使用混合精度训练PP-YOLOE

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

注意: 使用默认配置训练需要设置--amp以避免显存溢出.

评估

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

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

在coco test-dev2017上评估,请先从COCO数据集下载下载COCO test-dev2017数据集,然后解压到COCO数据集文件夹并像configs/ppyolo/ppyolo_test.yml一样配置EvalDataset

推理

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

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

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

模型导出

PP-YOLOE在GPU上部署或者速度测试需要通过tools/export_model.py导出模型。

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

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

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

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

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

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

# 安装paddle2onnx
pip install paddle2onnx

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

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

速度测试

为了公平起见,在模型库中的速度测试结果均为不包含数据预处理和模型输出后处理(NMS)的数据(与YOLOv4(AlexyAB)测试方法一致),需要在导出模型时指定-o exclude_nms=True.

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

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

# 速度测试,使用run_benchmark=True
CUDA_VISIBLE_DEVICES=0 python deploy/python/infer.py --model_dir=output_inference/ppyoloe_crn_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/ppyoloe/ppyoloe_crn_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams exclude_nms=True trt=True

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

使用 ONNX 和 TensorRT 进行测速,执行以下命令:

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

# 转化成ONNX格式
paddle2onnx --model_dir output_inference/ppyoloe_crn_s_300e_coco --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 12 --save_file ppyoloe_crn_s_300e_coco.onnx

# 测试速度,半精度,batch_size=1
trtexec --onnx=./ppyoloe_crn_s_300e_coco.onnx --saveEngine=./ppyoloe_s_bs1.engine --workspace=1024 --avgRuns=1000 --shapes=image:1x3x640x640,scale_factor:1x2 --fp16

# 测试速度,半精度,batch_size=32
trtexec --onnx=./ppyoloe_crn_s_300e_coco.onnx --saveEngine=./ppyoloe_s_bs32.engine --workspace=1024 --avgRuns=1000 --shapes=image:32x3x640x640,scale_factor:32x2 --fp16

# 使用上边的脚本, 在T4 和 TensorRT 7.2的环境下,PPYOLOE-s模型速度如下
# batch_size=1, 2.80ms, 357fps
# batch_size=32, 67.69ms, 472fps

部署

PP-YOLOE可以使用以下方式进行部署:

接下来,我们将介绍PP-YOLOE如何使用Paddle Inference在TensorRT FP16模式下部署

首先,参考Paddle Inference文档,下载并安装与你的CUDA, CUDNN和TensorRT相应的wheel包。

然后,运行以下命令导出模型

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

最后,使用TensorRT FP16进行推理

# 推理单张图片
CUDA_VISIBLE_DEVICES=0 python deploy/python/infer.py --model_dir=output_inference/ppyoloe_crn_l_300e_coco --image_file=demo/000000014439_640x640.jpg --device=gpu --run_mode=trt_fp16

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

注意:

  • TensorRT会根据网络的定义,执行针对当前硬件平台的优化,生成推理引擎并序列化为文件。该推理引擎只适用于当前软硬件平台。如果你的软硬件平台没有发生变化,你可以设置enable_tensorrt_engine的参数use_static=True,这样生成的序列化文件将会保存在output_inference文件夹下,下次执行TensorRT时将加载保存的序列化文件。
  • PaddleDetection release/2.4及其之后的版本将支持NMS调用TensorRT,需要依赖PaddlePaddle release/2.3及其之后的版本

泛化性验证

模型 AP AP50
YOLOX 22.6 37.5
YOLOv5 26.0 42.7
PP-YOLOE 30.5 46.4

注意

  • 试验使用VisDrone数据集, 并且检测其中的9类,包括 person, bicycles, car, van, truck, tricyle, awning-tricyle, bus, motor.
  • 以上模型训练均采用官方提供的默认参数,并且加载COCO预训练参数
  • 由于人力/时间有限,后续将会持续补充更多验证结果,也欢迎各位开源用户贡献,共同优化PP-YOLOE

附录

PP-YOLOE消融实验

序号 模型 Box APval 参数量(M) FLOPs(G) V100 FP32 FPS
A PP-YOLOv2 49.1 54.58 115.77 68.9
B A + Anchor-free 48.8 54.27 114.78 69.8
C B + CSPRepResNet 49.5 47.42 101.87 85.5
D C + TAL 50.4 48.32 104.75 84.0
E D + ET-Head 50.9 52.20 110.07 78.1