另一篇Yolox文章,解决Voc数据集下AP为0:解决YOLOX训练时AP为0

有小伙伴是训练coco数据集时,AP为0,实际上,我并没有遇到这个问题,我这里测试了下,是可以正常运行的,但有小伙伴问了,我这里就总结一下如何训练Coco数据集吧...


步骤如下

  • 首先呢,保证Coco数据集格式正确
Animals_Coco
   ├─annotations
   ├─train2017
   └─val2017
  • annotations 文件夹下包含两个重要的文件instances_train2017.jsoninstances_val2017.jsontrain2017val2017 包含的是训练和验证的图片数据
  • 接着修改 yolox/data/datasets/coco_classes.py, 修改为自己数据集的类别
COCO_CLASSES = (
"tiger",
"panda",
)
  • 接着按照自己的需求修改 yolox/exp/yolox_base.py(也可以不做修改)
(这里应该也可以不用修改,因为后面的exps/example/yolox_voc/yolox_s.py会对self.num_classes进行重载)
将self.num_classes修改为自己的类别数
self.num_classes = 2 (我的数据集是 2)

你还可以修改 self.inputsize, self.random_size 改变训练尺寸大小

你还可以修改 self.test_size 改变测试的尺寸大小
  • 修改 exps/example/custom/yolox_s.py
修改数据集地址 self.data_dir
self.data_dir = "D:/Z_Data/Animals_Coco"

修改类别 self.num_classes
self.num_classes = 2

剩下的 self.max_epoch,self.data_num_workers,self.eval_interval 可自行选择修改
  • 最后修改下 tools/train.py 中的参数配置
设置 default="Animals_Coco", 训练后结果就会保存在 tools/YOLOX_outputs/Animals_Coco下
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/custom/yolox_s.py"
parser.add_argument(
    "-f",
    "--exp_file",
    default="../exps/example/custom/yolox_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")

经过上述操作后,从下图可以看到已经可以正常运行啦

fasterrcnn coco的训练参数_json


如果经过这一些列操作过后,AP还是为0,个人猜测是 json 文件的内容是出现了问题让我们看下测试效果

fasterrcnn coco的训练参数_json_02


fasterrcnn coco的训练参数_json_03

fasterrcnn coco的训练参数_json_04


总体上来看,速度、精度都还是可以的


最后,如果大家有在训练过程中遇到 TypeError: 'numpy.float64' object cannot be interpreted as an integer找到Anaconda3\Lib\site-packages\pycocotools\cocoeval.py 或者在 pycahrm 里面的 External Librariessite-packages\pycocotools\cocoeval.py 修改第 507、508

self.iouThrs = np.linspace(.5, 0.95, np.round((0.95 - .5) / .05) + 1, endpoint=True)
self.recThrs = np.linspace(.0, 1.00, np.round((1.00 - .0) / .01) + 1, endpoint=True)

修改为

self.iouThrs = np.linspace(.5, 0.95, 10, endpoint=True)
self.recThrs = np.linspace(.0, 1.00, 101, endpoint=True)