Skip to content

Latest commit

 

History

History
408 lines (310 loc) · 53.2 KB

PaddleYOLO_MODEL.md

File metadata and controls

408 lines (310 loc) · 53.2 KB

简体中文 | English

内容

简介

PaddleYOLO是基于PaddleDetection的YOLO系列模型库,只包含YOLO系列模型的相关代码,支持YOLOv3,PP-YOLO,PP-YOLOv2,PP-YOLOE,PP-YOLOE+,YOLOX,YOLOv5,YOLOv6,YOLOv7,YOLOv8,RTMDet等模型,欢迎一起使用和建设!

更新日志

  • 【2023/01/10】支持YOLOv8预测和部署;
  • 【2022/09/29】支持RTMDet预测和部署;
  • 【2022/09/26】发布PaddleYOLO模型套件;
  • 【2022/09/19】支持YOLOv6新版,包括n/t/s/m/l模型;
  • 【2022/08/23】发布YOLOSeries代码库: 支持YOLOv3,PP-YOLOE,PP-YOLOE+,YOLOX,YOLOv5,YOLOv6,YOLOv7等YOLO模型,支持ConvNeXt骨干网络高精度版PP-YOLOE,YOLOXYOLOv5等模型,支持PaddleSlim无损加速量化训练PP-YOLOE,YOLOv5,YOLOv6YOLOv7等模型,详情可阅读此文章

注意:

  • PaddleYOLO代码库协议为GPL 3.0YOLOv5,YOLOv6,YOLOv7YOLOv8这几类模型代码不合入PaddleDetection,其余YOLO模型推荐在PaddleDetection中使用,会最先发布PP-YOLO系列特色检测模型的最新进展;;
  • PaddleYOLO代码库推荐使用paddlepaddle-2.3.2以上的版本,请参考官网下载对应适合版本,Windows平台请安装paddle develop版本
  • PaddleYOLO 的Roadmap issue用于收集用户的需求,欢迎提出您的建议和需求。
  • 训练自定义数据集请参照文档issue。请首先确保加载了COCO权重作为预训练,YOLO检测模型建议batch_size至少大于64去训练,如果资源不够请换小模型减小模型的输入尺度,为了保障较高检测精度,尽量不要尝试单卡训和总batch_size小于32

模型库

