1

I'm trying to train Faster-RCNN with custom Densenet conv base. Training works as expected when I train from scratch, however I want to use Densenet training checkpoint already pretrained. Problem is that the pretrained checkpoint only contains "weight" layers but the training API requires also "bias" layers which the checkpoint doesn't have so the training process fails because it cannot load the checkpoint correctly. Is there a way how I can modify the checkpoint so it will have the additional "bias" part of the layers. The github repo where I got the checkpoint https://github.com/taki0112/Densenet-Tensorflow

Edit: Here is the pipeline config file requested:

model {
  faster_rcnn {
    num_classes: 90
    image_resizer {
      keep_aspect_ratio_resizer {
        min_dimension: 600
        max_dimension: 1024
      }
    }
    feature_extractor {
      type: 'faster_rcnn_densenet121'
      first_stage_features_stride: 8
    }
    first_stage_anchor_generator {
      grid_anchor_generator {
        scales: [0.25, 0.5, 1.0, 2.0]
        aspect_ratios: [0.5, 1.0, 2.0]
        height_stride: 8
        width_stride: 8
      }
    }
    first_stage_atrous_rate: 2
    first_stage_box_predictor_conv_hyperparams {
      op: CONV
      regularizer {
        l2_regularizer {
          weight: 0.0
        }
      }
      initializer {
        truncated_normal_initializer {
          stddev: 0.01
        }
      }
    }
    first_stage_nms_score_threshold: 0.0
    first_stage_nms_iou_threshold: 0.7
    first_stage_max_proposals: 300
    first_stage_localization_loss_weight: 2.0
    first_stage_objectness_loss_weight: 1.0
    initial_crop_size: 17
    maxpool_kernel_size: 1
    maxpool_stride: 1
    second_stage_box_predictor {
      mask_rcnn_box_predictor {
        use_dropout: false
        dropout_keep_probability: 1.0
        fc_hyperparams {
          op: FC
          regularizer {
            l2_regularizer {
              weight: 0.0
            }
          }
          initializer {
            variance_scaling_initializer {
              factor: 1.0
              uniform: true
              mode: FAN_AVG
            }
          }
        }
      }
    }
    second_stage_post_processing {
      batch_non_max_suppression {
        score_threshold: 0.0
        iou_threshold: 0.6
        max_detections_per_class: 100
        max_total_detections: 100
      }
      score_converter: SOFTMAX
    }
    second_stage_localization_loss_weight: 2.0
    second_stage_classification_loss_weight: 1.0
  }
}

train_config: {
  batch_size: 1
  optimizer {
    momentum_optimizer: {
      learning_rate: {
        manual_step_learning_rate {
          initial_learning_rate: 0.001
          schedule {
            step: 9000000
            learning_rate: .0001
          }
          schedule {
            step: 12000000
            learning_rate: .00001
          }
        }
      }
      momentum_optimizer_value: 0.9
    }
    use_moving_average: false
  }
  gradient_clipping_by_norm: 10.0
  # Note: The below line limits the training process to 200K steps, which we
  # empirically found to be sufficient enough to train the pets dataset. This
  # effectively bypasses the learning rate schedule (the learning rate will
  # never decay). Remove the below line to train indefinitely.
  fine_tune_checkpoint: "/home/peter/models/research/object_detection/faster_rcnn_densenet121/tf-densenet121.ckpt"
  fine_tune_checkpoint_type: "classification"
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
}

train_input_reader: {
  tf_record_input_reader {
    input_path: "/home/peter/models/research/object_detection/data/coco_train.record-*"
  }
  label_map_path: "/home/peter/models/research/object_detection/data/mscoco_label_map.pbtxt"
}

eval_config: {
  num_examples: 8000
  max_evals: 10
  # Note: The below line limits the evaluation process to 10 evaluations.
  # Remove the below line to evaluate indefinitely.
  use_moving_averages: false
  metrics_set: "coco_detection_metrics"
  eval_interval_secs: 3600
}

eval_input_reader: {
  tf_record_input_reader {
    input_path: "/home/peter/models/research/object_detection/data/coco_val.record-00000-of-00010"
  }
  label_map_path: "/home/peter/models/research/object_detection/data/mscoco_label_map.pbtxt"
  shuffle: false
  num_readers: 1
  queue_capacity: 20    # change this number
  min_after_dequeue: 1 # change this number (strictly less than the above)
}
  • would you please include the pipeline-config file that you used for your training. – danyfang Apr 11 at 14:52
  • This is an interesting question! I think modifying the checkpoint file is probably not the correct direction to go but you can filter the computation graph variables so that they all exist in the checkpoint and then restore them. Here is a userful link stackoverflow.com/questions/42217320/…. – danyfang Apr 11 at 16:31
  • If there is a way how the API would accept the original checkpoint, that would solve the problem aswell – RottingApple Apr 11 at 16:38
  • I tried to train a faster-rcnn-resnet101 while restoring the weights from pretrained resnet50 weights, the training gives a fair amount of warning saying Variable xx is not available in checkpoint but it can still continue. The API already implemented the variables filtering in function get_variables_available_in_checkpoint in file utils/variables_helper.py. – danyfang Apr 12 at 8:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.