Skip to content

Commit

Permalink
rework summarize
Browse files Browse the repository at this point in the history
  • Loading branch information
MiXaiLL76 committed Jun 26, 2024
1 parent dda263d commit 1739926
Showing 1 changed file with 126 additions and 90 deletions.
216 changes: 126 additions & 90 deletions faster_coco_eval/core/cocoeval.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,164 +404,200 @@ def evaluate(self):
" instead."
)

def summarize(self):
"""Compute and display summary metrics for evaluation results.
def _summarize(
self,
ap=1,
iouThr=None,
areaRng="all",
maxDets=100,
freq_group_idx=None,
catIds=None,
):
p = self.params
iStr = (
" {:<18} {} @[ IoU={:<9} | area={:>6s} | maxDets={:>3d} {}] ="
" {:0.3f}"
)

Note this functin can *only* be applied on the default parameter
setting
freq_str = "catIds={:>3s}".format("all") if self.lvis_style else ""

"""
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)
)

if catIds is not None:
# catNames = [
# self.cocoGt.cats[p.catIds[used_cat_idx]].get(
# "name", used_cat_idx
# )
# for used_cat_idx in catIds
# ]
freq_str = "catIds=={:>3s}".format(str(catIds))

if self.lvis_style and (freq_group_idx is not None):
catIds = self.freq_groups[freq_group_idx]
freq_str = "catIds={:>3s}".format(p.imgCountLbl[freq_group_idx])

# In my case, C++ too slow...
# mean_s = _C._summarize(
# ap,
# (iouThr if iouThr else -1),
# areaRng,
# maxDets,
# catIds,
# p,
# self.eval["counts"],
# self.eval["precision"] if ap == 1 else self.eval["recall"],
# )

aind = p.areaRngLbl.index(areaRng)
mind = p.maxDets.index(maxDets)

