tensorflow / models

Models and examples built with TensorFlow
Other
77.05k stars 45.77k forks source link

object_detection/export_tflite_graph_tf2.py error ValueError: Tensor's shape is not compatible with supplied shape #9610

Closed Whrothus closed 3 years ago

Whrothus commented 3 years ago

Prerequisites

Please answer the following questions for yourself before submitting an issue.

1. The entire URL of the file you are using

https://github.com/tensorflow/models/tree/master/research/object_detection/export_tflite_graph_tf2.py

2. Describe the bug

Keep getting bug "ValueError: Tensor's shape (1, 1, 128, 42) is not compatible with supplied shape (1, 1, 128, 546)"

3. Steps to reproduce

Folowed Roboflow tutorial Changed config

model { ssd { num_classes: 6 image_resizer { fixed_shape_resizer { height: 320 width: 320 } } feature_extractor { type: "ssd_mobilenet_v2_fpn_keras" depth_multiplier: 1.0 min_depth: 16 conv_hyperparams { regularizer { l2_regularizer { weight: 3.9999998989515007e-05 } } initializer { random_normal_initializer { mean: 0.0 stddev: 0.009999999776482582 } } activation: RELU_6 batch_norm { decay: 0.996999979019165 scale: true epsilon: 0.0010000000474974513 } } use_depthwise: true override_base_feature_extractor_hyperparams: true fpn { min_level: 3 max_level: 7 additional_layer_depth: 128 } } 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 use_matmul_gather: true } } similarity_calculator { iou_similarity { } } box_predictor { weight_shared_convolutional_box_predictor { conv_hyperparams { regularizer { l2_regularizer { weight: 3.9999998989515007e-05 } } initializer { random_normal_initializer { mean: 0.0 stddev: 0.009999999776482582 } } activation: RELU_6 batch_norm { decay: 0.996999979019165 scale: true epsilon: 0.0010000000474974513 } } depth: 128 num_layers_before_predictor: 4 kernel_size: 3 class_prediction_bias_init: -4.599999904632568 share_prediction_tower: true use_depthwise: true } } anchor_generator { multiscale_anchor_generator { min_level: 3 max_level: 7 anchor_scale: 4.0 aspect_ratios: 1.0 aspect_ratios: 2.0 aspect_ratios: 0.5 scales_per_octave: 2 } } post_processing { batch_non_max_suppression { score_threshold: 9.99999993922529e-09 iou_threshold: 0.6000000238418579 max_detections_per_class: 100 max_total_detections: 100 use_static_shapes: false } score_converter: SIGMOID } normalize_loss_by_num_matches: true loss { localization_loss { weighted_smooth_l1 { } } classification_loss { weighted_sigmoid_focal { gamma: 2.0 alpha: 0.25 } } classification_weight: 1.0 localization_weight: 1.0 } encode_background_as_zeros: true normalize_loc_loss_by_codesize: true inplace_batchnorm_update: true freeze_batchnorm: false } } train_config { batch_size: 16 data_augmentation_options { random_horizontal_flip { } } data_augmentation_options { random_crop_image { min_object_covered: 0.0 min_aspect_ratio: 0.75 max_aspect_ratio: 3.0 min_area: 0.75 max_area: 1.0 overlap_thresh: 0.0 } } sync_replicas: true optimizer { momentum_optimizer { learning_rate { cosine_decay_learning_rate { learning_rate_base: 0.07999999821186066 total_steps: 50000 warmup_learning_rate: 0.026666000485420227 warmup_steps: 1000 } } momentum_optimizer_value: 0.8999999761581421 } use_moving_average: false } fine_tune_checkpoint: "/content/models/research/deploy/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/checkpoint/ckpt-0" num_steps: 2500 startup_delay_steps: 0.0 replicas_to_aggregate: 8 max_number_of_boxes: 100 unpad_groundtruth_tensors: false fine_tune_checkpoint_type: "detection" fine_tune_checkpoint_version: V2 } train_input_reader { label_map_path: "/content/train/labelmap.pbtxt" tf_record_input_reader { input_path: "/content/train/train.record" } } eval_config { metrics_set: "coco_detection_metrics" use_moving_averages: false } eval_input_reader { label_map_path: "/content/train/labelmap.pbtxt" shuffle: false num_epochs: 1 tf_record_input_reader { input_path: "/content/valid/test.record" } }

