From c85498fda2154a4c53228cd390a5e34de49697f4 Mon Sep 17 00:00:00 2001 From: PINTO0309 Date: Thu, 12 Aug 2021 13:56:58 +0900 Subject: [PATCH] NanoDet full updated --- 072_NanoDet/04_integer_quantization.py | 50 -------- 072_NanoDet/05_full_integer_quantization.py | 55 --------- 072_NanoDet/06_edgetpu.txt | 2 - 072_NanoDet/09_saved_model_to_coreml.py | 10 -- 072_NanoDet/10_saved_model_to_tfjs.txt | 15 --- 072_NanoDet/11_tensorrt_inf_test.py | 74 ------------ 072_NanoDet/convert_script.txt | 126 +++++++++++++++++--- 072_NanoDet/download.sh | 4 +- 072_NanoDet/replace.json | 65 ++++++++++ 9 files changed, 179 insertions(+), 222 deletions(-) delete mode 100644 072_NanoDet/04_integer_quantization.py delete mode 100644 072_NanoDet/05_full_integer_quantization.py delete mode 100644 072_NanoDet/06_edgetpu.txt delete mode 100644 072_NanoDet/09_saved_model_to_coreml.py delete mode 100644 072_NanoDet/10_saved_model_to_tfjs.txt delete mode 100644 072_NanoDet/11_tensorrt_inf_test.py create mode 100644 072_NanoDet/replace.json diff --git a/072_NanoDet/04_integer_quantization.py b/072_NanoDet/04_integer_quantization.py deleted file mode 100644 index 369a4e02c5..0000000000 --- a/072_NanoDet/04_integer_quantization.py +++ /dev/null @@ -1,50 +0,0 @@ -### tf_nightly==2.5.0-dev20201204 - -import tensorflow as tf -import tensorflow_datasets as tfds -import numpy as np - -mean = np.asarray([103.53, 116.28, 123.675], dtype=np.float32).reshape(1, 1, 3) / 255 -std = np.asarray([57.375, 57.12, 58.395], dtype=np.float32).reshape(1, 1, 3) / 255 - -def representative_dataset_gen_320(): - for data in raw_test_data.take(100): - image = data['image'].numpy() - image = tf.image.resize(image, (320, 320)) - image = (image / 255 - mean) / std - image = image[np.newaxis,:,:,:] - yield [image] - -def representative_dataset_gen_416(): - for data in raw_test_data.take(100): - image = data['image'].numpy() - image = tf.image.resize(image, (416, 416)) - image = (image / 255 - mean) / std - image = image[np.newaxis,:,:,:] - yield [image] - -raw_test_data, info = tfds.load(name="coco/2017", with_info=True, split="test", data_dir="~/TFDS", download=False) - -# Integer Quantization - Input/Output=float32 -height = 320 -width = 320 -converter = tf.lite.TFLiteConverter.from_saved_model('saved_model_{}x{}'.format(height, width)) -converter.optimizations = [tf.lite.Optimize.DEFAULT] -converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8, tf.lite.OpsSet.SELECT_TF_OPS] -converter.representative_dataset = representative_dataset_gen_320 -tflite_model = converter.convert() -with open('nanodet_{}x{}_integer_quant.tflite'.format(height, width), 'wb') as w: - w.write(tflite_model) -print('Integer Quantization complete! - nanodet_{}x{}_integer_quant.tflite'.format(height, width)) - - -height = 416 -width = 416 -converter = tf.lite.TFLiteConverter.from_saved_model('saved_model_{}x{}'.format(height, width)) -converter.optimizations = [tf.lite.Optimize.DEFAULT] -converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8, tf.lite.OpsSet.SELECT_TF_OPS] -converter.representative_dataset = representative_dataset_gen_416 -tflite_model = converter.convert() -with open('nanodet_{}x{}_integer_quant.tflite'.format(height, width), 'wb') as w: - w.write(tflite_model) -print('Integer Quantization complete! - nanodet_{}x{}_integer_quant.tflite'.format(height, width)) \ No newline at end of file diff --git a/072_NanoDet/05_full_integer_quantization.py b/072_NanoDet/05_full_integer_quantization.py deleted file mode 100644 index fd1e3bfa90..0000000000 --- a/072_NanoDet/05_full_integer_quantization.py +++ /dev/null @@ -1,55 +0,0 @@ -### tf_nightly==2.5.0-dev20201204 - -import tensorflow as tf -import tensorflow_datasets as tfds -import numpy as np - -mean = np.asarray([103.53, 116.28, 123.675], dtype=np.float32).reshape(1, 1, 3) / 255 -std = np.asarray([57.375, 57.12, 58.395], dtype=np.float32).reshape(1, 1, 3) / 255 - -def representative_dataset_gen_320(): - for data in raw_test_data.take(100): - image = data['image'].numpy() - image = tf.image.resize(image, (320, 320)) - image = (image / 255 - mean) / std - image = image[np.newaxis,:,:,:] - yield [image] - -def representative_dataset_gen_416(): - for data in raw_test_data.take(100): - image = data['image'].numpy() - image = tf.image.resize(image, (416, 416)) - image = (image / 255 - mean) / std - image = image[np.newaxis,:,:,:] - yield [image] - - -raw_test_data, info = tfds.load(name="coco/2017", with_info=True, split="test", data_dir="~/TFDS", download=False) - -# Full Integer Quantization - Input/Output=float32 -height = 320 -width = 320 -converter = tf.lite.TFLiteConverter.from_saved_model('saved_model_{}x{}'.format(height, width)) -converter.optimizations = [tf.lite.Optimize.DEFAULT] -converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8, tf.lite.OpsSet.SELECT_TF_OPS] -converter.inference_input_type = tf.int8 -converter.inference_output_type = tf.int8 -converter.representative_dataset = representative_dataset_gen_320 -tflite_model = converter.convert() -with open('nanodet_{}x{}_full_integer_quant.tflite'.format(height, width), 'wb') as w: - w.write(tflite_model) -print('Integer Quantization complete! - nanodet_{}x{}_full_integer_quant.tflite'.format(height, width)) - - -height = 416 -width = 416 -converter = tf.lite.TFLiteConverter.from_saved_model('saved_model_{}x{}'.format(height, width)) -converter.optimizations = [tf.lite.Optimize.DEFAULT] -converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8, tf.lite.OpsSet.SELECT_TF_OPS] -converter.inference_input_type = tf.int8 -converter.inference_output_type = tf.int8 -converter.representative_dataset = representative_dataset_gen_416 -tflite_model = converter.convert() -with open('nanodet_{}x{}_full_integer_quant.tflite'.format(height, width), 'wb') as w: - w.write(tflite_model) -print('Integer Quantization complete! - nanodet_{}x{}_full_integer_quant.tflite'.format(height, width)) \ No newline at end of file diff --git a/072_NanoDet/06_edgetpu.txt b/072_NanoDet/06_edgetpu.txt deleted file mode 100644 index 8c6c8cef1c..0000000000 --- a/072_NanoDet/06_edgetpu.txt +++ /dev/null @@ -1,2 +0,0 @@ -edgetpu_compiler -s nanodet_320x320_full_integer_quant.tflite -edgetpu_compiler -s nanodet_416x416_full_integer_quant.tflite diff --git a/072_NanoDet/09_saved_model_to_coreml.py b/072_NanoDet/09_saved_model_to_coreml.py deleted file mode 100644 index 99753f3e96..0000000000 --- a/072_NanoDet/09_saved_model_to_coreml.py +++ /dev/null @@ -1,10 +0,0 @@ -### tensorflow==2.3.1 - -import tensorflow as tf -import coremltools as ct - -mlmodel = ct.convert('saved_model_320x320', source='tensorflow') -mlmodel.save("nanodet_320x320_float32.mlmodel") - -mlmodel = ct.convert('saved_model_416x416', source='tensorflow') -mlmodel.save("nanodet_416x416_float32.mlmodel") \ No newline at end of file diff --git a/072_NanoDet/10_saved_model_to_tfjs.txt b/072_NanoDet/10_saved_model_to_tfjs.txt deleted file mode 100644 index 806e16bb71..0000000000 --- a/072_NanoDet/10_saved_model_to_tfjs.txt +++ /dev/null @@ -1,15 +0,0 @@ -tensorflowjs_converter \ - --input_format=tf_saved_model \ - --output_format=tfjs_graph_model \ - --signature_name=serving_default \ - --saved_model_tags=serve \ - saved_model_320x320 \ - tfjs_model_320x320_float32 - -tensorflowjs_converter \ - --input_format=tf_saved_model \ - --output_format=tfjs_graph_model \ - --signature_name=serving_default \ - --saved_model_tags=serve \ - saved_model_416x416 \ - tfjs_model_416x416_float32 diff --git a/072_NanoDet/11_tensorrt_inf_test.py b/072_NanoDet/11_tensorrt_inf_test.py deleted file mode 100644 index 932e81eac9..0000000000 --- a/072_NanoDet/11_tensorrt_inf_test.py +++ /dev/null @@ -1,74 +0,0 @@ -### tensorflow==2.3.1 - -### https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/6.0/GA_6.0.1.5/local_repos/nv-tensorrt-repo-ubuntu1804-cuda10.1-trt6.0.1.5-ga-20190913_1-1_amd64.deb - -# os="ubuntu1804" -# tag="cuda10.1-trt6.0.1.5-ga-20190913" -# sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.deb -# sudo apt-key add /var/nv-tensorrt-repo-${tag}/7fa2af80.pub - -# sudo apt-get update -# sudo apt-get install tensorrt - -# sudo apt-get install python3-libnvinfer-dev -# python3-libnvinfer -# sudo apt-get install uff-converter-tf -# sudo apt-get install onnx-graphsurgeon - -import tensorflow as tf -import numpy as np -import time - - -def input_fn_320(): - input_shapes = [1, 320, 320, 3] - yield [np.zeros(input_shapes).astype(np.float32)] - -def input_fn_416(): - input_shapes = [1, 416, 416, 3] - yield [np.zeros(input_shapes).astype(np.float32)] - - -params = tf.experimental.tensorrt.ConversionParams(precision_mode='FP32', maximum_cached_engines=10000) -converter = tf.experimental.tensorrt.Converter(input_saved_model_dir='saved_model_320x320', conversion_params=params) -converter.convert() -converter.build(input_fn=input_fn_320) -converter.save('tensorrt_saved_model_320x320_float32') - -params = tf.experimental.tensorrt.ConversionParams(precision_mode='FP16', maximum_cached_engines=10000) -converter = tf.experimental.tensorrt.Converter(input_saved_model_dir='saved_model_320x320', conversion_params=params) -converter.convert() -converter.build(input_fn=input_fn_320) -converter.save('tensorrt_saved_model_320x320_float16') - - - -params = tf.experimental.tensorrt.ConversionParams(precision_mode='FP32', maximum_cached_engines=10000) -converter = tf.experimental.tensorrt.Converter(input_saved_model_dir='saved_model_416x416', conversion_params=params) -converter.convert() -converter.build(input_fn=input_fn_416) -converter.save('tensorrt_saved_model_416x416_float32') - -params = tf.experimental.tensorrt.ConversionParams(precision_mode='FP16', maximum_cached_engines=10000) -converter = tf.experimental.tensorrt.Converter(input_saved_model_dir='saved_model_416x416', conversion_params=params) -converter.convert() -converter.build(input_fn=input_fn_416) -converter.save('tensorrt_saved_model_416x416_float16') - - - - -model = tf.saved_model.load('tensorrt_saved_model_416x416_float16', tags=[tf.saved_model.SERVING]) -infer = model.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY] -infer.inputs[0].shape -x = np.random.uniform(size=(1, 416, 416, 3)).astype(np.float32) -start = time.perf_counter() -infer(tf.convert_to_tensor(x)) -end = time.perf_counter() -print('@@@@@@@@@@@@@@ First Inference') -print('elapsed time:', end - start) -start = time.perf_counter() -infer(tf.convert_to_tensor(x)) -end = time.perf_counter() -print('@@@@@@@@@@@@@@ Second Inference') -print('elapsed time:', end - start) diff --git a/072_NanoDet/convert_script.txt b/072_NanoDet/convert_script.txt index 6463a6da0d..ab3329ac17 100644 --- a/072_NanoDet/convert_script.txt +++ b/072_NanoDet/convert_script.txt @@ -1,18 +1,116 @@ +xhost +local: && \ +docker run --gpus all -it --rm \ +-v `pwd`:/home/user/workdir \ +-v /tmp/.X11-unix/:/tmp/.X11-unix:rw \ +--device /dev/video0:/dev/video0:mwr \ +--net=host \ +-e XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR \ +-e DISPLAY=$DISPLAY \ +--privileged \ +pinto0309/openvino2tensorflow:latest + +cd workdir + + +MODEL=nanodet +H=320 +W=320 + +$INTEL_OPENVINO_DIR/deployment_tools/model_optimizer/mo.py \ +--input_model ${MODEL}_${H}x${W}.onnx \ +--data_type FP32 \ +--output_dir openvino/${H}x${W}/FP32 +$INTEL_OPENVINO_DIR/deployment_tools/model_optimizer/mo.py \ +--input_model ${MODEL}_${H}x${W}.onnx \ +--data_type FP16 \ +--output_dir openvino/${H}x${W}/FP16 +mkdir -p openvino/${H}x${W}/myriad +${INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/lib/intel64/myriad_compile \ +-m openvino/${H}x${W}/FP16/${MODEL}_${H}x${W}.xml \ +-ip U8 \ +-VPU_NUMBER_OF_SHAVES 4 \ +-VPU_NUMBER_OF_CMX_SLICES 4 \ +-o openvino/${H}x${W}/myriad/${MODEL}_${H}x${W}.blob + + +MODEL=nanodet +H=416 +W=416 + +$INTEL_OPENVINO_DIR/deployment_tools/model_optimizer/mo.py \ +--input_model ${MODEL}_${H}x${W}.onnx \ +--data_type FP32 \ +--output_dir openvino/${H}x${W}/FP32 +$INTEL_OPENVINO_DIR/deployment_tools/model_optimizer/mo.py \ +--input_model ${MODEL}_${H}x${W}.onnx \ +--data_type FP16 \ +--output_dir openvino/${H}x${W}/FP16 +mkdir -p openvino/${H}x${W}/myriad +${INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/lib/intel64/myriad_compile \ +-m openvino/${H}x${W}/FP16/${MODEL}_${H}x${W}.xml \ +-ip U8 \ +-VPU_NUMBER_OF_SHAVES 4 \ +-VPU_NUMBER_OF_CMX_SLICES 4 \ +-o openvino/${H}x${W}/myriad/${MODEL}_${H}x${W}.blob + + + + + +MODEL=nanodet +H=320 +W=320 openvino2tensorflow \ - --model_path onnx/openvino/nanodet_320x320/FP32/nanodet_320x320.xml \ - --output_saved_model True \ - --output_h5 True \ - --output_pb True \ - --output_no_quant_float32_tflite True \ - --output_weight_quant_tflite True \ - --output_float16_quant_tflite True +--model_path openvino/${H}x${W}/FP32/${MODEL}_${H}x${W}.xml \ +--output_saved_model \ +--output_pb \ +--output_no_quant_float32_tflite \ +--output_weight_quant_tflite \ +--output_float16_quant_tflite \ +--output_integer_quant_tflite \ +--string_formulas_for_normalization 'data / 255' \ +--output_integer_quant_type 'uint8' \ +--output_tfjs \ +--output_tftrt \ +--output_coreml \ +--weight_replacement_config replace.json +mv saved_model saved_model_${MODEL}_${H}x${W} +openvino2tensorflow \ +--model_path openvino/${H}x${W}/FP32/${MODEL}_${H}x${W}.xml \ +--output_saved_model \ +--string_formulas_for_normalization 'data / 255' \ +--output_integer_quant_type 'uint8' \ +--output_edgetpu \ +--weight_replacement_config replace.json +mv saved_model/model_full_integer_quant_edgetpu.tflite saved_model saved_model_${MODEL}_${H}x${W} +rm -rf saved_model + +MODEL=nanodet +H=416 +W=416 +openvino2tensorflow \ +--model_path openvino/${H}x${W}/FP32/${MODEL}_${H}x${W}.xml \ +--output_saved_model \ +--output_pb \ +--output_no_quant_float32_tflite \ +--output_weight_quant_tflite \ +--output_float16_quant_tflite \ +--output_integer_quant_tflite \ +--string_formulas_for_normalization 'data / 255' \ +--output_integer_quant_type 'uint8' \ +--output_tfjs \ +--output_tftrt \ +--output_coreml \ +--weight_replacement_config replace.json +mv saved_model saved_model_${MODEL}_${H}x${W} openvino2tensorflow \ - --model_path onnx/openvino/nanodet_416x416/FP32/nanodet_416x416.xml \ - --output_saved_model True \ - --output_h5 True \ - --output_pb True \ - --output_no_quant_float32_tflite True \ - --output_weight_quant_tflite True \ - --output_float16_quant_tflite True \ No newline at end of file +--model_path openvino/${H}x${W}/FP32/${MODEL}_${H}x${W}.xml \ +--output_saved_model \ +--string_formulas_for_normalization 'data / 255' \ +--output_integer_quant_type 'uint8' \ +--output_edgetpu \ +--weight_replacement_config replace.json +mv saved_model/model_full_integer_quant_edgetpu.tflite saved_model saved_model_${MODEL}_${H}x${W} +rm -rf saved_model diff --git a/072_NanoDet/download.sh b/072_NanoDet/download.sh index 97c047f7a1..92c4a77856 100755 --- a/072_NanoDet/download.sh +++ b/072_NanoDet/download.sh @@ -1,8 +1,8 @@ #!/bin/bash -curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=13u_o005EYKUcPhTMTijxrsgZHD3_ScZ_" > /dev/null +curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=1oER-UkW0qhzcFRUKCnsRttn7x_KFRn8T" > /dev/null CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)" -curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=13u_o005EYKUcPhTMTijxrsgZHD3_ScZ_" -o resources.tar.gz +curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=1oER-UkW0qhzcFRUKCnsRttn7x_KFRn8T" -o resources.tar.gz tar -zxvf resources.tar.gz rm resources.tar.gz diff --git a/072_NanoDet/replace.json b/072_NanoDet/replace.json new file mode 100644 index 0000000000..7e8e84e67c --- /dev/null +++ b/072_NanoDet/replace.json @@ -0,0 +1,65 @@ +{ + "format_version": 2, + "layers": [ + { + "layer_id": "678", + "type": "Const", + "replace_mode": "direct", + "values": [ + 0, + 1, + 2 + ] + }, + { + "layer_id": "684", + "type": "Const", + "replace_mode": "direct", + "values": [ + 0, + 1, + 2 + ] + }, + { + "layer_id": "720", + "type": "Const", + "replace_mode": "direct", + "values": [ + 0, + 1, + 2 + ] + }, + { + "layer_id": "726", + "type": "Const", + "replace_mode": "direct", + "values": [ + 0, + 1, + 2 + ] + }, + { + "layer_id": "762", + "type": "Const", + "replace_mode": "direct", + "values": [ + 0, + 1, + 2 + ] + }, + { + "layer_id": "768", + "type": "Const", + "replace_mode": "direct", + "values": [ + 0, + 1, + 2 + ] + } + ] +} \ No newline at end of file