# 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 catIds is not None:
s = s[:, :, catIds, 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 catIds is not None:
s = s[:, catIds, aind, mind]
else:
s = s[:, :, aind, mind]

# TODO:
# 1) Convert this to C++
# 2) Write print function
def _summarize(
ap=1, iouThr=None, areaRng="all", maxDets=100, freq_group_idx=None
):
p = self.params
iStr = (
" {:<18} {} @[ IoU={:<9} | area={:>6s} | maxDets={:>3d} {}] ="
" {:0.3f}"
if len(s[s > -1]) == 0:
mean_s = -1
else:
mean_s = np.mean(s[s > -1])
self.print_function(
iStr.format(
titleStr,
typeStr,
iouStr,
areaRng,
maxDets,
freq_str,
mean_s,
)
)
return mean_s

freq_str = "catIds={:>3s}".format("all") if self.lvis_style else ""
def summarize(self):
"""Compute and display summary metrics for evaluation results.
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)
)
Note this functin can *only* be applied on the default parameter
setting
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 self.lvis_style and (freq_group_idx is not None):
s = s[:, :, self.freq_groups[freq_group_idx], aind, mind]
freq_str = "catIds={:>3s}".format(
p.imgCountLbl[freq_group_idx]
)
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]
s = s[:, :, aind, mind]
if len(s[s > -1]) == 0:
mean_s = -1
else:
mean_s = np.mean(s[s > -1])
self.print_function(
iStr.format(
titleStr,
typeStr,
iouStr,
areaRng,
maxDets,
freq_str,
mean_s,
)
)
return mean_s
"""

def _summarizeDets():
_count = 17 if self.lvis_style else 14
stats = np.zeros((_count,))
stats[0] = _summarize(1, maxDets=self.params.maxDets[-1]) # AP_all
stats[1] = _summarize(
stats[0] = self._summarize(
1, maxDets=self.params.maxDets[-1]
) # AP_all
stats[1] = self._summarize(
1, iouThr=0.5, maxDets=self.params.maxDets[-1]
) # AP_50
stats[2] = _summarize(
stats[2] = self._summarize(
1, iouThr=0.75, maxDets=self.params.maxDets[-1]
) # AP_75
stats[3] = _summarize(
stats[3] = self._summarize(
1, areaRng="small", maxDets=self.params.maxDets[-1]
) # AP_small
stats[4] = _summarize(
stats[4] = self._summarize(
1, areaRng="medium", maxDets=self.params.maxDets[-1]
) # AP_medium
stats[5] = _summarize(
stats[5] = self._summarize(
1, areaRng="large", maxDets=self.params.maxDets[-1]
) # AP_large

if self.lvis_style:
stats[14] = _summarize(
stats[14] = self._summarize(
1, maxDets=self.params.maxDets[-1], freq_group_idx=0
) # APr
stats[15] = _summarize(
stats[15] = self._summarize(
1, maxDets=self.params.maxDets[-1], freq_group_idx=1
) # APc
stats[16] = _summarize(
stats[16] = self._summarize(
1, maxDets=self.params.maxDets[-1], freq_group_idx=2
) # APf

# AR_first or AR_all
stats[6] = _summarize(0, maxDets=self.params.maxDets[0])
stats[6] = self._summarize(0, maxDets=self.params.maxDets[0])
if len(self.params.maxDets) >= 2:
stats[7] = _summarize(
stats[7] = self._summarize(
0, maxDets=self.params.maxDets[1]
) # AR_second
if len(self.params.maxDets) >= 3:
stats[8] = _summarize(
stats[8] = self._summarize(
0, maxDets=self.params.maxDets[2]
) # AR_third

stats[9] = _summarize(
stats[9] = self._summarize(
0, areaRng="small", maxDets=self.params.maxDets[-1]
) # AR_small
stats[10] = _summarize(
stats[10] = self._summarize(
0, areaRng="medium", maxDets=self.params.maxDets[-1]
) # AR_medium
stats[11] = _summarize(
stats[11] = self._summarize(
0, areaRng="large", maxDets=self.params.maxDets[-1]
) # AR_large

stats[12] = _summarize(
stats[12] = self._summarize(
0, iouThr=0.5, maxDets=self.params.maxDets[-1]
) # AR_50
stats[13] = _summarize(
stats[13] = self._summarize(
0, iouThr=0.75, maxDets=self.params.maxDets[-1]
) # AR_75

return stats

def _summarizeKps():
stats = np.zeros((10,))
stats[0] = _summarize(1, maxDets=self.params.maxDets[-1])
stats[1] = _summarize(
stats[0] = self._summarize(1, maxDets=self.params.maxDets[-1])
stats[1] = self._summarize(
1, maxDets=self.params.maxDets[-1], iouThr=0.5
)
stats[2] = _summarize(
stats[2] = self._summarize(
1, maxDets=self.params.maxDets[-1], iouThr=0.75
)
stats[3] = _summarize(
stats[3] = self._summarize(
1, maxDets=self.params.maxDets[-1], areaRng="medium"
)
stats[4] = _summarize(
stats[4] = self._summarize(
1, maxDets=self.params.maxDets[-1], areaRng="large"
)
stats[5] = _summarize(0, maxDets=self.params.maxDets[-1])
stats[6] = _summarize(
stats[5] = self._summarize(0, maxDets=self.params.maxDets[-1])
stats[6] = self._summarize(
0, maxDets=self.params.maxDets[-1], iouThr=0.5
)
stats[7] = _summarize(
stats[7] = self._summarize(
0, maxDets=self.params.maxDets[-1], iouThr=0.75
)
stats[8] = _summarize(
stats[8] = self._summarize(
0, maxDets=self.params.maxDets[-1], areaRng="medium"
)
stats[9] = _summarize(
stats[9] = self._summarize(
0, maxDets=self.params.maxDets[-1], areaRng="large"
)
return stats
Expand Down

0 comments on commit 1739926

Please sign in to comment.