前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PPYOLO、PPYOLOv2、PPYOLOE的pytorch实现三合一!尽在miemiedetection!

PPYOLO、PPYOLOv2、PPYOLOE的pytorch实现三合一!尽在miemiedetection!

作者头像
3D视觉工坊
发布2022-06-28 18:16:44
5390
发布2022-06-28 18:16:44
举报
文章被收录于专栏:3D视觉从入门到精通

本文为52CV粉丝投稿,编辑:我爱计算机视觉

大家好!今天给大家安利一个宝藏仓库miemiedetection ,该仓库实现了PPYOLO、PPYOLOv2、PPYOLOE三个算法一键三连,还请大家点个star!

miemiedetection是咩酱基于YOLOX进行二次开发的个人检测库(使用的深度学习框架为pytorch),实现了可变形卷积DCNv2、Matrix NMS等高难度算子,支持单机单卡、单机多卡、多机多卡训练模式(多卡训练模式建议使用Linux系统),支持Windows、Linux系统,以咩酱的名字命名。miemiedetection是一个不需要安装的检测库用户可以直接更改其代码改变执行逻辑,所见即所得!所以往miemiedetection里加入新的算法是一件很容易的事情(可以参考PPYOLO的写法往miemiedetection里加入新的算法)。得益于YOLOX的优秀架构,miemiedetection里的算法训练速度都非常快,数据读取不再是训练速度的瓶颈!目前miemiedetection支持YOLOX、PPYOLO、PPYOLOv2、PPYOLOE等算法,预计未来会加入更多算法,所以请大家点个star吧!

首先,这3个PPYOLO模型均经过了loss对齐、梯度对齐的实验,你也可以在源码中看到我注释掉的读写*.npz 的代码,都是做对齐实验遗留的代码。所以,说它们是如假包换的PPYOLO算法一点都不过分,因为它们拥有和原版仓库一样的损失、一样的梯度。另外,我也试着用原版仓库和miemiedetection迁移学习voc2012数据集,获得了一样的精度(使用了相同的超参数),训练日志在train_ppyolo_in_voc2012文件夹里,相关命令可以查看“训练自定义数据集”小节。证明了复现PPYOLO系列算法的正确性!

和原版实现一样,咩酱使用了同样的学习率、同样的学习率衰减策略warm_piecewisedecay(PPYOLO和PPYOLOv2使用)和warm_cosinedecay(PPYOLOE使用)、同样的指数滑动平均EMA、同样的数据预处理方式、同样的参数L2权重衰减、同样的损失、同样的梯度、同样的预训练模型,迁移学习得到了同样的精度。实验做得足,测试做得多,保证大家有美好的使用体验!不要998,不要998,只要你点个star,就能把3个算法带回家!如何使用miemiedetection呢?咩酱详细道来!

获取预训练模型(转换权重)

读者可以到【我爱计算机视觉】公众号后台回复『mie』下载转换好的*.pth权重文件。

或者按照下面的步骤获取:

第一步,下载权重文件,项目根目录下执行(即下载文件,Windows用户可以用迅雷或浏览器下载wget后面的链接,这里为了展现美观,只以ppyoloe_crn_l_300e_coco为例):

代码语言:javascript
复制
wget https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams
wget https://paddledet.bj.bcebos.com/models/pretrained/CSPResNetb_l_pretrained.pdparams

注意,带有pretrained字样的模型是在ImageNet上预训练的骨干网路,PPYOLO、PPYOLOv2、PPYOLOE加载这些权重以训练COCO数据集。其余为COCO上的预训练模型。

第二步,转换权重,项目根目录下执行:

代码语言:javascript
复制
python tools/convert_weights.py -f exps/ppyoloe/ppyoloe_crn_l_300e_coco.py -c ppyoloe_crn_l_300e_coco.pdparams -oc ppyoloe_crn_l_300e_coco.pth -nc 80
python tools/convert_weights.py -f exps/ppyoloe/ppyoloe_crn_l_300e_coco.py -c CSPResNetb_l_pretrained.pdparams -oc CSPResNetb_l_pretrained.pth -nc 80 --only_backbone True