Got Record from https://www.youtube.com/watch?v=Rgpfk6eYxJA&t=1062s

raw_dataset = tf.data.TFRecordDataset('/content/valid/train.record')

for raw_record in raw_dataset.take(1): example = tf.train.Example() example.ParseFromString(raw_record.numpy()) print(example)

makes "features { feature { key: "image/encoded" value { bytes_list { %%% some Bytes starting with value: "\377\330\377\340\000\020JFIF\000\001\001\000\000\001\000\001... %%% } } } feature { key: "image/filename" value { bytes_list { value: "IMG_2383.JPG" } } } feature { key: "image/format" value { bytes_list { value: "jpg" } } } feature { key: "image/height" value { int64_list { value: 504 } } } feature { key: "image/object/bbox/xmax" value { float_list { value: 0.7275132536888123 } } } feature { key: "image/object/bbox/xmin" value { float_list { value: 0.25661376118659973 } } } feature { key: "image/object/bbox/ymax" value { float_list { value: 0.7301587462425232 } } } feature { key: "image/object/bbox/ymin" value { float_list { value: 0.2698412835597992 } } } feature { key: "image/object/class/label" value { int64_list { value: 6 } } } feature { key: "image/object/class/text" value { bytes_list { value: "ace" } } } feature { key: "image/source_id" value { bytes_list { value: "IMG_2383.JPG" } } } feature { key: "image/width" value { int64_list { value: 378 } } } }

4. Expected behavior

To get the Tflite file back not a name: serving_default_input_tensor:0 but name: normalized_input_image_tensor

5. Additional context

Tried different SSD models

tf.lite.TFLiteConverter.from_saved_model returns a wrong input and output name: serving_default_input_tensor:0

6. System information

Colab

import os import pathlib

Clone the tensorflow models repository if it doesn't already exist

if "models" in pathlib.Path.cwd().parts: while "models" in pathlib.Path.cwd().parts: os.chdir('..') elif not pathlib.Path('models').exists(): !git clone --depth 1 https://github.com/tensorflow/models ...

Dit not understand the other bug report solutions

Whrothus commented 3 years ago

Dit try to change the input (train and eval) Used Roboflow got a TFrecord not a record But still the same output

Whrothus commented 3 years ago

Solved was pointing to the base model not the changed

google-ml-butler[bot] commented 3 years ago

Are you satisfied with the resolution of your issue? Yes No

EragonYin commented 3 years ago

Solved was pointing to the base model not the changed how to do that :( ?

Whrothus commented 3 years ago

Solved was pointing to the base model not the changed how to do that :( ?

!python /content/models/research/object_detection/export_tflite_graph_tf2.py \ --pipeline_config_path={pipeline_file} \ <== This was not pointing to my adjusted config --trained_checkpoint_dir={last_model_path} \ --output_directory={tflite_directory}

EragonYin commented 3 years ago

Solved was pointing to the base model not the changed how to do that :( ?

!python /content/models/research/object_detection/export_tflite_graph_tf2.py --pipeline_config_path={pipeline_file} \ <== This was not pointing to my adjusted config --trained_checkpoint_dir={last_model_path} --output_directory={tflite_directory}

i used the same shell and output the same error. i notice you do that "was pointing to the base model", the base model was exported by yourself?

Whrothus commented 3 years ago

I don't get what you say but what i did was take a SSD model changed the config and trained it. When i did try to export i did not point to my changed config but pointed to the default unchanged ssd config. Hope this helps

AIprototype commented 6 months ago

@Whrothus your answer really helped me, I can't believe I was stuck cause I was using the models default configs 😅 when generating the .pb file