基础模型
网络模型 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
PP-YOLOE-s 640 32 400e 2.9 43.4 60.0 7.93 17.36 model config
PP-YOLOE-s 640 32 300e 2.9 43.0 59.6 7.93 17.36 model config
PP-YOLOE-m 640 28 300e 6.0 49.0 65.9 23.43 49.91 model config
PP-YOLOE-l 640 20 300e 8.7 51.4 68.6 52.20 110.07 model config
PP-YOLOE-x 640 16 300e 14.9 52.3 69.5 98.42 206.59 model config
PP-YOLOE-tiny ConvNeXt 640 16 36e - 44.6 63.3 33.04 13.87 model config
PP-YOLOE+_s 640 8 80e 2.9 43.7 60.6 7.93 17.36 model config
PP-YOLOE+_m 640 8 80e 6.0 49.8 67.1 23.43 49.91 model config
PP-YOLOE+_l 640 8 80e 8.7 52.9 70.1 52.20 110.07 model config
PP-YOLOE+_x 640 8 80e 14.9 54.7 72.0 98.42 206.59 model config
部署模型
网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
PP-YOLOE-s(400epoch) 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE-s 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE-m 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE-l 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE-x 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE+_s 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE+_m 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE+_l 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
PP-YOLOE+_x 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
基础模型
网络模型 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
YOLOX-nano 416 8 300e 2.3 26.1 42.0 0.91 1.08 model config
YOLOX-tiny 416 8 300e 2.8 32.9 50.4 5.06 6.45 model config
YOLOX-s 640 8 300e 3.0 40.4 59.6 9.0 26.8 model config
YOLOX-m 640 8 300e 5.8 46.9 65.7 25.3 73.8 model config
YOLOX-l 640 8 300e 9.3 50.1 68.8 54.2 155.6 model config
YOLOX-x 640 8 300e 16.6 51.8 70.6 99.1 281.9 model config
YOLOX-cdn-tiny 416 8 300e 1.9 32.4 50.2 5.03 6.33 model config
YOLOX-crn-s 640 8 300e 3.0 40.4 59.6 7.7 24.69 model config
YOLOX-s ConvNeXt 640 8 36e - 44.6 65.3 36.2 27.52 model config
部署模型
网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
YOLOx-nano 416 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOx-tiny 416 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOx-s 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOx-m 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOx-l 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOx-x 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
基础模型
网络模型 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
YOLOv5-n 640 16 300e 2.6 28.0 45.7 1.87 4.52 model config
YOLOv5-s 640 16 300e 3.2 37.6 56.7 7.24 16.54 model config
YOLOv5-m 640 16 300e 5.2 45.4 64.1 21.19 49.08 model config
YOLOv5-l 640 16 300e 7.9 48.9 67.1 46.56 109.32 model config
YOLOv5-x 640 16 300e 13.7 50.6 68.7 86.75 205.92 model config
YOLOv5-s ConvNeXt 640 8 36e - 42.4 65.3 34.54 17.96 model config
*YOLOv5p6-n 1280 16 300e - 35.9 54.2 3.25 9.23 model config
*YOLOv5p6-s 1280 16 300e - 44.5 63.3 12.63 33.81 model config
*YOLOv5p6-m 1280 16 300e - 51.1 69.0 35.73 100.21 model config
*YOLOv5p6-l 1280 8 300e - 53.4 71.0 76.77 223.09 model config
*YOLOv5p6-x 1280 8 300e - 54.7 72.4 140.80 420.03 model config
部署模型
网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
YOLOv5-n 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv5-s 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv5-m 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv5-l 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv5-x 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
基础模型
网络网络 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(ms) mAP AP50 Params(M) FLOPs(G) 下载链接 配置文件
*YOLOv6-n 640 16 300e(+300e) 2.0 37.5 53.1 5.07 12.49 model config
*YOLOv6-s 640 32 300e(+300e) 2.7 44.8 61.7 20.18 49.36 model config
*YOLOv6-m 640 32 300e(+300e) - 49.5 66.9 37.74 92.47 model config
*YOLOv6-l(silu) 640 32 300e(+300e) - 52.2 70.2 59.66 149.4 model config
部署模型
网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
yolov6-n 640 (w/ nms) | (w/o nms) (w/ nms) | (w/o nms)
yolov6-s 640 (w/ nms) | (w/o nms) (w/ nms) | (w/o nms)
yolov6-m 640 (w/ nms) | (w/o nms) (w/ nms) | (w/o nms)
yolov6-l(silu) 640 (w/ nms) | (w/o nms) (w/ nms) | (w/o nms)
基础模型
网络模型 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(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 model config
*YOLOv7-X 640 32 300e 12.2 53.0 70.8 71.34 190.08 model config
*YOLOv7P6-W6 1280 16 300e 25.5 54.4 71.8 70.43 360.26 model config
*YOLOv7P6-E6 1280 10 300e 31.1 55.7 73.0 97.25 515.4 model config
*YOLOv7P6-D6 1280 8 300e 37.4 56.1 73.3 133.81 702.92 model config
*YOLOv7P6-E6E 1280 6 300e 48.7 56.5 73.7 151.76 843.52 model config
YOLOv7-tiny 640 32 300e - 37.3 54.5 6.23 6.90 model config
YOLOv7-tiny 416 32 300e - 33.3 49.5 6.23 2.91 model config
YOLOv7-tiny 320 32 300e - 29.1 43.8 6.23 1.73 model config
部署模型
网络模型 输入尺寸 导出后的权重(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)
YOLOv7-tiny 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv7-tiny 416 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv7-tiny 320 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
基础模型
网络网络 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(ms) mAPval
0.5:0.95
mAPval
0.5
Params(M) FLOPs(G) 下载链接 配置文件
*YOLOv8-n 640 16 500e 2.4 37.3 53.0 3.16 8.7 model config
*YOLOv8-s 640 16 500e 3.4 44.9 61.8 11.17 28.6 model config
*YOLOv8-m 640 16 500e 6.5 50.2 67.3 25.90 78.9 model config
*YOLOv8-l 640 16 500e 10.0 52.8 69.6 43.69 165.2 model config
*YOLOv8-x 640 16 500e 15.1 53.8 70.6 68.23 257.8 model config
*YOLOv8-P6-x 1280 16 500e 55.0 - - 97.42 522.93 model config
部署模型
网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
YOLOv8-n 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv8-s 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv8-m 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv8-l 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
YOLOv8-x 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
基础模型
网络网络 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(ms) mAP AP50 Params(M) FLOPs(G) 下载链接 配置文件
*RTMDet-t 640 32 300e 2.8 40.9 57.9 4.90 16.21 model config
*RTMDet-s 640 32 300e 3.3 44.5 62.0 8.89 29.71 model config
*RTMDet-m 640 32 300e 6.4 49.1 66.8 24.71 78.47 model config
*RTMDet-l 640 32 300e 10.2 51.2 68.8 52.31 160.32 model config
*RTMDet-x 640 32 300e 18.0 52.6 70.4 94.86 283.12 model config
部署模型
网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
RTMDet-t 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
RTMDet-s 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
RTMDet-m 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
RTMDet-l 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
RTMDet-x 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)