参数解释:

  • -f表示的是使用的配置文件;
  • -c表示的是读取的源权重文件;
  • -oc表示的是输出(保存)的pytorch权重文件;
  • -nc表示的是数据集的类别数;
  • --only_backbone为True时表示只转换骨干网络的权重;

执行完毕后就会在项目根目录下获得转换好的*.pth权重文件。

配置文件详解

在下面的命令中,大部分都会使用模型的配置文件,所以一开始就有必要先详细解释配置文件。

  • mmdet.exp.base_exp.BaseExp为配置文件基类,是一个抽象类,声明了一堆抽象方法,如get_model()表示如何获取模型,get_data_loader()表示如何获取训练的dataloader,get_optimizer()表示如何获取优化器等等。
  • mmdet.exp.datasets.coco_base.COCOBaseExp是数据集的配置,继承了BaseExp,它只给出数据集的配置。本仓库只支持COCO标注格式的数据集的训练!其它标注格式的数据集,需要先转换成COCO标注格式,才能训练(支持太多标注格式的话,工作量太大)。如何把自定义数据集转换成COCO标注格式,可以看miemieLabels 。所有的检测算法配置类都会继COCOBaseExp,表示所有的检测算法共用同样的数据集的配置。

COCOBaseExp的配置项有:

代码语言:javascript
复制
        self.num_classes = 80
        self.data_dir = '../COCO'
        self.cls_names = 'class_names/coco_classes.txt'
        self.ann_folder = "annotations"
        self.train_ann = "instances_train2017.json"
        self.val_ann = "instances_val2017.json"
        self.train_image_folder = "train2017"
        self.val_image_folder = "val2017"
  • self.num_classes表示的是数据集的类别数;
  • self.data_dir表示的是数据集的根目录;
  • self.cls_names表示的是数据集的类别名文件路径,是一个txt文件,一行表示一个类别名。如果是自定义数据集,需要新建一个txt文件并编辑好类别名,再修改self.cls_names指向它;
  • self.ann_folder表示的是数据集的注解文件根目录,需要位于self.data_dir目录下;
  • self.train_ann表示的是数据集的训练集的注解文件名,需要位于self.ann_folder目录下;
  • self.val_ann表示的是数据集的验证集的注解文件名,需要位于self.ann_folder目录下;
  • self.train_image_folder表示的是数据集的训练集的图片文件夹名,需要位于self.data_dir目录下;
  • self.val_image_folder表示的是数据集的验证集的图片文件夹名,需要位于self.data_dir目录下;

另外,自带有一个VOC2012数据集的配置,把

代码语言:javascript
复制
        # self.num_classes = 20
        # self.data_dir = '../VOCdevkit/VOC2012'
        # self.cls_names = 'class_names/voc_classes.txt'
        # self.ann_folder = "annotations2"
        # self.train_ann = "voc2012_train.json"
        # self.val_ann = "voc2012_val.json"
        # self.train_image_folder = "JPEGImages"
        # self.val_image_folder = "JPEGImages"

解除注释,注释掉COCO数据集的配置,就是使用VOC2012数据集了。

另外,你也可以像exps/ppyoloe/ppyoloe_crn_l_voc2012.py中一样,在子类中修改self.num_classes、self.data_dir这些数据集的配置,这样COCOBaseExp的配置就被覆盖掉(无效)了。

voc2012_train.json、voc2012_val.json是我个人转换好的COCO标注格式的注解文件,可以到【我爱计算机视觉】公众号后台回复『mie』下载。

下载好后,在VOC2012数据集的self.data_dir目录下新建一个文件夹annotations2,把voc2012_train.json、voc2012_val.json放进这个文件夹。

所以,COCO数据集、VOC2012数据集、本项目的放置位置应该是这样:

