in easycv/core/evaluation/custom_cocotools/cocoeval.py [0:0]
def summarize_per_category(self):
'''
Compute and display summary metrics for evaluation results *per category*.
Note this functin can *only* be applied on the default parameter setting
'''
def _summarize_single_category(ap=1,
iouThr=None,
categoryId=None,
areaRng='all',
maxDets=100):
p = self.params
iStr = ' {:<18} {} @[ CategoryId={:>3d} | IoU={:<9} | area={:>6s} | maxDets={:>3d} ] = {:0.3f}'
titleStr = 'Average Precision' if ap == 1 else 'Average Recall'
typeStr = '(AP)' if ap == 1 else '(AR)'
iouStr = '{:0.2f}:{:0.2f}'.format(p.iouThrs[0], p.iouThrs[-1]) \
if iouThr is None else '{:0.2f}'.format(iouThr)
aind = [
i for i, aRng in enumerate(p.areaRngLbl) if aRng == areaRng
]
mind = [i for i, mDet in enumerate(p.maxDets) if mDet == maxDets]
if ap == 1:
# dimension of precision: [TxRxKxAxM]
s = self.eval['precision']
# IoU
if iouThr is not None:
t = np.where(iouThr == p.iouThrs)[0]
s = s[t]
if categoryId is not None:
category_index = [
i for i, i_catId in enumerate(p.catIds)
if i_catId == categoryId
]
s = s[:, :, category_index, aind, mind]
else:
s = s[:, :, :, aind, mind]
else:
# dimension of recall: [TxKxAxM]
s = self.eval['recall']
if iouThr is not None:
t = np.where(iouThr == p.iouThrs)[0]
s = s[t]
if categoryId is not None:
category_index = [
i for i, i_catId in enumerate(p.catIds)
if i_catId == categoryId
]
s = s[:, category_index, aind, mind]
else:
s = s[:, :, aind, mind]
if len(s[s > -1]) == 0:
mean_s = -1
else:
mean_s = np.mean(s[s > -1])
# print(iStr.format(titleStr, typeStr, catId, iouStr, areaRng, maxDets, mean_s))
return mean_s
def _summarizeDets_per_category():
category_stats = np.zeros((12, len(self.params.catIds)))
for category_index, category_id in enumerate(self.params.catIds):
category_stats[0][category_index] = _summarize_single_category(
1, categoryId=category_id)
category_stats[1][category_index] = _summarize_single_category(
1,
iouThr=.5,
maxDets=self.params.maxDets[2],
categoryId=category_id)
category_stats[2][category_index] = _summarize_single_category(
1,
iouThr=.75,
maxDets=self.params.maxDets[2],
categoryId=category_id)
category_stats[3][category_index] = _summarize_single_category(
1,
areaRng='small',
maxDets=self.params.maxDets[2],
categoryId=category_id)
category_stats[4][category_index] = _summarize_single_category(
1,
areaRng='medium',
maxDets=self.params.maxDets[2],
categoryId=category_id)
category_stats[5][category_index] = _summarize_single_category(
1,
areaRng='large',
maxDets=self.params.maxDets[2],
categoryId=category_id)
category_stats[6][category_index] = _summarize_single_category(
0, maxDets=self.params.maxDets[0], categoryId=category_id)
category_stats[7][category_index] = _summarize_single_category(
0, maxDets=self.params.maxDets[1], categoryId=category_id)
category_stats[8][category_index] = _summarize_single_category(
0, maxDets=self.params.maxDets[2], categoryId=category_id)
category_stats[9][category_index] = _summarize_single_category(
0,
areaRng='small',
maxDets=self.params.maxDets[2],
categoryId=category_id)
category_stats[10][
category_index] = _summarize_single_category(
0,
areaRng='medium',
maxDets=self.params.maxDets[2],
categoryId=category_id)
category_stats[11][
category_index] = _summarize_single_category(
0,
areaRng='large',
maxDets=self.params.maxDets[2],
categoryId=category_id)
return category_stats
def _summarizeKps_per_category():
category_stats = np.zeros((10, len(self.params.catIds)))
for category_index, category_id in self.params.catIds:
category_stats[0][category_index] = _summarize_single_category(
1, maxDets=20, categoryId=category_id)
category_stats[1][category_index] = _summarize_single_category(
1, maxDets=20, iouThr=.5, categoryId=category_id)
category_stats[2][category_index] = _summarize_single_category(
1, maxDets=20, iouThr=.75, categoryId=category_id)
category_stats[3][category_index] = _summarize_single_category(
1, maxDets=20, areaRng='medium', categoryId=category_id)
category_stats[4][category_index] = _summarize_single_category(
1, maxDets=20, areaRng='large', categoryId=category_id)
category_stats[5][category_index] = _summarize_single_category(
0, maxDets=20, categoryId=category_id)
category_stats[6][category_index] = _summarize_single_category(
0, maxDets=20, iouThr=.5, categoryId=category_id)
category_stats[7][category_index] = _summarize_single_category(
0, maxDets=20, iouThr=.75, categoryId=category_id)
category_stats[8][category_index] = _summarize_single_category(
0, maxDets=20, areaRng='medium', categoryId=category_id)
category_stats[9][category_index] = _summarize_single_category(
0, maxDets=20, areaRng='large', categoryId=category_id)
return category_stats
if not self.eval:
raise Exception('Please run accumulate() first')
iouType = self.params.iouType
if iouType == 'segm' or iouType == 'bbox':
summarize_per_category = _summarizeDets_per_category
elif iouType == 'keypoints':
summarize_per_category = _summarizeKps_per_category
self.category_stats = summarize_per_category()