PaddleYOLO

February 8, 2023 · View on GitHub

简体中文 | English

PaddleYOLO

内容

简介

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

更新日志

  • 【2022/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

模型库

PP-YOLOE

基础模型
网络模型输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAPval
0.5:0.95
mAPval
0.5
Params(M)FLOPs(G)下载链接配置文件
PP-YOLOE-s64032400e2.943.460.07.9317.36modelconfig
PP-YOLOE-s64032300e2.943.059.67.9317.36modelconfig
PP-YOLOE-m64028300e6.049.065.923.4349.91modelconfig
PP-YOLOE-l64020300e8.751.468.652.20110.07modelconfig
PP-YOLOE-x64016300e14.952.369.598.42206.59modelconfig
PP-YOLOE-tiny ConvNeXt6401636e-44.663.333.0413.87modelconfig
PP-YOLOE+_s640880e2.943.760.67.9317.36modelconfig
PP-YOLOE+_m640880e6.049.867.123.4349.91modelconfig
PP-YOLOE+_l640880e8.752.970.152.20110.07modelconfig
PP-YOLOE+_x640880e14.954.772.098.42206.59modelconfig
部署模型
网络模型输入尺寸导出后的权重(w/o NMS)ONNX(w/o NMS)
PP-YOLOE-s(400epoch)640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE-s640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE-m640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE-l640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE-x640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE+_s640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE+_m640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE+_l640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
PP-YOLOE+_x640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)

YOLOX

基础模型
网络模型输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAPval
0.5:0.95
mAPval
0.5
Params(M)FLOPs(G)下载链接配置文件
YOLOX-nano4168300e2.326.142.00.911.08modelconfig
YOLOX-tiny4168300e2.832.950.45.066.45modelconfig
YOLOX-s6408300e3.040.459.69.026.8modelconfig
YOLOX-m6408300e5.846.965.725.373.8modelconfig
YOLOX-l6408300e9.350.168.854.2155.6modelconfig
YOLOX-x6408300e16.651.870.699.1281.9modelconfig
YOLOX-cdn-tiny4168300e1.932.450.25.036.33modelconfig
YOLOX-crn-s6408300e3.040.459.67.724.69modelconfig
YOLOX-s ConvNeXt640836e-44.665.336.227.52modelconfig
部署模型
网络模型输入尺寸导出后的权重(w/o NMS)ONNX(w/o NMS)
YOLOx-nano416( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOx-tiny416( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOx-s640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOx-m640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOx-l640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOx-x640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)

YOLOv5

基础模型
网络模型输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAPval
0.5:0.95
mAPval
0.5
Params(M)FLOPs(G)下载链接配置文件
YOLOv5-n64016300e2.628.045.71.874.52modelconfig
YOLOv5-s64016300e3.237.656.77.2416.54modelconfig
YOLOv5-m64016300e5.245.464.121.1949.08modelconfig
YOLOv5-l64016300e7.948.967.146.56109.32modelconfig
YOLOv5-x64016300e13.750.668.786.75205.92modelconfig
YOLOv5-s ConvNeXt640836e-42.465.334.5417.96modelconfig
*YOLOv5p6-n128016300e-35.954.23.259.23modelconfig
*YOLOv5p6-s128016300e-44.563.312.6333.81modelconfig
*YOLOv5p6-m128016300e-51.169.035.73100.21modelconfig
*YOLOv5p6-l12808300e-53.471.076.77223.09modelconfig
*YOLOv5p6-x12808300e-54.772.4140.80420.03modelconfig
部署模型
网络模型输入尺寸导出后的权重(w/o NMS)ONNX(w/o NMS)
YOLOv5-n640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv5-s640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv5-m640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv5-l640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv5-x640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)

YOLOv6