注意:

  • 所有模型均使用COCO train2017作为训练集,在COCO val2017上验证精度,模型前带*表示训练更新中。
  • 具体精度和速度细节请查看PP-YOLOE,YOLOX,YOLOv5,YOLOv6,YOLOv7其中YOLOv5,YOLOv6,YOLOv7评估并未采用multi_label形式
  • 模型推理耗时(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,具体请参考各自模型主页。
  • 统计FLOPs(G)和Params(M),首先安装PaddleSlim, pip install paddleslim,然后设置runtime.ymlprint_flops: Trueprint_params: True,并且注意确保是单尺度下如640x640,打印的是MACs,FLOPs=2*MACs
  • 各模型导出后的权重以及ONNX,分为带(w)和不带(wo)后处理NMS,都提供了下载链接,请参考各自模型主页下载。w_nms表示带NMS后处理,可以直接使用预测出最终检测框结果如python deploy/python/infer.py --model_dir=ppyoloe_crn_l_300e_coco_w_nms/ --image_file=demo/000000014439.jpg --device=GPUwo_nms表示不带NMS后处理,是测速时使用,如需预测出检测框结果需要找到对应head中的后处理相关代码并修改为如下:
       if self.exclude_nms:
           # `exclude_nms=True` just use in benchmark for speed test
           # return pred_bboxes.sum(), pred_scores.sum() # 原先是这行,现在注释
           return pred_bboxes, pred_scores # 新加这行,表示保留进NMS前的原始结果
       else:
           bbox_pred, bbox_num, _ = self.nms(pred_bboxes, pred_scores)
           return bbox_pred, bbox_num

并重新导出,使用时再另接自己写的NMS后处理

基础模型
网络模型 输入尺寸 图片数/GPU 学习率策略 TRT-FP16-Latency(ms) mAP(0.50,11point) Params(M) FLOPs(G) 下载链接 配置文件
YOLOv5-s 640 16 60e 3.2 80.3 7.24 16.54 下载链接 配置文件
YOLOv7-tiny 640 32 60e 2.6 80.2 6.23 6.90 下载链接 配置文件
YOLOX-s 640 8 40e 3.0 82.9 9.0 26.8 下载链接 配置文件
PP-YOLOE+_s 640 8 30e 2.9 86.7 7.93 17.36 下载链接 配置文件

注意:

  • VOC数据集训练的mAP为mAP(IoU=0.5)的结果,且评估未使用multi_label等trick;
  • 所有YOLO VOC模型均加载各自模型的COCO权重作为预训练,各个配置文件的配置均为默认使用8卡GPU,可作为自定义数据集设置参考,具体精度会因数据集而异;
  • YOLO检测模型建议batch_size至少大于64去训练,如果资源不够请换小模型减小模型的输入尺度,为了保障较高检测精度,尽量不要尝试单卡训和总batch_size小于64
  • Params(M)和FLOPs(G)均为训练时所测,YOLOv7没有s模型,故选用tiny模型;
  • TRT-FP16-Latency(ms)测速相关请查看各YOLO模型的config的主页;

使用指南

下载MS-COCO数据集,官网下载地址为: annotations, train2017, val2017, test2017。 PaddleDetection团队提供的下载链接为:coco(共约22G)和test2017,注意test2017可不下载,评估是使用的val2017。

一键运行全流程

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

model_name=ppyoloe # 可修改,如 yolov7
job_name=ppyoloe_plus_crn_l_300e_coco # 可修改,如 yolov7_tiny_300e_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.训练(单卡/多卡)
# 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.评估
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

# 4.导出模型
CUDA_VISIBLE_DEVICES=0 python tools/export_model.py -c ${config} -o weights=${weights} # exclude_nms=True trt=True

# 5.部署预测
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模式下测速
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导出
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测速
/usr/local/TensorRT-8.0.3.4/bin/trtexec --onnx=${job_name}.onnx --workspace=4096 --avgRuns=10 --shapes=input:1x3x640x640 --fp16
  • 如果想切换模型,只要修改开头两行即可,如:
    model_name=yolov7
    job_name=yolov7_l_300e_coco
    
  • 导出onnx,首先安装Paddle2ONNXpip install paddle2onnx
  • 统计FLOPs(G)和Params(M),首先安装PaddleSlimpip install paddleslim,然后设置runtime.ymlprint_flops: Trueprint_params: True,并且注意确保是单尺度下如640x640,打印的是MACs,FLOPs=2*MACs

自定义数据集

数据集准备:

1.自定义数据集的标注制作,请参考DetAnnoTools;

2.自定义数据集的训练准备,请参考PrepareDataSet

fintune训练:

除了更改数据集的路径外,训练一般推荐加载对应模型的COCO预训练权重去fintune,会更快收敛和达到更高精度,如:

# 单卡fintune训练:
# CUDA_VISIBLE_DEVICES=0 python tools/train.py -c ${config} --eval --amp -o pretrain_weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams

# 多卡fintune训练:
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 -o pretrain_weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams

注意:

  • fintune训练一般会提示head分类分支最后一层卷积的通道数没对应上,属于正常情况,是由于自定义数据集一般和COCO数据集种类数不一致;
  • fintune训练一般epoch数可以设置更少,lr设置也更小点如1/10,最高精度可能出现在中间某个epoch;

预测和导出:

使用自定义数据集预测和导出模型时,如果TestDataset数据集路径设置不正确会默认使用COCO 80类。 除了TestDataset数据集路径设置正确外,也可以自行修改和添加对应的label_list.txt文件(一行记录一个对应种类),TestDataset中的anno_path也可设置为绝对路径,如:

TestDataset:
  !ImageFolder
    anno_path: label_list.txt # 如不使用dataset_dir,则anno_path即为相对于PaddleDetection主目录的相对路径
    # dataset_dir: dataset/my_coco # 如使用dataset_dir,则dataset_dir/anno_path作为新的anno_path

label_list.txt里的一行记录一个对应种类,如下所示:

person
vehicle