如何在 Tensorflow 对象检测 API 中添加自定义评估指标?

civ*_*ivy 8 tensorflow tensorboard object-detection-api

在评估 Tensorflow 的对象检测 API 中的实例分割模型时,我希望拥有自定义的指标列表,可以总结如下;

  • IOU 的精度值为 0.5-0.95,增量为 0.05
  • IOU 的召回值为 0.5-0.95,增量为 0.05
  • 精确度和召回率的 AUC 值在 0-1 之间,增量为 0.05

我目前测试的是通过调整 pycocotools 的 PythonAPI 中的一些代码以及 Tensorflow 研究模型中的附加指标文件来修改现有的 coco 评估指标。目前COCO评估的默认输出值如下

Precision/mAP
Precision/mAP@.50IOU
Precision/mAP@.75IOU
Precision/mAP (small)
Precision/mAP (medium)
Precision/mAP (large)
Recall/AR@1
Recall/AR@10
Recall/AR@100
Recall/AR@100 (small)
Recall/AR@100 (medium)
Recall/AR@100 (large)
Run Code Online (Sandbox Code Playgroud)

coco_detection_metrics所以我决定首先在我的领域使用eval_config.config文件里面用于训练

eval_config: {
  metrics_set: "coco_detection_metrics"
}
Run Code Online (Sandbox Code Playgroud)

并通过向统计列表和统计摘要字典中添加更多项目来进行多次编辑cocoeval.pycocotools.py与值的数量成比例),以获得所需的结果。出于演示目的,我仅展示一个示例,即在 IOU=0.5 的精度之上添加 IOU=0.55 的精度。

所以,这是cocoeval.pyCOCOeval中类的修改方法

def _summarizeDets():
    stats[1] = _summarize(1, iouThr=.5, maxDets=self.params.maxDets[2])
    stats[12] = _summarize(1, iouThr=.5, maxDets=self.params.maxDets[2])
Run Code Online (Sandbox Code Playgroud)

以及coco_tools.pyCOCOEvalWrapper中类下编辑的方法

summary_metrics = OrderedDict([
    ('Precision/mAP@.50IOU', self.stats[1]),
    ('Precision/mAP@.55IOU', self.stats[12])
for category_index, category_id in enumerate(self.GetCategoryIdList()):
    per_category_ap['Precision mAP@.50IOU ByCategory/{}'.format( category)] = self.category_stats[1][category_index]
    per_category_ap['Precision mAP@.55IOU ByCategory/{}'.format( category)] = self.category_stats[12][category_index]
Run Code Online (Sandbox Code Playgroud)

了解一种更有效的方法来处理我的问题并轻松请求自定义评估指标列表而无需调整现有的 COCO 文件将很有用。理想情况下,我的主要目标是

  • 能够根据问题开头提供的指标创建自定义控制台输出

我的次要目标是

  • 以 JSON 格式导出指标及其各自的值
  • 在 Tensorboard 中可视化这三个图