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

How to run TF object detection API model_main.py in evaluation mode only

我想使用 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) or 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 and/or 评估现有的输出字典(包含边界框、class 标签、分数)帕斯卡地图?如果有,我可以轻松地在本地读取 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 仍然有单独的评估和训练脚本时编写的。现在不是这样了。

非常感谢您的帮助。

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

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