About TRT-object-detecction

Description

[TensorRT] ERROR: UFFParser: Validator error: FeatureExtractor/MobilenetV2/layer_19_2_Conv2d_5_3x3_s2_128_depthwise/BatchNorm/FusedBatchNormV3: Unsupported operation _FusedBatchNormV3
[TensorRT] ERROR: Network must have at least one output
Traceback (most recent call last):
File “main.py”, line 43, in
buf = engine.serialize()
AttributeError: ‘NoneType’ object has no attribute ‘serialize’

There was no error when the TRT-object-detection script was executed as it was.
So, I updated coco.py(add the item ‘face’ and delete the rest) and added my retrained new model to the model directory. (checkpoint, frozen_inference_graph.pb, model.ckpt-20000.data-00000-of 00001, model.ckpt-20000.index, model.ckpt-20000.meta, pipeline.config )

That will produce such an error.
Both the example and my model are ssd_mobilenet_v2_coco_2018_03_29 and my model is retrained with that model.
Tell me exactly what should be fixed in the TRT-object-detection example.
Or tell me how to detect through the TRT process.

Environment

TensorRT Version:
GPU Type:
Nvidia Driver Version:
CUDA Version:
CUDNN Version:
Operating System + Version:
Python Version (if applicable):
TensorFlow Version (if applicable):
PyTorch Version (if applicable):
Baremetal or Container (if container which image + tag):

Relevant Files

Please attach or include links to any models, data, files, or scripts necessary to reproduce your issue. (Github repo, Google Drive, Dropbox, etc.)

Steps To Reproduce

Please include:

  • Exact steps/commands to build your repro
  • Exact steps/commands to run your repro
  • Full traceback of errors encountered

Hi,
FusedBatchNormV3 operation is currently not supported by UFF parser.

You can try to convert your model to ONNX instead of UFF using tf2onnx:

tf2onnx supports converting this op to BatchNormalization op in ONNX:

And BatchNormalization op is supported by the TensorRT ONNX parser:
https://github.com/onnx/onnx-tensorrt/blob/master/operators.md

I will also recommend you to use latest TRT version.

Thanks

I’m not asking about errors. I’m asking why running the script as it is doesn’t make an error, but running it as my model does.

Your model might be having the “FusedBatchNormV3” op which is not supported by UFF parser.

Thanks

Can you do that even though you trained with the same model?

Can you share your model file so we can help better?

Thanks

My retrained model is ssd_mobilenet_v2_coco_2018_03_29, and using model in TRT-object-detecion is ssd_mobilenet_v2_coco_2018_03_29, too.

model {
ssd {
num_classes: 1
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
feature_extractor {
type: “ssd_mobilenet_v2”
depth_multiplier: 1.0
min_depth: 16
conv_hyperparams {
regularizer {
l2_regularizer {
weight: 3.99999989895e-05
}
}
initializer {
truncated_normal_initializer {
mean: 0.0
stddev: 0.0299999993294
}
}
activation: RELU_6
batch_norm {
decay: 0.999700009823
center: true
scale: true
epsilon: 0.0010000000475
train: true
}
}

  use_depthwise: true
}
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 {
  }
}
box_predictor {
  convolutional_box_predictor {
    conv_hyperparams {
      regularizer {
        l2_regularizer {
          weight: 3.99999989895e-05
        }
      }
      initializer {
        truncated_normal_initializer {
          mean: 0.0
          stddev: 0.0299999993294
        }
      }
      activation: RELU_6
      batch_norm {
        decay: 0.999700009823
        center: true
        scale: true
        epsilon: 0.0010000000475
        train: true
      }
    }
    min_depth: 0
    max_depth: 0
    num_layers_before_predictor: 0
    use_dropout: false
    dropout_keep_probability: 0.800000011921
    kernel_size: 3
    box_code_size: 4
    apply_sigmoid_to_scores: false
  }
}
anchor_generator {
  ssd_anchor_generator {
    num_layers: 6
    min_scale: 0.20000000298
    max_scale: 0.949999988079
    aspect_ratios: 1.0
    aspect_ratios: 2.0
    aspect_ratios: 0.5
    aspect_ratios: 3.0
    aspect_ratios: 0.333299994469
  }
}
post_processing {
  batch_non_max_suppression {
    score_threshold: 0.300000011921
    iou_threshold: 0.600000023842
    max_detections_per_class: 100
    max_total_detections: 100
  }
  score_converter: SIGMOID
}
normalize_loss_by_num_matches: true
loss {
  localization_loss {
    weighted_smooth_l1 {
    }
  }
  classification_loss {
    weighted_sigmoid {
    }
  }
  hard_example_miner {
    num_hard_examples: 3000
    iou_threshold: 0.990000009537
    loss_type: CLASSIFICATION
    max_negatives_per_positive: 3
    min_negatives_per_image: 3
  }
  classification_weight: 1.0
  localization_weight: 1.0
}

}
}
train_config {
batch_size: 24
data_augmentation_options {
random_horizontal_flip {
}
}
data_augmentation_options {
ssd_random_crop {
}
}
optimizer {
rms_prop_optimizer {
learning_rate {
exponential_decay_learning_rate {
initial_learning_rate: 0.00400000018999
decay_steps: 800720
decay_factor: 0.949999988079
}
}
momentum_optimizer_value: 0.899999976158
decay: 0.899999976158
epsilon: 1.0
}
}
fine_tune_checkpoint: “pre-trained-model/model.ckpt”
num_steps: 200000
fine_tune_checkpoint_type: “detection”
}
train_input_reader {
label_map_path: “annotations/label_map.pbtxt”
tf_record_input_reader {
input_path: “annotations/train.record”
}
}
eval_config {
num_examples: 8000
max_evals: 10
use_moving_averages: false
}
eval_input_reader {
label_map_path: “annotations/label_map.pbtxt”
shuffle: false
num_readers: 1
tf_record_input_reader {
input_path: “annotations/test.record”
}
}

It is my retrained model’s config file.

Just update the config.py

def preprocess(dynamic_graph):
        ...
        # Rename the FusedBatchNormV3 op to FusedBatchNorm 
        fusedbatchnorm_nodes = dynamic_graph.find_nodes_by_op("FusedBatchNormV3")
        for node in fusedbatchnorm_nodes:
            node.op = "FusedBatchNorm"

Or you can try latest TRT 7.1 release.

Thanks