当前位置: 首页 > 科技观察

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

时间:2023-03-12 02:25:27 科技观察

GitHub开源130+Stars:手把手教你复现基于PPYOLO系列的目标检测算法今天给大家分享一个简单易用的目标检测算法模型库miemiedetection。目前,它在GitHub上获得了130+star。代码链接:https://github.com/miemie2013/miemiedetectionmiemiedetection是个人基于YOLOX进行二次开发的检测库,同样支持PPYOLO、PPYOLOv2、PPYOLOE、FCOS等算法。得益于YOLOX优秀的架构,miemiedetection中的算法训练速度非常快,数据读取不再是训练速度的瓶颈。代码开发使用的深度学习框架为pyTorch,实现了可变形卷积DCNv2、MatrixNMS等高难度算子,支持单机单卡、单机多卡、多机多卡训练模式(多卡训练模式推荐使用Linux系统)),支持Windows和Linux系统。并且由于miemidetection是一个不需要安装的检测库,用户可以直接更改其代码来改变执行逻辑,因此很容易向库中添加新的算法。作者说以后会加入更多的算法支持(还有女装)。最重要的是算法的准确率要和原版基本一致。先来看PPYOLO、PPYOLOv2、PPYOLOE这三个模型。作者经历了lossalignment和gradientalignment的实验。为了保全证据,还可以看到源码中读写*.npz被注释掉的部分,这是比对实验遗留下来的代码。并且作者还详细记录了性能对齐的过程。对于新手来说,走这条路也是一个很好的学习过程!所有的训练日志也都记录在了仓库中,足以证明复现PPYOLO系列算法的正确性!最终的训练结果表明,复现的PPYOLO算法与原仓库具有相同的损失和相同的梯度。另外,作者还尝试将voc2012数据集与原仓库和miemiedetection进行了迁移,得到了相同的准确率(使用相同的超参数)。与原实现相同,使用相同的学习率,相同的学习率衰减策略warm_piecewisedecay(PPYOLO和PPYOLOv2使用)和warm_cosinedecay(PPYOLOE使用),相同的指数移动平均EMA,相同的数据预处理方法,相同的参数L2Weightdecay,一样的loss,一样的梯度,一样的预训练模型,迁移学习得到一样的accuracy。做了充分的实验和大量的测试,保证大家有良好的体验!不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()显示如何获取训练数据加载器,以及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.ann_folder目录下位于self.data_dir目录中;-self.val_image_folder表示数据集验证集的图片文件夹名称,需要位于self.data_dir目录下;对于VOC2012数据集,需要修改数据集的配置如下:另外,还可以修改子类中self.num_classes和self.data_dir的配置,如exps/ppyoloe/ppyoloe_crn_l_voc2012.py,在这个方式,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表示在预测Resolution时将图片resize为--tsize;预测完成后,控制台会打印出结果图片的保存路径,用户可以打开查看。如果您使用保存在训练自定义数据集中的模型进行预测,只需将-c修改为您模型的路径即可。如果预测是一个文件夹下的所有图片,在项目根目录下执行:将--path改为对应图片文件夹的路径。训练COCO2017数据集,如果阅读ImageNet预训练骨干网络训练COCO数据集,在项目根目录下执行:一条命令直接开始单机八卡训练,当然前提是就是你真的拥有一台单机8卡超级计算机。各参数含义为:-f表示使用的配置文件;-d表示显卡数量;-b表示训练时的batchsize(所有卡片);-eb表示评估期间的批次大小(所有卡片的大小);-c表示要读取的权重文件;--fp16,自动混合精度训练;--num_machines,机器数量,建议多卡单机训练;--resume表示是否恢复训练;推荐阅读COCOpre-trainedweightsfortrainingoncustomdatasets,收敛速度快。以上面VOC2012数据集为例,对于ppyolo_r50vd模型,如果是1机1卡,输入如下命令开始训练:恢复训练,只需修改-c,在要读取模型的路径中加上--resume参数即可。如果有2台机器2张卡,即每台机器1张卡,则在机器0上输入如下命令:在机器1上输入以下命令:只需将以上两条命令中的192.168.0.107改为局域网内的192.168.0.107机器0ip就可以了。如果是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%。