Thanks for your reply, and no problem for the delay. I’m successfully converting my model to uff but when i’m trying to use the trtexec program I’m having this error :
Any idea on why this is happening ? Is it because I’m running this on the Xavier ? Will try to find out why while awaiting for your answer, thanks again !
Edit: It seems like my error is here because I’m using a tf-trt model. But I also tried with the non tf-trt version of my model and the error is now :
“”“build_engine.py
This script converts a SSD model (pb) to UFF and subsequently builds
the TensorRT engine.
Input : ssd_mobilenet_v[1|2][coco|egohands].pb
Output: TRT_ssd_mobilenet_v[1|2][coco|egohands].bin
“””
import os
import ctypes
import argparse
import uff
import tensorrt as trt
import graphsurgeon as gs
import tensorflow as tf
DIR_NAME = os.path.dirname(file)
LIB_FILE = os.path.abspath(os.path.join(DIR_NAME, ‘libflattenconcat.so’))
MODEL_SPECS = {
‘ssd_mobilenet_v1_coco’: {
‘input_pb’: os.path.abspath(os.path.join(
DIR_NAME, ‘ssd_mobilenet_v1_coco.pb’)),
‘tmp_uff’: os.path.abspath(os.path.join(
DIR_NAME, ‘tmp_v1_coco.uff’)),
‘output_bin’: os.path.abspath(os.path.join(
DIR_NAME, ‘TRT_ssd_mobilenet_v1_coco.bin’)),
‘num_classes’: 91,
‘min_size’: 0.2,
‘max_size’: 0.95,
‘input_order’: [0, 2, 1], # order of loc_data, conf_data, priorbox_data
},
‘ssd_mobilenet_v1_egohands’: {
‘input_pb’: os.path.abspath(os.path.join(
DIR_NAME, ‘ssd_mobilenet_v1_egohands.pb’)),
‘tmp_uff’: os.path.abspath(os.path.join(
DIR_NAME, ‘tmp_v1_egohands.uff’)),
‘output_bin’: os.path.abspath(os.path.join(
DIR_NAME, ‘TRT_ssd_mobilenet_v1_egohands.bin’)),
‘num_classes’: 2,
‘min_size’: 0.05,
‘max_size’: 0.95,
‘input_order’: [0, 2, 1], # order of loc_data, conf_data, priorbox_data
},
‘ssd_mobilenet_v2_coco’: {
‘input_pb’: os.path.abspath(os.path.join(
DIR_NAME, ‘ssd_mobilenet_v2_coco.pb’)),
‘tmp_uff’: os.path.abspath(os.path.join(
DIR_NAME, ‘tmp_v2_coco.uff’)),
‘output_bin’: os.path.abspath(os.path.join(
DIR_NAME, ‘TRT_ssd_mobilenet_v2_coco.bin’)),
‘num_classes’: 91,
‘min_size’: 0.2,
‘max_size’: 0.95,
‘input_order’: [1, 0, 2], # order of loc_data, conf_data, priorbox_data
},
‘ssd_mobilenet_v2_egohands’: {
‘input_pb’: os.path.abspath(os.path.join(
DIR_NAME, ‘ssd_mobilenet_v2_egohands.pb’)),
‘tmp_uff’: os.path.abspath(os.path.join(
DIR_NAME, ‘tmp_v2_egohands.uff’)),
‘output_bin’: os.path.abspath(os.path.join(
DIR_NAME, ‘TRT_ssd_mobilenet_v2_egohands.bin’)),
‘num_classes’: 2,
‘min_size’: 0.05,
‘max_size’: 0.95,
‘input_order’: [0, 2, 1], # order of loc_data, conf_data, priorbox_data
},
‘yolov3_coco’: {
‘input_pb’: os.path.abspath(os.path.join(
DIR_NAME, ‘yolov3_coco.pb’)),
‘tmp_uff’: os.path.abspath(os.path.join(
DIR_NAME, ‘yolov3_coco.uff’)),
‘output_bin’: os.path.abspath(os.path.join(
DIR_NAME, ‘TRT_yolov3_coco.bin’)),
‘num_classes’: 80,
‘min_size’: 0.05,
‘max_size’: 0.95,
‘input_order’: [0, 2, 1], # order of loc_data, conf_data, priorbox_data
},
‘ssd_inception_v2_boats’: {
‘input_pb’: os.path.abspath(os.path.join(
DIR_NAME, ‘/media/nxavier/xavier_ssd/training_boat/hand-detection-tutorial/frozen_inference_graph_v3_haze.pb’)),#‘/media/nxavier/xavier_ssd/training_boat/hand-detection-tutorial/model_exported/frozen_inference_graph.pb’)),
‘tmp_uff’: os.path.abspath(os.path.join(
DIR_NAME, ‘tmp_v3_boats.uff’)),
‘output_bin’: os.path.abspath(os.path.join(
DIR_NAME, ‘TRT_ssd_inception_v3_boats.bin’)),
‘num_classes’: 2,
‘min_size’: 0.15,
‘max_size’: 0.9,
‘input_order’: [0, 2, 1], # order of loc_data, conf_data, priorbox_data
},
}
INPUT_DIMS2 = (3,300,300)
INPUT_DIMS = [3, 300, 300]
DEBUG_UFF = False
def add_plugin(graph, model, spec):
“”“add_plugin
Reference:
1. https://github.com/AastaNV/TRT_object_detection/blob/master/config/model_ssd_mobilenet_v1_coco_2018_01_28.py
2. https://github.com/AastaNV/TRT_object_detection/blob/master/config/model_ssd_mobilenet_v2_coco_2018_03_29.py
3. how to write config.py for converting ssd-mobilenetv2 to uff format - Jetson Nano - NVIDIA Developer Forums
“””
numClasses = spec[‘num_classes’]
minSize = spec[‘min_size’]
maxSize = spec[‘max_size’]
inputOrder = spec[‘input_order’]
all_assert_nodes = graph.find_nodes_by_op(“Assert”)
graph.remove(all_assert_nodes, remove_exclusive_dependencies=True)
all_identity_nodes = graph.find_nodes_by_op(“Identity”)
graph.forward_inputs(all_identity_nodes)
Input = gs.create_plugin_node(
name=“Input”,
op=“Placeholder”,
shape=(1,) + INPUT_DIMS2
)
PriorBox = gs.create_plugin_node(
name=“MultipleGridAnchorGenerator”,
op=“GridAnchor_TRT”,
minSize=minSize, # was 0.2
maxSize=maxSize, # was 0.95
aspectRatios=[1.0, 2.0, 0.5, 3.0, 0.33],
variance=[0.1, 0.1, 0.2, 0.2],
featureMapShapes=[19, 10, 5, 3, 2, 1],
numLayers=6
)
NMS = gs.create_plugin_node(name=“NMS”, op=“NMS_TRT”,
shareLocation=1,
varianceEncodedInTarget=0,
backgroundLabelId=0,
confidenceThreshold=1e-8,
nmsThreshold=0.6,
topK=100,
keepTopK=100,
numClasses=3,
inputOrder= [0, 2, 1],
confSigmoid=1,
isNormalized=1
)
concat_priorbox = gs.create_node(
“concat_priorbox”,
op=“ConcatV2”,
axis=2
)
if trt.version[0] >= ‘7’:
concat_box_loc = gs.create_plugin_node(
“concat_box_loc”,
op=“FlattenConcat_TRT”,
axis=1,
ignoreBatch=0
)
concat_box_conf = gs.create_plugin_node(
“concat_box_conf”,
op=“FlattenConcat_TRT”,
axis=1,
ignoreBatch=0
)
else:
concat_box_loc = gs.create_plugin_node(
“concat_box_loc”,
op=“FlattenConcat_TRT”
)
concat_box_conf = gs.create_plugin_node(
“concat_box_conf”,
op=“FlattenConcat_TRT”
)
namespace_plugin_map = {
“MultipleGridAnchorGenerator”: PriorBox,
“Postprocessor”: NMS,
“Preprocessor”: Input,
“ToFloat”: Input,
“image_tensor”: Input,
“MultipleGridAnchorGenerator/Concatenate”: concat_priorbox, # for ‘ssd_mobilenet_v1_coco’
#“MultipleGridAnchorGenerator/Identity”: concat_priorbox,
“Concatenate”: concat_priorbox, # for other models
“concat”: concat_box_loc,
“concat_1”: concat_box_conf
}
graph.collapse_namespaces(namespace_plugin_map)
graph.remove(graph.graph_outputs, remove_exclusive_dependencies=False)
graph.find_nodes_by_op(“NMS_TRT”)[0].input.remove(“Input”)
if model == ‘ssd_mobilenet_v1_coco’:
graph.find_nodes_by_name(“Input”)[0].input.remove(“image_tensor:0”)
return graph
def replace_fusedbnv3(graph):
“”“Replace all ‘FusedBatchNormV3’ in the graph with ‘FusedBatchNorm’.
NOTE: ‘FusedBatchNormV3’ is not supported by UFF parser.
TensorRT 6.0.1 + TensorFlow 1.14 - No conversion function registered for layer: FusedBatchNormV3 yet - TensorRT - NVIDIA Developer Forums
“””
for node in graph.find_nodes_by_op(‘FusedBatchNormV3’):
gs.update_node(node, op=‘FusedBatchNorm’)
return graph
def main():
parser = argparse.ArgumentParser()
parser.add_argument(‘model’, type=str, default = “ssd_inception_v2_boats”,choices=list(MODEL_SPECS.keys()))
args = parser.parse_args()
# initialize
if trt.version[0] < ‘7’:
ctypes.CDLL(LIB_FILE)
TRT_LOGGER = trt.Logger(trt.Logger.INFO)
trt.init_libnvinfer_plugins(TRT_LOGGER, ‘’)
# compile the model into TensorRT engine
model = args.model
spec = MODEL_SPECS[model]
dynamic_graph = add_plugin(
gs.DynamicGraph(spec[‘input_pb’]),
model,
spec)
dynamic_graph = replace_fusedbnv3(dynamic_graph)
_ = uff.from_tensorflow(
dynamic_graph.as_graph_def(),
[‘NMS’],
output_filename=spec[‘tmp_uff’],
text=True,
debug_mode=DEBUG_UFF)
#G_LOGGER = trt.infer.ConsoleLogger(trt.infer.LogSeverity.ERROR)
with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.UffParser() as parser:
builder.max_workspace_size = 1 << 28
builder.max_batch_size = 1
builder.fp16_mode = True
parser.register_input(‘Input’, INPUT_DIMS)
parser.register_output(‘MarkOutput_0’)
parser.parse(spec[‘tmp_uff’], network)
#last_layer = network.get_layer(network.num_layers)
#print(last_layer)
#network.mark_output(last_layer.get_output(0))
#engine=trt.utils.uff_to_trt_engine(TRT_LOGGER,_,parser,4,1<<30)
engine = builder.build_cuda_engine(network)
buf = engine.serialize()
with open(spec[‘output_bin’], ‘wb’) as f:
f.write(buf)
if name == ‘main’:
main()
I’m having this issue when launching the command : /usr/src/tensorrt/bin/trtexec --loadEngine=TRT_ssd_inception_v2_boats.bin
(All the errors listed above also appears if I’m using TF 1.14.0 with a model trained with it ( tried because I saw that my version of UFF was tested with tf 1.14.0)
Ps: For you, what is the best architecture in terms of versions for Tensorflow, uff etc … if I wish to work with the workflow PB–> UFF → TRT