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:
Convert TensorFlow, Keras, Tensorflow.js and Tflite models to ONNX - GitHub - onnx/tensorflow-onnx: Convert TensorFlow, Keras, Tensorflow.js and Tflite models to ONNX
tf2onnx supports converting this op to BatchNormalization op in ONNX:
new_output_shape = [output_shape[2], output_shape[3]]
if spatial == 3:
new_output_shape.append(output_shape[4])
utils.make_sure(new_output_shape.count(-1) <= 0, "output dims need to be known")
utils.make_sure(all(new_output_shape[i] >= input_dims[i] for i in range(spatial)),
"output dims cannot be smaller than input dims.")
if -1 in input_dims:
node.set_attr("output_shape", new_output_shape)
else:
if "strides" in node.attr:
strides = parse_dims_attr(node, node.get_attr("strides").ints, spatial)
else:
strides = [1] * spatial
if "dilations" in node.attr:
dilations = parse_dims_attr(node, node.get_attr("dilations").ints, spatial)
else:
dilations = [1] * spatial
kernel_shape = parse_dims_attr(node, node.get_attr("kernel_shape").ints, spatial)
total_padding = [-1] * spatial
pads = [1] * (spatial * 2)
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