代码语言:javascript
复制
D://GitHub
     |------COCO
     |        |------annotations
     |        |------test2017
     |        |------train2017
     |        |------val2017
     |
     |------VOCdevkit
     |        |------VOC2007
     |        |        |------Annotations
     |        |        |------ImageSets
     |        |        |------JPEGImages
     |        |        |------SegmentationClass
     |        |        |------SegmentationObject
     |        |
     |        |------VOC2012
     |                 |------Annotations
     |                 |------annotations2
     |                 |         |----------voc2012_train.json
     |                 |         |----------voc2012_val.json
     |                 |------ImageSets
     |                 |------JPEGImages
     |                 |------SegmentationClass
     |                 |------SegmentationObject
     |
     |------miemiedetection-master
              |------assets
              |------class_names
              |------mmdet
              |------tools
              |------...

数据集根目录和miemiedetection-master是同一级目录。我个人非常不建议把数据集放在miemiedetection-master里,那样的话PyCharm打开会巨卡无比;而且,多个项目(如mmdetection、PaddleDetection、AdelaiDet)共用数据集时,可以做到数据集路径和项目名无关。

  • mmdet.exp.ppyolo.ppyolo_method_base.PPYOLO_Method_Exp是实现具体算法所有抽象方法的类,继承了COCOBaseExp,它实现了所有抽象方法。
  • exp.ppyolo.ppyolo_r50vd_2x.Exp是PPYOLO算法的Resnet50Vd模型的最终配置类,继承了PPYOLO_Method_Exp;

PPYOLOE的配置文件也是类似这样的结构。

预测

(1)预测一张图片,项目根目录下执行:

代码语言:javascript
复制
python tools/demo.py image -f exps/ppyoloe/ppyoloe_crn_l_300e_coco.py -c ppyoloe_crn_l_300e_coco.pth --path assets/000000000019.jpg --conf 0.15 --tsize 640 --save_result --device gpu

参数解释:

  • -f表示的是使用的配置文件;
  • -c表示的是读取的权重文件;
  • --path表示的是图片的路径;
  • --conf表示的是分数阈值,只会画出高于这个阈值的预测框;
  • --tsize表示的是预测时将图片Resize成--tsize的分辨率;

预测完成后控制台会打印结果图片的保存路径,用户可打开查看。如果是使用训练自定义数据集保存的模型进行预测,修改-c为你的模型的路径即可。

(2)预测图片文件夹,项目根目录下执行:

代码语言:javascript
复制
python tools/demo.py image -f exps/ppyolo/ppyolo_r18vd.py -c ppyolo_r18vd.pth --path assets --conf 0.15 --tsize 416 --save_result --device gpu

很简单,--path改成图片文件夹的路径即可。

训练COCO数据集

如果读取ImageNet预训练骨干网络训练COCO数据集,项目根目录下执行:

代码语言:javascript
复制
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
python tools/train.py -f exps/ppyoloe/ppyoloe_crn_l_300e_coco.py -d 8 -b 160 -eb 16 -c CSPResNetb_l_pretrained.pth --fp16

非常简单,一条命令启动单机8卡训练,你需要有一台单机8卡的超算,Money is all you need!

参数解释:

  • -f表示的是使用的配置文件;
  • -d表示的是显卡数量;
  • -b表示的是训练时的批大小(所有卡的);
  • -eb表示的是评估时的批大小(所有卡的);
  • -c表示的是读取的权重文件;

其它可选的参数:

  • --fp16,自动混合精度训练;
  • --num_machines,机器数量,建议单机多卡训练;
  • --resume表示的是是否是恢复训练;

训练自定义数据集

建议读取COCO预训练权重进行训练,因为收敛快。以上述的VOC2012数据集为例,

一、ppyolo_r50vd模型

(1)如果是1机1卡,输入命令开始训练:

代码语言:javascript
复制
python tools/train.py -f exps/ppyolo/ppyolo_r50vd_voc2012.py -d 1 -b 8 -eb 4 -c ppyolo_r50vd_2x.pth

如果训练因为某些原因中断,想要读取之前保存的模型恢复训练,只要修改-c,加上--resume,输入:

代码语言:javascript
复制
python tools/train.py -f exps/ppyolo/ppyolo_r50vd_voc2012.py -d 1 -b 8 -eb 4 -c PPYOLO_outputs/ppyolo_r50vd_voc2012/13.pth --resume

