第一个问题:测试时打印各类别准确率(AP)
方法1:在mmdet/datasets/coco.py中找到evaluate函数,大概第300多行,将classwise设为True,默认为False
def evaluate(self,
results,
metric='bbox',
logger=None,
jsonfile_prefix=None,
# 是否显示每个类别
classwise=True,
若改动后未生效可试试运行下面的命令重新编译代码使修改生效
python setup.py install build
方法2(推荐):运行tools/test.py的时候加上 --options "classwise=True"
第二个问题:打印iou为0.5时各类AP
发现在classwise设为True后虽然打印了各类ap,但是并非是iou为0.5时的ap,于是有了此问题
方法1:在mmdet/datasets/coco.py中找到evaluate函数,设置iou阈值,iou_thrs=[0.5]
def evaluate(self,
results,
metric='bbox',
logger=None,
jsonfile_prefix=None,
classwise=True,
proposal_nums=(100, 300, 1000),
iou_thrs=[0.5],
metric_items=None):
方法2:测试时在指令后面加上 --show-score-thr 0.5
方法3:修改mmdet/datasets/coco.py中的evaluate_det_segm函数以下部分
if classwise: # Compute per-category AP
# Compute per-category AP
# from https://github.com/facebookresearch/detectron2/
precisions = cocoEval.eval['precision']
# precision: (iou, recall, cls, area range, max dets)
assert len(self.cat_ids) == precisions.shape[2]
results_per_category = []
for idx, catId in enumerate(self.cat_ids):
# area range index 0: all area ranges
# max dets index -1: typically 100 per image
nm = self.coco.loadCats(catId)[0]
#precision = precisions[:, :, idx, 0, -1]
precision = precisions[0, :, idx, 0, -1] #在这里进行了修改
precision = precision[precision > -1]
if precision.size:
ap = np.mean(precision)
else:
ap = float('nan')
results_per_category.append(
(f'{nm["name"]}', f'{float(ap):0.3f}'))
若修改源码后未生效可使用如下代码重新编译
python setup.py install build
打印出了各类在iou为0.5时的ap