1.问题
继上次训练挂起的bug后,又遇到了现在评估时AP非常低的bug。具体有多低呢?Pelee论文中提到,用128的batchsize大小在coco数据集上训练70K次迭代后,AP@0.5:0.95为22.4,而我用32的batchsize反复微调之后,最后AP也只从2.9上升到了3.7...下图为训练的过程:
![](https://i-blog.csdnimg.cn/blog_migrate/75a34023f556b7da06d5fc8b9f8c8cee.png)
2.解决
其实看loss和accuracy还是可以的,但是ap就是上不去,粗略想到了4个地方可能存在的问题:
- 训练有误
因为尝试了各种学习率,而且在各个学习率下都是训练到ap和loss都不变之后才改变学习率,因此我想不出训练还有什么其他花样了...排除 - 数据有误
因为coco的数据是自己转换的,说实话对这块还是有点不放心的。况且之前训练的bug已经检查过数据了,看样子是没什么问题。现在再检查工作量也比较大,存疑,先放着 - 模型有误
模型在voc数据集上能成功复现,排除 - 计算有误
因为coco评估的脚本是在voc上改的,生成json文件之后再使用官方的cocoapi计算。所以有很大可能是生成json文件的脚本哪里写错了
综上,先排查评估是否有计算错误。
但是没看出来...于是,我寻思着在原来的voc_eval.py文件上做一些修改,以适配coco,再用voc的方式评估。虽然计算方式有差别,但不会差太远。如果ap变化不大,那说明计算方式没有问题,需要检查数据(最怕的就是这种情况,因为工作量很大,而且数据也容易出错,还好gt标错的坑已经提前踩了,想想就可怕);反之就是评估计算有问题。
# voc_eval.py 程序结构
def do_python_eval(dataset_path, pred_path, use_07=True):
aps = []
#对每个类别:执行
rec, prec, ap = voc_eval(filename, # 每个类别的预测文件result_x.txt
os.path.join(dataset_path, anno_files), # 每张图片的标注文件
os.path.join(dataset_path, all_images_file), # 所有图片的文件名文件
cls_name, # 类别名
cache_path, # 用于暂存所有图片的标注
ovthresh=0.5,
use_07_metric=use_07_metric)
aps += [ap]
#将rec, prec和ap 存到对应类别的 xx_pr.pkl文件
#打印AP和mAP
def voc_eval(detpath,
annopath,
imagesetfile,
classname,
cachedir,