基础模型
网络网络输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAPAP50Params(M)FLOPs(G)下载链接配置文件
*YOLOv6-n64016300e(+300e)2.037.553.15.0712.49modelconfig
*YOLOv6-s64032300e(+300e)2.744.861.720.1849.36modelconfig
*YOLOv6-m64032300e(+300e)-49.566.937.7492.47modelconfig
*YOLOv6-l(silu)64032300e(+300e)-52.270.259.66149.4modelconfig
部署模型
网络模型输入尺寸导出后的权重(w/o NMS)ONNX(w/o NMS)
yolov6-n640(w/ nms) | (w/o nms)(w/ nms) | (w/o nms)
yolov6-s640(w/ nms) | (w/o nms)(w/ nms) | (w/o nms)
yolov6-m640(w/ nms) | (w/o nms)(w/ nms) | (w/o nms)
yolov6-l(silu)640(w/ nms) | (w/o nms)(w/ nms) | (w/o nms)

YOLOv7

基础模型
网络模型输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAPval
0.5:0.95
mAPval
0.5
Params(M)FLOPs(G)下载链接配置文件
YOLOv7-L64032300e7.451.070.237.62106.08modelconfig
*YOLOv7-X64032300e12.253.070.871.34190.08modelconfig
*YOLOv7P6-W6128016300e25.554.471.870.43360.26modelconfig
*YOLOv7P6-E6128010300e31.155.773.097.25515.4modelconfig
*YOLOv7P6-D612808300e37.456.173.3133.81702.92modelconfig
*YOLOv7P6-E6E12806300e48.756.573.7151.76843.52modelconfig
YOLOv7-tiny64032300e-37.354.56.236.90modelconfig
YOLOv7-tiny41632300e-33.349.56.232.91modelconfig
YOLOv7-tiny32032300e-29.143.86.231.73modelconfig
部署模型
网络模型输入尺寸导出后的权重(w/o NMS)ONNX(w/o NMS)
YOLOv7-l640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7-x640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7P6-W61280( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7P6-E61280( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7P6-D61280( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7P6-E6E1280( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7-tiny640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7-tiny416( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv7-tiny320( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)

YOLOv8

基础模型
网络网络输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAPval
0.5:0.95
mAPval
0.5
Params(M)FLOPs(G)下载链接配置文件
*YOLOv8-n64016500e2.437.353.03.168.7modelconfig
*YOLOv8-s64016500e3.444.961.811.1728.6modelconfig
*YOLOv8-m64016500e6.550.267.325.9078.9modelconfig
*YOLOv8-l64016500e10.052.869.643.69165.2modelconfig
*YOLOv8-x64016500e15.153.870.668.23257.8modelconfig
*YOLOv8-P6-x128016500e55.0--97.42522.93modelconfig
部署模型
网络模型输入尺寸导出后的权重(w/o NMS)ONNX(w/o NMS)
YOLOv8-n640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv8-s640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv8-m640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv8-l640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
YOLOv8-x640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)

RTMDet

基础模型
网络网络输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAPAP50Params(M)FLOPs(G)下载链接配置文件
*RTMDet-t64032300e2.840.957.94.9016.21modelconfig
*RTMDet-s64032300e3.344.562.08.8929.71modelconfig
*RTMDet-m64032300e6.449.166.824.7178.47modelconfig
*RTMDet-l64032300e10.251.268.852.31160.32modelconfig
*RTMDet-x64032300e18.052.670.494.86283.12modelconfig
部署模型
网络模型输入尺寸导出后的权重(w/o NMS)ONNX(w/o NMS)
RTMDet-t640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
RTMDet-s640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
RTMDet-m640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
RTMDet-l640( w/ nms) | ( w/o nms)( w/ nms) | ( w/o nms)
RTMDet-x640( 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后处理

VOC

基础模型
网络模型输入尺寸图片数/GPU学习率策略TRT-FP16-Latency(ms)mAP(0.50,11point)Params(M)FLOPs(G)下载链接配置文件
YOLOv5-s6401660e3.280.37.2416.54下载链接配置文件
YOLOv7-tiny6403260e2.680.26.236.90下载链接配置文件
YOLOX-s640840e3.082.99.026.8下载链接配置文件
PP-YOLOE+_s640830e2.986.77.9317.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