TF object detection API detection model retraining: "object_detection.protos.SsdFeatureExtractor" has no field named "batch_norm_trainable"
Asked Answered
A

1

8

I'm retraining mobilenet v2 SSD using Tensorflow Object Detection API and I get this particular error on both Windows and Ubuntu environments.
My environment below is Windows 10 with python 3.5, cuda 9.0, and tensorflow-gpu 1.6. I compiled protobuf with protobuf 3.4.0.
I did the installation test and it was okay, so now I'm trying with my own dataset and getting google.protobuf.text_format.ParseError: 108:7 : Message type "object_detection.protos.SsdFeatureExtractor" has no field named "batch_norm_trainable". error.

Things I tried:

  • Using tf 1.5 - 1.7
  • Training mobilenet v1 SSD

The whole error code:

C:\Users\kazuy\models\research>python object_detection/train.py --logtostderr --train_dir="C:\\Users\\kazuy\\models\\research\\object_detection\\projects\\coco_selfcar\\tests\\test30" --pipeline_config_path="C:\\Users\\kazuy\\models\\research\\object_detection\\projects\\coco_selfcar\\ssd_mobilenet_v2_coco.config"
Traceback (most recent call last):
  File "object_detection/train.py", line 167, in <module>
    tf.app.run()
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\platform\app.py", line 126, in run
    _sys.exit(main(argv))
  File "object_detection/train.py", line 92, in main
    FLAGS.pipeline_config_path)
  File "C:\Users\kazuy\models\research\object_detection\utils\config_util.py", line 93, in get_configs_from_pipeline_file
    text_format.Merge(proto_str, pipeline_config)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 533, in Merge
    descriptor_pool=descriptor_pool)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 587, in MergeLines
    return parser.MergeLines(lines, message)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 620, in MergeLines
    self._ParseOrMerge(lines, message)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 635, in _ParseOrMerge
    self._MergeField(tokenizer, message)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 735, in _MergeField
    merger(tokenizer, message, field)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 823, in _MergeMessageField
    self._MergeField(tokenizer, sub_message)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 735, in _MergeField
    merger(tokenizer, message, field)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 823, in _MergeMessageField
    self._MergeField(tokenizer, sub_message)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 735, in _MergeField
    merger(tokenizer, message, field)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 823, in _MergeMessageField
    self._MergeField(tokenizer, sub_message)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\google\protobuf\text_format.py", line 703, in _MergeField
    (message_descriptor.full_name, name))
google.protobuf.text_format.ParseError: 108:7 : Message type "object_detection.protos.SsdFeatureExtractor" has no field named "batch_norm_trainable".

The config file that I use is mostly unchanged from the sample files from here:

# SSD with Mobilenet v2 configuration for MSCOCO Dataset.
# Users should configure the fine_tune_checkpoint field in the train config as
# well as the label_map_path and input_path fields in the train_input_reader and
# eval_input_reader. Search for "PATH_TO_BE_CONFIGURED" to find the fields that
# should be configured.

