Skip to content

Latest commit

 

History

History
326 lines (249 loc) · 41.2 KB

YOLOSERIES_MODEL.md

File metadata and controls

326 lines (249 loc) · 41.2 KB

简体中文 | English

内容

简介

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

更新日志

  • 【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,YOLOv7YOLOv6这3类模型代码不合入PaddleDetection,其余YOLO模型推荐在PaddleDetection中使用,会最先发布PP-YOLO系列特色检测模型的最新进展;;
  • PaddleYOLO代码库推荐使用paddlepaddle-2.3.2以上的版本,请参考官网下载对应适合版本,Windows平台请安装paddle develop版本

技术交流

  • 如果你发现任何PaddleDetection存在的问题或者是建议, 欢迎通过GitHub Issues给我们提issues。

  • 欢迎加入PaddleDetection 微信用户群(扫码填写问卷即可入群)

    • 入群福利 💎:获取PaddleDetection团队整理的重磅学习大礼包🎁
      • 📊 福利一:获取飞桨联合业界企业整理的开源数据集
      • 👨‍🏫 福利二:获取PaddleDetection历次发版直播视频与最新直播咨询
      • 🗳 福利三:获取垂类场景预训练模型集合,包括工业、安防、交通等5+行业场景
      • 🗂 福利四:获取10+全流程产业实操范例,覆盖火灾烟雾检测、人流量计数等产业高频场景

模型库

基础模型
网络模型 输入尺寸 图片数/GPU 学习率策略 推理耗时(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 学习率策略 推理耗时(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 学习率策略 推理耗时(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 8 300e 3.2 37.0 55.9 7.24 16.54 model config
YOLOv5-m 640 5 300e 5.2 45.3 63.8 21.19 49.08 model config
YOLOv5-l 640 3 300e 7.9 48.6 66.9 46.56 109.32 model config
YOLOv5-x 640 2 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
部署模型
网络模型 输入尺寸 导出后的权重(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 学习率策略 模型推理耗时(ms) mAP AP50 Params(M) FLOPs(G) 下载链接 配置文件
*YOLOv6-n 416 32 400e 1.0 31.1 45.3 4.74 5.16 model config
*YOLOv6-n 640 32 400e 1.3 36.1 51.9 4.74 12.21 model config
*YOLOv6-t 640 32 400e 2.1 40.7 57.4 10.63 27.29 model config
*YOLOv6-s 640 32 400e 2.6 43.4 60.5 18.87 48.35 model config
*YOLOv6-m 640 32 300e 5.0 49.0 66.5 37.17 88.82 model config
*YOLOv6-l 640 32 300e 7.9 51.0 68.9 63.54 155.89 model config
*YOLOv6-l-silu 640 32 300e 9.6 51.7 69.6 58.59 142.66 model config
部署模型
网络模型 输入尺寸 导出后的权重(w/o NMS) ONNX(w/o NMS)
yolov6-n 416 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
yolov6-n 640 ( w/ nms) | ( w/o nms) ( w/ nms) | ( w/o nms)
yolov6-t 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 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 学习率策略 推理耗时(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)

注意:

  • 所有模型均使用COCO train2017作为训练集,在COCO val2017上验证精度,模型前带*表示训练更新中。
  • 具体精度和速度细节请查看PP-YOLOE,YOLOX,YOLOv5,YOLOv6,YOLOv7其中YOLOv5,YOLOv6,YOLOv7评估并未采用multi_label形式
  • 模型推理耗时(ms)为TensorRT-FP16下测试的耗时,不包含数据预处理和模型输出后处理(NMS)的耗时。测试采用单卡V100,batch size=1,测试环境为paddlepaddle-2.3.0, CUDA 11.2, CUDNN 8.2, GCC-8.2, TensorRT 8.0.3.4,具体请参考各自模型主页。
  • 统计FLOPs(G),首先安装PaddleSlim, pip install paddleslim,然后设置runtime.ymlprint_flops: 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后处理

使用指南

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

一键运行全流程

model_type=ppyoloe # 可修改,如 yolov7
job_name=ppyoloe_crn_l_300e_coco # 可修改,如 yolov7_l_300e_coco

config=configs/${model_type}/${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 python3.7 tools/train.py -c ${config} --eval --amp
python3.7 -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 python3.7 tools/eval.py -c ${config} -o weights=${weights} --classwise

# 3.直接预测
CUDA_VISIBLE_DEVICES=0 python3.7 tools/infer.py -c ${config} -o weights=${weights} --infer_img=demo/000000014439_640x640.jpg --draw_threshold=0.5

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

# 5.部署预测
CUDA_VISIBLE_DEVICES=0 python3.7 deploy/python/infer.py --model_dir=output_inference/${job_name} --image_file=demo/000000014439_640x640.jpg --device=GPU

# 6.部署测速
CUDA_VISIBLE_DEVICES=0 python3.7 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

注意:

  • 将以上命令写在一个脚本文件里如run.sh,一键运行命令为:sh run.sh,也可命令行一句句去运行。
  • 如果想切换模型,只要修改开头两行即可,如:
    model_type=yolov7
    job_name=yolov7_l_300e_coco
    
  • 统计FLOPs(G),首先安装PaddleSlim, pip install paddleslim,然后设置runtime.ymlprint_flops: True,并且注意确保是单尺度下如640x640,打印的是MACs,FLOPs=2*MACs

自定义数据集

数据集准备:

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

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

fintune训练:

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

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

# 多卡fintune训练:
python3.7 -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