【YOLO】解决YOLOX训练时AP为0

训练Coco数据集可查看: YOLOX训练COCO数据集

因xml文件中不存在 difficult 参数导致的 ap=0 可查看:关于xml文件中不存在 difficult 参数导致的ap为0

前段时间被YOLOX刷屏了,各个公众号都在强推,号称:性能超Yolov5,吊打一切YOLO

于是,我满怀期待,下载下源码,准备试一试...

一、问题描述

嗯,没错,遇到了一堆bug,不过好在都解决了,最后训练的时候
在这里插入图片描述
好家伙,AP一直为0,上 Github 的 YOLOX 的 Issues 上一搜索,看来遇到同样问题的不止我一个在这里插入图片描述
而且根据有些答复修改,发现也不对,最后陷入沉思...

直到昨天群组里,偶然有人说他成功使用了YOLOX并且进行了部署,我就呆了,告诉了他我训练时AP为0,并询问了他具体使用方法,当然得到的答复并没有真正解决我的问题...

二、发现问题

于是今早我又开始调试,检查,我突然想到是不是 数据加载出了问题

结果发现,还真就是这块儿导致的问题

三、解决问题

  • 首先,保证自定义VOC格式数据是否正确

    ├─datasets
    │  └─VOCdevkit
    │      └─VOC2007
    │          ├─Annotations
    │          ├─ImageSets
    │          │  └─Main
    │          └─JPEGImages
    

    Main 文件夹下一定有对应的 train.txtval.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 即可

猜你喜欢

转载自blog.csdn.net/weixin_42166222/article/details/119637797