model {
  ssd {
    num_classes:3
    box_coder {
      faster_rcnn_box_coder {
        y_scale: 10.0
        x_scale: 10.0
        height_scale: 5.0
        width_scale: 5.0
      }
    }
    matcher {
      argmax_matcher {
        matched_threshold: 0.5
        unmatched_threshold: 0.5
        ignore_thresholds: false
        negatives_lower_than_unmatched: true
        force_match_for_each_row: true
      }
    }
    similarity_calculator {
      iou_similarity {
      }
    }
    anchor_generator {
      ssd_anchor_generator {
        num_layers: 6
        min_scale: 0.2
        max_scale: 0.95
        aspect_ratios: 1.0
        aspect_ratios: 2.0
        aspect_ratios: 0.5
        aspect_ratios: 3.0
        aspect_ratios: 0.3333
      }
    }
    image_resizer {
      fixed_shape_resizer {
        height: 300
        width: 300
      }
    }
    box_predictor {
      convolutional_box_predictor {
        min_depth: 0
        max_depth: 0
        num_layers_before_predictor: 0
        use_dropout: false
        dropout_keep_probability: 0.8
        kernel_size: 3
        box_code_size: 4
        apply_sigmoid_to_scores: false
        conv_hyperparams {
          activation: RELU_6,
          regularizer {
            l2_regularizer {
              weight: 0.00004
            }
          }
          initializer {
            truncated_normal_initializer {
              stddev: 0.03
              mean: 0.0
            }
          }
          batch_norm {
            train: true,
            scale: true,
            center: true,
            decay: 0.9997,
            epsilon: 0.001,
          }
        }
      }
    }
    feature_extractor {
      type: 'ssd_mobilenet_v2'
      min_depth: 16
      depth_multiplier: 1.0
      use_depthwise: true
      conv_hyperparams {
        activation: RELU_6,
        regularizer {
          l2_regularizer {
            weight: 0.00004
          }
        }
        initializer {
          truncated_normal_initializer {
            stddev: 0.03
            mean: 0.0
          }
        }
        batch_norm {
          train: true,
          scale: true,
          center: true,
          decay: 0.9997,
          epsilon: 0.001,
        }
      }
      batch_norm_trainable: true
    }
    loss {
      classification_loss {
        weighted_sigmoid {
        }
      }
      localization_loss {
        weighted_smooth_l1 {
        }
      }
      hard_example_miner {
        num_hard_examples: 3000
        iou_threshold: 0.99
        loss_type: CLASSIFICATION
        max_negatives_per_positive: 3
        min_negatives_per_image: 3
      }
      classification_weight: 1.0
      localization_weight: 1.0
    }
    normalize_loss_by_num_matches: true
    post_processing {
      batch_non_max_suppression {
        score_threshold: 1e-8
        iou_threshold: 0.6
        max_detections_per_class: 100
        max_total_detections: 100
      }
      score_converter: SIGMOID
    }
  }
}

train_config: {
  batch_size: 24
  optimizer {
    rms_prop_optimizer: {
      learning_rate: {
        exponential_decay_learning_rate {
          initial_learning_rate: 0.004
          decay_steps: 800720
          decay_factor: 0.95
        }
      }
      momentum_optimizer_value: 0.9
      decay: 0.9
      epsilon: 1.0
    }
  }
  fine_tune_checkpoint: "C:\\Users\\kazuy\\models\\research\\object_detection\\model_zoo\\ssd_mobilenet_v2_coco_2018_03_29\\model.ckpt"
  fine_tune_checkpoint_type:  "detection"
  # 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.
  num_steps: 200000
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
  data_augmentation_options {
    ssd_random_crop {
    }
  }
}

train_input_reader: {
  tf_record_input_reader {
    input_path: "C:\\Users\\kazuy\\models\\research\\object_detection\\projects\\coco_selfcar\\tests\\test30\\train.tfrecords"
  }
  label_map_path: "C:\\Users\\kazuy\\models\\research\\object_detection\\projects\\coco_selfcar\\label_map.pbtxt"
}

eval_config: {
  num_examples: 8000
  # Note: The below line limits the evaluation process to 10 evaluations.
  # Remove the below line to evaluate indefinitely.
  max_evals: 10
}

eval_input_reader: {
  tf_record_input_reader {
    input_path: "PATH_TO_BE_CONFIGURED/mscoco_val.record"
  }
  label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt"
  shuffle: false
  num_readers: 1
}

And this is the labelmap:

item {
  id: 1
  name: 'Pedestrian'
}

item {
  id: 2
  name: 'Car'
}

item {
  id: 3
  name: 'Truck'
}

When I try the training with mobilenet v1 SSD by using a modified version of this config file I get a different error:

