Tensorflow 对象检测 API:从导出的模型检查点进行训练

Tensorflow Object Detection API: Train from exported model checkpoint

我之前导出了一个 RetinaNet 模型(最初来自对象检测动物园),该模型已使用 Tensorflow 对象检测 API(Tensorflow 版本 2.4.1)在自定义数据集上进行了微调。下面是导出的模型文件夹的外观。

当运行对模型进行评估(如下所示)时,它的 mAP@0.5IOU 为 0.5。

python model_main_tf2.py --model_dir=exported-models/retinanet --pipeline_config_path=exported-models/retinanet/pipeline.config --checkpoint_dir=exported-models/retinanet/checkpoint

问题

由于不幸的情况,我没有训练模型时的训练文件夹。由于我最近获得了更多数据,我想使用导出的模型作为进一步训练的起点,并在 pipeline.config 中设置 fine_tune_checkpoint: "exported-models/retinanet/checkpoint/ckpt-0" 用于新训练:

  fine_tune_checkpoint: "exported-models/retinanet/checkpoint/ckpt-0"
  num_steps: 25000
  startup_delay_steps: 0.0
  replicas_to_aggregate: 8
  max_number_of_boxes: 100
  unpad_groundtruth_tensors: false
  fine_tune_checkpoint_type: "detection"
  use_bfloat16: false
  fine_tune_checkpoint_version: V2

然而,当使用 model_main_tf2.py 脚本开始训练时,第一个检查点(在第 0 步)的分数很糟糕 - 即使在评估 运行 的同一数据集上对于导出的模型。

我希望第一个检查点与导出模型的分数具有相同的分数(至少对于相同的测试集)。这是错误的假设吗?在那种情况下,为什么?

我终于找到了下面的here:

// Whether to load all checkpoint vars that match model variable names and
// sizes. This option is only available if `from_detection_checkpoint` is
// True.  This option is *not* supported for TF2 --- setting it to true
// will raise an error. **Instead, set fine_tune_checkpoint_type: 'full'.**
  optional bool load_all_detection_checkpoint_vars = 19 [default = false];

通过将 fine_tune_checkpoint_type 设置为“完整”,我得到了第一个检查点的正确地图(在 0 步)。