训练Coco数据集可查看: YOLOX训练COCO数据集
前段时间被YOLOX刷屏了,各个公众号都在强推,号称:性能超Yolov5,吊打一切YOLO
于是,我满怀期待,下载下源码,准备试一试...
一、问题描述
嗯,没错,遇到了一堆bug,不过好在都解决了,最后训练的时候
好家伙,AP一直为0,上 Github 的 YOLOX 的 Issues 上一搜索,看来遇到同样问题的不止我一个
而且根据有些答复修改,发现也不对,最后陷入沉思...
直到昨天群组里,偶然有人说他成功使用了YOLOX并且进行了部署,我就呆了,告诉了他我训练时AP为0,并询问了他具体使用方法,当然得到的答复并没有真正解决我的问题...
二、发现问题
于是今早我又开始调试,检查,我突然想到是不是 数据加载出了问题
结果发现,还真就是这块儿导致的问题
三、解决问题
-
首先,保证自定义VOC格式数据是否正确
├─datasets │ └─VOCdevkit │ └─VOC2007 │ ├─Annotations │ ├─ImageSets │ │ └─Main │ └─JPEGImages
在
Main
文件夹下一定有对应的train.txt
和val.txt
-
然后,对
yolox/data/datasets/voc_classes.py
进行修改,修改成你训练数据的类别(保险起见,最好每一个类别后都加上 ,
):VOC_CLASSES = ( "panda", "tiger", )
-
接着修改
yolox/exp/yolox_base.py
(这里应该也可以不用修改,因为后面的exps/example/yolox_voc/yolox_voc_s.py会对self.num_classes进行重载) 将self.num_classes修改为自己的类别数 self.num_classes = 2 (我的数据集是 2) 你还可以修改 self.inputsize, self.random_size 改变训练尺寸大小 你还可以修改 self.test_size 改变测试的尺寸大小
接下来两条是重点:
-
对
yolox/data/datasets/voc.py
下的_do_python_eval
方法进行修改annopath = os.path.join(rootpath, "Annotations", "{:s}.xml") 修改为 annopath = os.path.join(rootpath, "Annotations", "{}.xml")
-
我的问题主要体现在了
exps/example/yolox_voc/yolox_voc_s.py
,相信大部分伙伴训练时出现 AP=0 也是因为这里的原因修改 self.num_classes = 2 修改 get_data_loder 下的 VOCDetection 下的 image_sets=[('2007', 'trainval'), ('2012', 'trainval')], 修改为 image_sets=[('2007', 'train')] 修改 get_eval_loader 下的 VOCDetection 下的 image_sets=[('2007', 'test')], 修改为 image_sets=[('2007', 'val')]
重要的事再重复下
get_data_loder
下的VOCDetection
下的image_sets=[('2007', 'trainval'), ('2012', 'trainval')]
,修改为
image_sets=[('2007', 'train')]
更为重要的是:
get_eval_loader
下的VOCDetection
下的image_sets=[('2007', 'test')]
,一定要修改为
image_sets=[('2007', 'val')]
,因为我们验证的数据在val.txt
,而不是test.txt
,这应该也是为什么 AP 一直为0的原因 -
最后修改下
tools/train.py
中的参数配置设置 default="Animals", 训练后结果就会保存在 tools/YOLOX_outputs/Animals下 parser.add_argument("-expn", "--experiment-name", type=str, default=None) 设置 model_name,我也不太清楚这是不是必须项 (我觉得不是) parser.add_argument("-n", "--name", type=str, default="yolox-s", help="model name") 设置 batch_size parser.add_argument("-b", "--batch-size", type=int, default=64, help="batch size") 设置gpu,因为我只有一张卡,所以设 default=0 parser.add_argument( "-d", "--devices", default=0, type=int, help="device for training" ) 设置你的数据配置的路径,default="../exps/example/yolox_voc/yolox_voc_s.py" parser.add_argument( "-f", "--exp_file", default="../exps/example/yolox_voc/yolox_voc_s.py", type=str, help="plz input your expriment description file", ) 设置权重路径, default="../weights/yolox_s.pth" parser.add_argument("-c", "--ckpt", default="../weights/yolox_s.pth", type=str, help="checkpoint file")
完成上诉所有配置后即可开始训练
四、训练并测试效果
可以看到,有AP了,说明成功了
最后看一下测试结果
整体效果还是很好的,准确度都在90%以上
测试的时候要注意一点:
-
由于
demo.py
默认调用的是COCO_CLASSES
,所以想要正确显示结果,就要把yolox/data/datasets/coco_classes.py
下的COCO_CLASSES
改成你的数据类别 -
或者在
yolox/data/datasets/__init__.py
里将from .voc import VOCDetection
修改为from .voc import VOCDetection, VOC_CLASSES
-
然后在
tools/demo.py
里将from yolox.data.datasets import COCO_CLASSES
修改为from yolox.data.datasets import COCO_CLASSES, VOC_CLASSES
, -
然后将
tools/demo.py
里所有用到COCO_CLASSES
的地方全部改为VOC_CLASSES
即可
版权声明:本文为CSDN博主「MangoloD」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42166222/article/details/119637797
暂无评论