C:\Users\kazuy\models\research>python object_detection/train.py --logtostderr --train_dir="C:\\Users\\kazuy\\models\\research\\object_detection\\projects\\coco_selfcar\\tests\\test30" --pipeline_config_path="C:\\Users\\kazuy\\models\\research\\object_detection\\projects\\coco_selfcar\\ssd_mobilenet_v1_pets.config"
WARNING:tensorflow:From C:\Users\kazuy\models\research\object_detection\trainer.py:257: create_global_step (from tensorflow.contrib.framework.python.ops.variables) is deprecated and will be removed in a future version.
Instructions for updating:
Please switch to tf.train.create_global_step
Traceback (most recent call last):
  File "object_detection/train.py", line 167, in <module>
    tf.app.run()
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\platform\app.py", line 126, in run
    _sys.exit(main(argv))
  File "object_detection/train.py", line 163, in main
    worker_job_name, is_chief, FLAGS.train_dir)
  File "C:\Users\kazuy\models\research\object_detection\trainer.py", line 275, in train
    clones = model_deploy.create_clones(deploy_config, model_fn, [input_queue])
  File "C:\Users\kazuy\models\research\slim\deployment\model_deploy.py", line 193, in create_clones
    outputs = model_fn(*args, **kwargs)
  File "C:\Users\kazuy\models\research\object_detection\trainer.py", line 198, in _create_losses
    prediction_dict = detection_model.predict(images, true_image_shapes)
  File "C:\Users\kazuy\models\research\object_detection\meta_architectures\ssd_meta_arch.py", line 384, in predict
    preprocessed_inputs)
  File "C:\Users\kazuy\models\research\object_detection\models\ssd_mobilenet_v1_feature_extractor.py", line 121, in extract_features
    scope=scope)
  File "C:\Users\kazuy\models\research\slim\nets\mobilenet_v1.py", line 267, in mobilenet_v1_base
    scope=end_point)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\framework\python\ops\arg_scope.py", line 183, in func_with_args
    return func(*args, **current_args)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\layers\python\layers\layers.py", line 1059, in convolution
    outputs = normalizer_fn(outputs, **normalizer_params)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\framework\python\ops\arg_scope.py", line 183, in func_with_args
    return func(*args, **current_args)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\contrib\layers\python\layers\layers.py", line 651, in batch_norm
    outputs = layer.apply(inputs, training=is_training)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\layers\base.py", line 809, in apply
    return self.__call__(inputs, *args, **kwargs)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\layers\base.py", line 696, in __call__
    outputs = self.call(inputs, *args, **kwargs)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\layers\normalization.py", line 544, in call
    training_value = utils.constant_value(training)
  File "C:\Users\kazuy\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\layers\utils.py", line 240, in constant_value
    raise TypeError('`pred` must be a Tensor, a Variable, or a Python bool.')

I have been successfully training mobilenetv1 ssd models on ubuntu last month, and I started encountering this error after installing the repository from scratch today.
I'd appreciate any help! Thank you!

Agosto answered 17/4, 2018 at 14:36 Comment(0)
A
19

For ssd mobilenet v2, you could remove "batch_norm_trainable: true" as this field is deprecated now.

Astigmia answered 17/4, 2018 at 17:5 Comment(5)
Thank you, the "batch_norm_trainable" error did go away after commenting out the config file's corresponding row. However now my error is the same with the mobilenet v1 SSD error ( TypeError('`pred` must be a Tensor, a Variable, or a Python bool.') ). But the issue on the title did go away so I'll try to find out what I could've done wrong at set up that affects the training process not to run. Thank you!Agosto
This new error should also be gone after we synced slim dir.Astigmia
This answer does not indicate from which to remove "batch_norm_trainable: true". I do not have this in my config, yet I get the error. I grep for it and find this : $ grep batch_norm_trainable ./protos/ssd.proto // variables may depend on both values of batch_norm_trainable and $ grep batch_norm_trainable ./builders/model_builder.py batch_norm_trainable = feature_extractor_config.batch_norm_trainable batch_norm_trainable, reuse_weights)Edgell
It's in the config file. If you don't even know where to find this, you should just sync your fork to latest.Astigmia
Hey @ZhichaoLu, if possible can you remove the batch_norm_trainable: true line from the config file that has been included in the MobileNetV2 SSD COCO pre-trained checkpoint download tar file linked in the TensorFlow Object Detection API Model Zoo on github ? The config file included in the tar file has the line as of 2019-05-10. Thanks.Gravel

© 2022 - 2024 — McMap. All rights reserved.