社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

GitHub开源130+Stars:手把手教你复现基于PPYOLO系列的目标检测算法

新智元 • 4 年前 • 503 次点击  



  新智元报道  

作者:咩咩2013

编辑:LRS

【新智元导读】还在愁没法入门目标检测?这个仓库一定得看看!作者复现了多个知名算法,训练记录都能查看。而且性能和原版持平,多机八卡也能跑!预告:居家办公让虚拟人来作伴?欢迎预约直播,教你如何从0到1自己创建一个!



目标检测是计算机视觉领域的基础任务,没个称手的Model Zoo怎么行?

 

今天给大家安利一个简单好用的目标检测的算法模型库miemiedetection,目前在GitHub已斩获130+颗star

 

代码链接:https://github.com/miemie2013/miemiedetection

 

miemiedetection是基于YOLOX进行二次开发的个人检测库,还支持PPYOLO、PPYOLOv2、PPYOLOE、FCOS等算法。

 

得益于YOLOX的优秀架构,miemiedetection里的算法训练速度都非常快,数据读取不再是训练速度的瓶颈。

 

代码开发使用的深度学习框架为pyTorch,实现了可变形卷积DCNv2、Matrix NMS等高难度算子,支持单机单卡、单机多卡、多机多卡训练模式(多卡训练模式建议使用Linux系统),支持Windows、Linux系统。

 

并且由于miemiedetection是一个不需要安装的检测库,用户可以直接更改其代码改变执行逻辑,所以向库中添加新算法也很容易。

 

作者表示未来还会加入更多的算法支持(还有女装)。

 

 

算法如假包换


复现模型,最重要的就是准确率要跟原版的基本相同。

 

先看PPYOLO、PPYOLOv2、PPYOLOE这三个模型,作者均经过了loss对齐、梯度对齐的实验。

 

 

为了保留证据,在源码中还可以看到注释掉的读写*.npz 的部分,都是做对齐实验遗留的代码。

 

并且作者还详细记录了性能对齐的过程,对于新手来说,照着这条路走一遍,也是一个不错的学习过程!

 

 

全部的训练日志也都记录保存在仓库中,足以证明复现PPYOLO系列算法的正确性!

 

 

最后的训练结果显示,复现的PPYOLO算法和原版仓库具有一样的损失、一样的梯度。

 

另外,作者也试着用原版仓库和miemiedetection迁移学习voc2012数据集,也获得了一样的精度(使用了相同的超参数)。

 

和原版实现一样,使用了同样的学习率、同样的学习率衰减策略warm_piecewisedecay(PPYOLO和PPYOLOv2使用)和warm_cosinedecay(PPYOLOE使用)、同样的指数滑动平均EMA、同样的数据预处理方式、同样的参数L2权重衰减、同样的损失、同样的梯度、同样的预训练模型,迁移学习得到了同样的精度。

 

实验做得足,测试做得多,保证大家有美好的使用体验!

 

不要998,也不要98,只要点个star,所有目标检测算法免费带回家!

 

模型下载与转换


想跑通模型,参数很重要,作者提供了转换好的预训练pth权重文件,可以通过百度网盘直接下载。

 

链接:https://pan.baidu.com/s/1ehEqnNYKb9Nz0XNeqAcwDw

提取码:qe3i

 

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

 

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

 

 

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

 

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

 

 

其中各个参数的含义为:

 

- -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标注格式,才能训练(支持太多标注格式的话,工作量太大)。可以通过miemieLabels将自定义的数据集转换成COCO的标注格式。所有的检测算法配置类都会继承COCOBaseExp,表示所有的检测算法共用同样的数据集的配置。

 

COCOBaseExp的配置项有:

 

 

其中,

 

- 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目录下;

 

对于VOC 2012数据集,则需要修改数据集的配置为:

 

 

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

 

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

 

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

 

 

数据集根目录和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的配置文件也是类似这样的结构。

 

预测


首先,如果输入的数据为一张图片,则在项目根目录下执行:

 

 

其中各个参数的含义为:

 

- -f表示的是使用的配置文件;

- -c表示的是读取的权重文件;

- --path表示的是图片的路径;

- --conf表示的是分数阈值,只会画出高于这个阈值的预测框;

- --tsize表示的是预测时将图片Resize成--tsize的分辨率;

 

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

 

如果预测的是一个文件夹下的所有图片,则在项目根目录下执行:

 

 

将--path修改为对应图片文件夹的路径即可。

 

训练COCO2017数据集


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

 

 

一条命令直接启动单机八卡训练,当然了,前提是你真的有一台单机8卡的超算。

 

其中各个参数的含义为:

 

-f表示的是使用的配置文件;

-d表示的是显卡数量;

-b表示的是训练时的批大小(所有卡的);

-eb表示的是评估时的批大小(所有卡的);

-c表示的是读取的权重文件;

--fp16,自动混合精度训练;

--num_machines,机器数量,建议单机多卡训练;

--resume表示的是是否是恢复训练;


训练自定义数据集


建议读取COCO预训练权重进行训练,因为收敛快。

 

以上述的VOC2012数据集为例,对于ppyolo_r50vd模型,如果是1机1卡,输入下述命令开始训练:

 

 

如果训练因为某些原因中断,想要读取之前保存的模型恢复训练,只要修改-c为想要读取模型的路径,再加上--resume参数即可。

 

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

 

 

并在1号机输入以下命令:

 

 

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

 

如果是1机2卡,则输入下面的命令即可开始训练:

 

 

迁移学习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模型,在单机输入下面的命令即可开始训练(冻结了骨干网络)

 

 

迁移学习VOC2012数据集,实测ppyoloe_l的AP(0.50:0.95)可以到达0.66+、AP(0.50)可以到达0.85+、AP(small)可以到达0.28+。

 

评估


命令和具体的参数如下。

 

 

在项目根目录下运行结果为:

 

 

转换权重后精度有一点损失,大约为0.4%。


参考资料:

https://www.zhihu.com/people/mie-mie-2013


—分割线—


【元宇宙·新人类 第3期直播重磅来袭!】

居家办公是不是有虚拟人作伴更好?如何从0到1创建一个虚拟人?虚拟人产业大爆炸,有哪些应用场景和商业化路径?


欢迎扫码下方海报预约直播,为你解答一切疑惑👇🏻



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/134899