如何仅在评估模式下运行 TF 对象检测 API model_main.py

Posted

技术标签:

【中文标题】如何仅在评估模式下运行 TF 对象检测 API model_main.py【英文标题】:How to run TF object detection API model_main.py in evaluation mode only 【发布时间】:2019-08-22 15:51:50 【问题描述】:

我想使用 Google Cloud 在新的测试集上评估经过自定义训练的 Tensorflow 对象检测模型。

我从以下位置获得了初始检查点: https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

我知道 Tensorflow 对象检测 API 允许我通过以下方式同时运行训练和评估:

https://github.com/tensorflow/models/blob/master/research/object_detection/model_main.py

要开始这样的工作,我提交以下 ml-engine 工作:

gcloud ml-engine jobs submit training [JOBNAME] 
--runtime-version 1.9 
--job-dir=gs://path_to_bucket/model-dir 
--packages dist/object_detection- 
    0.1.tar.gz,slim/dist/slim-0.1.tar.gz,pycocotools-2.0.tar.gz 
--module-name object_detection.model_main 
--region us-central1 
--config object_detection/samples/cloud/cloud.yml 
-- 
--model_dir=gs://path_to_bucket/model_dir 
--pipeline_config_path=gs://path_to_bucket/data/model.config

但是,在我成功迁移训练了一个模型后,我想在一个新的测试数据集上使用计算性能指标,例如 COCO mAP(http://cocodataset.org/#detection-eval) 或 PASCAL mAP (http://host.robots.ox.ac.uk/pascal/VOC/pubs/everingham10.pdf)以前使用过(无论是在训练期间还是在评估期间)。

我已经看到,model_main.py 中有可能的标志:

flags.DEFINE_string(
    'checkpoint_dir', None, 'Path to directory holding a checkpoint. If '
    '`checkpoint_dir` is provided, this binary operates in eval-only 
     mode, '
    'writing resulting metrics to `model_dir`.')

但我不知道这是否真的暗示 model_main.py 可以在独占评估模式下运行?如果是,我应该如何提交 ML-Engine 作业?

另外,Tensorflow API 中是否有任何函数允许我基于 COCO 和/或 Pascal mAP 评估现有输出字典(包含边界框、类标签、分数)?如果有,我可以轻松地在本地读取 Tensorflow 记录文件,运行推理,然后评估输出字典。

我知道如何获取评估数据集的这些指标,该数据集在训练期间在 model_main.py 中进行评估。但是,根据我的理解,我仍然应该报告新测试数据集的模型性能,因为我比较了多个模型并实施了一些超参数优化,因此我不应该报告评估数据集,对吗?笼统地说:我真的无法理解为什么要从单独的训练和评估(就像在遗留代码中一样)切换到组合的训练和评估脚本?

编辑: 我找到了两个相关的帖子。但是我认为提供的答案并不完整:

how to check both training/eval performances in tensorflow object_detection

How to evaluate a pretrained model in Tensorflow object detection api

后者是在 TF 的对象检测 API 仍然有单独的评估和训练脚本时编写的。现在已经不是这样了。

非常感谢您的帮助。

【问题讨论】:

谢谢,我也在寻找只运行评估的功能。 【参考方案1】:

如果您指定 checkpoint_dir 并将 run_once 设置为 true,那么它应该在 eval 数据集上只运行一次评估。我相信指标将被写入 model_dir 并且也应该出现在您的控制台日志中。我通常只是在我的本地机器上运行它(因为它只是对数据集进行一次传递)并且不是分布式工作。不幸的是,我还没有尝试在 CMLE 上运行这个特定的代码路径。

关于为什么我们有一个组合脚本......从对象检测 API 的角度来看,我们试图在 tf.Estimator 范式中编写东西 --- 但你是对的,我个人发现它更容易一些这两个功能存在于不同的二进制文件中。如果您愿意,您可以随时将此功能包装在另一个二进制文件中:)

【讨论】:

感谢您的回答。所以我首先运行model_main.py(直到损失和/或mAP收敛),对吧?然后,我添加标志checkpoint_dir(与model_dir 相同的目录?),以便model_main 基于model_dir 中存储的最新检查点以仅评估模式运行?或者我应该将最新的检查点移动到一个单独的目录并将这个目录指定为checkpoint_dir?关于 CMLE:您是对的,在云端或本地运行应该没有任何区别。 正确,运行一次model_main训练模型后,你应该可以将checkpoint_dir设置为与model_dir相同。 谢谢,我也在寻找只运行评估的功能。

以上是关于如何仅在评估模式下运行 TF 对象检测 API model_main.py的主要内容,如果未能解决你的问题,请参考以下文章

:keras中的评估指标及自定义评估指标

如何在 Tensorflow 对象检测 api 中评估预训练模型

理解和跟踪对象检测中的指标

如何解决 Tensorflow 2 对象检测 API 中的 UnicodeError

如何评估 TensorFlow 中的新 tf.contrib.summary 摘要?

为啥 TensorFlow 对象检测 2.x 在训练模型时不显示 mAP