|
- from absl import app, flags, logging
- from absl.flags import FLAGS
- import tensorflow as tf
- physical_devices = tf.config.experimental.list_physical_devices('GPU')
- if len(physical_devices) > 0:
- tf.config.experimental.set_memory_growth(physical_devices[0], True)
- import numpy as np
- import cv2
- from tensorflow.python.compiler.tensorrt import trt_convert as trt
- import core.utils as utils
- from tensorflow.python.saved_model import signature_constants
- import os
- from tensorflow.compat.v1 import ConfigProto
- from tensorflow.compat.v1 import InteractiveSession
-
- flags.DEFINE_string('weights', './checkpoints/yolov4-416', 'path to weights file')
- flags.DEFINE_string('output', './checkpoints/yolov4-trt-fp16-416', 'path to output')
- flags.DEFINE_integer('input_size', 416, 'path to output')
- flags.DEFINE_string('quantize_mode', 'float16', 'quantize mode (int8, float16)')
- flags.DEFINE_string('dataset', "/media/user/Source/Data/coco_dataset/coco/5k.txt", 'path to dataset')
- flags.DEFINE_integer('loop', 8, 'loop')
-
- def representative_data_gen():
- fimage = open(FLAGS.dataset).read().split()
- batched_input = np.zeros((FLAGS.loop, FLAGS.input_size, FLAGS.input_size, 3), dtype=np.float32)
- for input_value in range(FLAGS.loop):
- if os.path.exists(fimage[input_value]):
- original_image=cv2.imread(fimage[input_value])
- original_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)
- image_data = utils.image_preporcess(np.copy(original_image), [FLAGS.input_size, FLAGS.input_size])
- img_in = image_data[np.newaxis, ...].astype(np.float32)
- batched_input[input_value, :] = img_in
- # batched_input = tf.constant(img_in)
- print(input_value)
- # yield (batched_input, )
- # yield tf.random.normal((1, 416, 416, 3)),
- else:
- continue
- batched_input = tf.constant(batched_input)
- yield (batched_input,)
-
- def save_trt():
-
- if FLAGS.quantize_mode == 'int8':
- conversion_params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
- precision_mode=trt.TrtPrecisionMode.INT8,
- max_workspace_size_bytes=4000000000,
- use_calibration=True,
- max_batch_size=8)
- converter = trt.TrtGraphConverterV2(
- input_saved_model_dir=FLAGS.weights,
- conversion_params=conversion_params)
- converter.convert(calibration_input_fn=representative_data_gen)
- elif FLAGS.quantize_mode == 'float16':
- conversion_params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
- precision_mode=trt.TrtPrecisionMode.FP16,
- max_workspace_size_bytes=4000000000,
- max_batch_size=8)
- converter = trt.TrtGraphConverterV2(
- input_saved_model_dir=FLAGS.weights, conversion_params=conversion_params)
- converter.convert()
- else :
- conversion_params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
- precision_mode=trt.TrtPrecisionMode.FP32,
- max_workspace_size_bytes=4000000000,
- max_batch_size=8)
- converter = trt.TrtGraphConverterV2(
- input_saved_model_dir=FLAGS.weights, conversion_params=conversion_params)
- converter.convert()
-
- # converter.build(input_fn=representative_data_gen)
- converter.save(output_saved_model_dir=FLAGS.output)
- print('Done Converting to TF-TRT')
-
- saved_model_loaded = tf.saved_model.load(FLAGS.output)
- graph_func = saved_model_loaded.signatures[
- signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
- trt_graph = graph_func.graph.as_graph_def()
- for n in trt_graph.node:
- print(n.op)
- if n.op == "TRTEngineOp":
- print("Node: %s, %s" % (n.op, n.name.replace("/", "_")))
- else:
- print("Exclude Node: %s, %s" % (n.op, n.name.replace("/", "_")))
- logging.info("model saved to: {}".format(FLAGS.output))
-
- trt_engine_nodes = len([1 for n in trt_graph.node if str(n.op) == 'TRTEngineOp'])
- print("numb. of trt_engine_nodes in TensorRT graph:", trt_engine_nodes)
- all_nodes = len([1 for n in trt_graph.node])
- print("numb. of all_nodes in TensorRT graph:", all_nodes)
-
- def main(_argv):
- config = ConfigProto()
- config.gpu_options.allow_growth = True
- session = InteractiveSession(config=config)
- save_trt()
-
- if __name__ == '__main__':
- try:
- app.run(main)
- except SystemExit:
- pass
-
|