修改-c成你要读取的模型的路径即可。

(2)如果是2机2卡(每台机上1张卡), 0号机输入以下命令:

代码语言:javascript
复制
CUDA_VISIBLE_DEVICES=0
python tools/train.py -f exps/ppyolo/ppyolo_r50vd_voc2012.py --dist-url tcp://192.168.0.107:12312 --num_machines 2 --machine_rank 0 -b 8 -eb 4 -c ppyolo_r50vd_2x.pth

1号机输入以下命令:

代码语言:javascript
复制
CUDA_VISIBLE_DEVICES=0
python tools/train.py -f exps/ppyolo/ppyolo_r50vd_voc2012.py --dist-url tcp://192.168.0.107:12312 --num_machines 2 --machine_rank 1 -b 8 -eb 4 -c ppyolo_r50vd_2x.pth

你需要把上面2条命令的192.168.0.107改成0号机的局域网ip。

(3)如果是1机2卡,输入命令开始训练:

代码语言:javascript
复制
CUDA_VISIBLE_DEVICES=0,1
nohup python tools/train.py -f exps/ppyolo/ppyolo_r50vd_voc2012.py -d 2 -b 8 -eb 2 -c ppyolo_r50vd_2x.pth     > ppyolo.log 2>&1 &

迁移学习VOC2012数据集,实测ppyolo_r50vd_2x的AP(0.50:0.95)可以到达0.59+、AP(0.50)可以到达0.82+、AP(small)可以到达0.18+。不管是单卡还是多卡,都能得到这个结果。迁移学习时和PaddleDetection获得了一样的精度、一样的收敛速度,二者的训练日志位于train_ppyolo_in_voc2012文件夹下。

二、ppyoloe_l模型

(1)如果是1机1卡,输入命令开始训练(冻结了骨干网络):

代码语言:javascript
复制
python tools/train.py -f exps/ppyoloe/ppyoloe_crn_l_voc2012.py -d 1 -b 8 -eb 2 -c ppyoloe_crn_l_300e_coco.pth --fp16

(2)如果是1机2卡,输入命令开始训练(冻结了骨干网络):

代码语言:javascript
复制
CUDA_VISIBLE_DEVICES=0,1
nohup python tools/train.py -f exps/ppyoloe/ppyoloe_crn_l_voc2012.py -d 2 -b 8 -eb 2 -c ppyoloe_crn_l_300e_coco.pth --fp16     > ppyoloe_l.log 2>&1 &

迁移学习VOC2012数据集,实测ppyoloe_l的AP(0.50:0.95)可以到达0.66+、AP(0.50)可以到达0.85+、AP(small)可以到达0.28+。不管是单卡还是多卡,都能得到这个结果。迁移学习时和PaddleDetection获得了一样的精度、一样的收敛速度,二者的训练日志位于train_ppyolo_in_voc2012文件夹下。

评估

总体的命令格式是

代码语言:javascript
复制
python tools/eval.py -f {exp配置文件的路径} -d 1 -b 4 -c {读取的.pth权重文件的路径} --conf {分数过滤阈值} --tsize {输入网络的图片分辨率}

比如,项目根目录下执行:

代码语言:javascript
复制
python tools/eval.py -f exps/ppyoloe/ppyoloe_crn_l_300e_coco.py -d 1 -b 4 -c ppyoloe_crn_l_300e_coco.pth --conf 0.01 --tsize 640

结果是

代码语言:javascript
复制
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.505
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.681
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.547
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.335
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.552
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.671
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.377
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.617
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.657
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.461
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.709
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.819

转换权重后精度有一点损失,差了大约0.4%,影响不大。

结语

这么棒的仓库,大家给个star、watch、follow一键三连吧!miemiedetection未来会加入更多算法,请大家拭目以待!

本文仅做学术分享,如有侵权,请联系删文。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3D视觉工坊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 获取预训练模型(转换权重)
  • 配置文件详解
  • 预测
  • 训练COCO数据集
  • 训练自定义数据集
  • 评估
  • 结语
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档