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

时间:2019-04-01 13:04:01

标签: python tensorflow google-cloud-ml object-detection-api

我想使用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 个答案:

答案 0 :(得分:1)

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

关于为什么要使用组合脚本...从对象检测API的角度来看,我们试图在tf.Estimator范例中编写内容---但您是对的,我个人觉得这很容易这两个功能位于单独的二进制文件中。如果需要,您可以随时将此功能包装在另一个二进制文件中:)