如何在使用 model_main 进行训练的同时连续不断地评估 tensorflow 对象检测模型

Vol*_*mpa 6 object-detection tensorflow

我使用train.py和成功地训练了带有自定义示例的对象检测模型eval.py。并行运行这两个程序,我能够在训练期间在 tensorboard 中可视化训练和评估指标。

然而,这两个程序都被移到了legacy文件夹中,并且model_main.py似乎是运行培训和评估的首选方式(通过只执行一个进程)。但是,当我从model_main.py以下内容开始时pipeline.config

train_config {
  batch_size: 1
  num_steps: 40000
  ...
}
eval_config {
  # entire evaluation set
  num_examples: 821
  # for continuous evaluation
  max_evals: 0
  ...
}
Run Code Online (Sandbox Code Playgroud)

我看到启用 INFO 日志记录model_main.py训练和评估的输出是按顺序执行的(而不是像以前那样同时执行两个进程),并且在每个训练步骤之后都会进行完整的评估。

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 35932: ...
INFO:tensorflow:Saving checkpoints for 35933 into ...
INFO:tensorflow:Calling model_fn.
...
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-08-30-10:06:47
...
INFO:tensorflow:Restoring parameters from .../model.ckpt-35933
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [82/821]
...
INFO:tensorflow:Evaluation [738/821]
INFO:tensorflow:Evaluation [820/821]
INFO:tensorflow:Evaluation [821/821]
...
INFO:tensorflow:Finished evaluation at 2018-08-30-10:29:35
INFO:tensorflow:Saving dict for global step 35933: ...
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 35933: .../model.ckpt-35933
INFO:tensorflow:Saving checkpoints for 35934 into .../model.ckpt.
INFO:tensorflow:Calling model_fn.
...
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-08-30-10:29:56
...
INFO:tensorflow:Restoring parameters from .../model.ckpt-35934
Run Code Online (Sandbox Code Playgroud)

这当然会以几乎没有任何进展的方式减慢训练速度。当我使用model_main的命令行参数将评估步骤减少--num_eval_steps1训练时,速度与以前一样快(使用train.pyeval.py),但是评估指标变得无用(例如,DetectionBoxes_Precision/mAP...变得恒定并且具有像10甚至 之类的值-1)。对我来说,它似乎只为同一幅图像不断计算这些值。

那么什么是正确的开始方式model_main.py,即确实取得合理的快速进展并并行计算整个评估集的评估指标。

net*_*sam 2

在training.py中有一个类EvalSpec,在main_lib.py中调用。它的构造函数有一个参数叫它throttle_secs设置后续评估之间的间隔,默认值为 600,并且它永远不会在 model_lib.py 中获得不同的值。如果您有想要的特定值,您可以简单地更改默认值,但更好的做法当然是将其作为 model_main.py 的参数传递,该参数将EvalSpec通过 model_lib.py 提供。

更详细地说,将其设置为另一个输入标志 flags.DEFINE_integer('throttle_secs', <DEFAULT_VALUE>, 'EXPLANATION'),然后 throttle_secs=FLAGS.throttle_secs,然后更改model_lib.create_train_and_eval_specs为也接收throttle_secs,并在其中将其添加到 的调用中tf.estimator.EvalSpec

编辑:我发现您还可以eval_interval_secs在 .config 文件的 eval_config 中进行设置。如果这有效(并非所有标志都受支持,因为它们从 eval.py 移至 model_main.py) - 这显然是一个更简单的解决方案。如果没有 - 使用上面的解决方案。

EDIT2:我尝试eval_interval_secs在 eval_config 中使用,但它不起作用,所以您应该使用第一个解决方案。