diff --git a/README.md b/README.md index 714ef28d..021d8576 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ git checkout $(git tag | tail -1) ``` ###### Run on Jetson Nano -* You need to have JetPack 4.3 installed on your Jetson Nano. +* You need to have JetPack 4.5 installed on your Jetson Nano. ```bash # 1) Download TensorRT engine file built with JetPack 4.3: @@ -243,7 +243,7 @@ Before running any of the images available in the Docker repository, you need to Alternatively you may simply pull the folder structure from this repository. ###### Run on Jetson Nano -* You need to have JetPack 4.3 installed on your Jetson Nano. +* You need to have JetPack 4.5 installed on your Jetson Nano. ```bash # Download TensorRT engine file built with JetPack 4.3: mkdir data/jetson @@ -326,7 +326,7 @@ docker run -it -p HOST_PORT:8000 -v $PWD/data:/repo/data -v $PWD/config-x86-open ##### Running the processor with docker-compose ###### Run on Jetson Nano -* You need to have JetPack 4.3 installed on your Jetson Nano. +* You need to have JetPack 4.5 installed on your Jetson Nano. ```bash # 1) Download TensorRT engine file built with JetPack 4.3: diff --git a/api/requirements.txt b/api/requirements.txt index b35af159..f97424df 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -1,7 +1,7 @@ aiofiles==0.5.0 boto3==1.14.59 fastapi==0.61.1 -pandas==1.1.2 +pandas==1.1.5 pyhumps==1.6.1 pytest==6.0.1 pytest-mock==3.5.1 diff --git a/bin/libflattenconcat.so b/bin/libflattenconcat.so new file mode 100755 index 00000000..189ec1be Binary files /dev/null and b/bin/libflattenconcat.so differ diff --git a/bin/trusted-keys b/bin/trusted-keys new file mode 100644 index 00000000..fecfbe29 --- /dev/null +++ b/bin/trusted-keys @@ -0,0 +1,309 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +zj0Pkm8GtgvP2UqAWvy+iRpeUQ2ji0Nc +=/bWk +-----END PGP PUBLIC KEY BLOCK----- diff --git a/exporters/jetson/add_plugin_and_preprocess_ssd_mobilenet.py b/exporters/jetson/add_plugin_and_preprocess_ssd_mobilenet.py new file mode 100644 index 00000000..5ffbed13 --- /dev/null +++ b/exporters/jetson/add_plugin_and_preprocess_ssd_mobilenet.py @@ -0,0 +1,164 @@ +""" +Add plugin nodes for custom layers of ssd-mobilenet-v1/v2 to the graph +and replace some newer operations which existing previous ones. + +Reference: + https://github.com/jkjung-avt/tensorrt_demos/blob/master/ssd/build_engine.py +""" + +import tensorrt as trt +import graphsurgeon as gs +import tensorflow as tf +import numpy as np + +def replace_addv2(graph): + """Replace all 'AddV2' in the graph with 'Add'. + NOTE: 'AddV2' is not supported by UFF parser. + """ + for node in graph.find_nodes_by_op('AddV2'): + gs.update_node(node, op='Add') + return graph + + +def replace_fusedbnv3(graph): + """Replace all 'FusedBatchNormV3' in the graph with 'FusedBatchNorm'. + NOTE: 'FusedBatchNormV3' is not supported by UFF parser. + https://devtalk.nvidia.com/default/topic/1066445/tensorrt/tensorrt-6-0-1-tensorflow-1-14-no-conversion-function-registered-for-layer-fusedbatchnormv3-yet/post/5403567/#5403567 + """ + for node in graph.find_nodes_by_op('FusedBatchNormV3'): + gs.update_node(node, op='FusedBatchNorm') + return graph + +def parse_gridAnchor(graph): + """ + define a constant input tensor and set that as the input for the GridAnchor node + as UFF file does not provide an input element for the GridAnchor node + """ + + data = np.array([1, 1], dtype=np.float32) + anchor_input = gs.create_node("AnchorInput", "Const", value=data, dtype=tf.float32) + graph.append(anchor_input) + graph.find_nodes_by_op("GridAnchor_TRT")[0].input.insert(0, "AnchorInput") + + return graph + + + +def add_plugin_and_preprocess(graph, model, num_classes, neuralet_adaptive_model): + """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. https://devtalk.nvidia.com/default/topic/1050465/jetson-nano/how-to-write-config-py-for-converting-ssd-mobilenetv2-to-uff-format/post/5333033/#5333033 + """ + num_classes += 1 + min_size = 0.2 + max_size = 0.95 + input_order = [0, 2, 1] + if neuralet_adaptive_model == 0: + input_order = [1, 0, 2] + input_dims = (3, 300, 300) + + 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_dims, + dtype=tf.float32 + ) + + PriorBox = gs.create_plugin_node( + name="MultipleGridAnchorGenerator", + op="GridAnchor_TRT", + minSize=min_size, # was 0.2 + maxSize=max_size, # 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, + dtype=tf.float32 + ) + + NMS = gs.create_plugin_node( + name="NMS", + op="NMS_TRT", + shareLocation=1, + varianceEncodedInTarget=0, + backgroundLabelId=0, + confidenceThreshold=0.3, # was 1e-8 + nmsThreshold=0.6, + topK=100, + keepTopK=100, + numClasses=num_classes, # was 91 + inputOrder=input_order, + confSigmoid=1, + isNormalized=1, + dtype=tf.float32 + ) + + concat_priorbox = gs.create_node( + "concat_priorbox", + op="ConcatV2", + axis=2, + dtype=tf.float32 + ) + if trt.__version__[0] >= '6': + concat_box_loc = gs.create_plugin_node( + "concat_box_loc", + op="FlattenConcat_TRT", + axis=1, + ignoreBatch=0, + dtype=tf.float32 + ) + concat_box_conf = gs.create_plugin_node( + "concat_box_conf", + op="FlattenConcat_TRT", + axis=1, + ignoreBatch=0, + dtype=tf.float32 + ) + else: + concat_box_loc = gs.create_plugin_node( + "concat_box_loc", + op="FlattenConcat_TRT", + dtype=tf.float32 + ) + concat_box_conf = gs.create_plugin_node( + "concat_box_conf", + op="FlattenConcat_TRT", + dtype=tf.float32 + ) + + namespace_plugin_map = { + "MultipleGridAnchorGenerator": PriorBox, + "Postprocessor": NMS, + "Preprocessor": Input, + "Cast": Input, + "ToFloat": Input, + "image_tensor": Input, + "MultipleGridAnchorGenerator/Concatenate": concat_priorbox, # for 'ssd_mobilenet_v1_coco' + "Concatenate": concat_priorbox, + "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 ( "image_tensor:0" in graph.find_nodes_by_name("Input")[0].input ): + # for ssd_mobilenet_v1 + graph.find_nodes_by_name("Input")[0].input.remove("image_tensor:0") + + graph = replace_addv2(graph) + graph = replace_fusedbnv3(graph) + graph = parse_gridAnchor(graph) + + + return graph diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash new file mode 100644 index 00000000..931872f6 --- /dev/null +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -0,0 +1,27 @@ +#!/bin/bash +# This script generates a TensorRT engine from pretrained Tensorflow SSD Mobilenet v2 COCO model. + +echo $relative_path +if [ $# -eq 2 ] +then + pb_file=$1 + adaptive_model=1 + num_classes=$2 + +else + if [ ! -f "$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz" ]; then + echo "downloading ssd_mobilenet_v2_coco_2018_03_29 ..." + wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz -P /repo$relative_path/data/jetson/ + fi + tar -xvf /repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C /repo$relative_path/data/jetson/ + cp "/repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" "/repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/TRT_ssd_mobilenet_v2_coco.pb" + rm "/repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + pb_file="/repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/TRT_ssd_mobilenet_v2_coco.pb" + adaptive_model=0 + num_classes=90 + +fi + + +echo "************ Generating TensorRT from: $pb_file **************" +python3 /repo$relative_path/exporters/jetson/trt_exporter.py --pb_file $pb_file --out_dir /repo$relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes diff --git a/exporters/jetson/libflattenconcat.so.6 b/exporters/jetson/libflattenconcat.so.6 new file mode 100755 index 00000000..189ec1be Binary files /dev/null and b/exporters/jetson/libflattenconcat.so.6 differ diff --git a/exporters/jetson/trt_exporter.py b/exporters/jetson/trt_exporter.py new file mode 100644 index 00000000..7c69f713 --- /dev/null +++ b/exporters/jetson/trt_exporter.py @@ -0,0 +1,97 @@ +"""build_engine.py + +This script converts a SSD model (pb) to UFF and subsequently builds +the TensorRT engine. + +Input : spces of a ssd frozen inference graph in config.ini file +Output: TensorRT Engine file + +Reference: + https://github.com/jkjung-avt/tensorrt_demos/blob/master/ssd/build_engine.py +""" + + +import os +import ctypes +import argparse +import wget + +import uff +import tensorrt as trt +import graphsurgeon as gs +import numpy as np +import add_plugin_and_preprocess_ssd_mobilenet as plugin + +def export_trt(pb_file, output_dir, num_classes=1, neuralet_adaptive_model=1): + """ + Exports the Tensorflow pb models to TensorRT engines. + Args: + pb_file: The path of input pb file + output_dir: A directory to store the output files + num_classes: Detector's number of classes + """ + lib_flatten_concat_file = "exporters/jetson/libflattenconcat.so.6" + # initialize + if trt.__version__[0] < '7': + ctypes.CDLL(lib_flatten_concat_file) + TRT_LOGGER = trt.Logger(trt.Logger.WARNING) + trt.init_libnvinfer_plugins(TRT_LOGGER, '') + + # compile the model into TensorRT engine + model = "ssd_mobilenet_v2_coco" + + if not os.path.isfile(pb_file): + raise FileNotFoundError('model does not exist under: {}'.format(pb_file)) + + if not os.path.isdir(output_dir): + print("the provided output directory : {0} is not exist".format(output_dir)) + print("creating output directory : {0}".format(output_dir)) + os.makedirs(output_dir, exist_ok=True) + + + dynamic_graph = plugin.add_plugin_and_preprocess( + gs.DynamicGraph(pb_file), + model, + num_classes, + neuralet_adaptive_model) + model_file_name = ".".join((pb_file.split("/")[-1]).split(".")[:-1]) + uff_path = os.path.join(output_dir, model_file_name + ".uff") + _ = uff.from_tensorflow( + dynamic_graph.as_graph_def(), + output_nodes=['NMS'], + output_filename=uff_path, + text=True, + debug_mode=False) + input_dims = (3, 300, 300) + with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.UffParser() as parser: + config = builder.create_builder_config() + config.max_workspace_size = 1 << 28 + builder.max_batch_size = 1 + config.set_flag(trt.BuilderFlag.FP16) + + parser.register_input('Input', input_dims) + parser.register_output('MarkOutput_0') + parser.parse(uff_path, network) + engine = builder.build_engine(network, config) + + buf = engine.serialize() + engine_path = os.path.join(output_dir, model_file_name + ".bin") + with open(engine_path, 'wb') as f: + f.write(buf) + print("your model has been converted to trt engine successfully under : {}".format(engine_path)) + + +if __name__ == "__main__": + + parser = argparse.ArgumentParser(description="This script exports a pb tensorflow model to a TRT engine") + parser.add_argument("--pb_file", type=str, required=True, help="the path of input pb file") + parser.add_argument("--out_dir", type=str, required=True, help="a directory to store the output files") + parser.add_argument("--num_classes", type=int, default=90, help="detector's number of classes") + parser.add_argument("--neuralet_adaptive_model", type=int, default=1, help="1 if the model is trained by Neuralet adaptive learning, 0 if not") + args = parser.parse_args() + pb_file = args.pb_file + output_dir = args.out_dir + num_classes = args.num_classes + neuralet_adaptive_model = args.neuralet_adaptive_model + export_trt(pb_file=pb_file, output_dir=output_dir, num_classes=num_classes, neuralet_adaptive_model=neuralet_adaptive_model) + diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 8940447d..1912e76f 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -3,21 +3,19 @@ # 1) build: docker build -f jetson-nano.Dockerfile -t "neuralet/smart-social-distancing:latest-jetson-nano" . # 2) run: docker run -it --runtime nvidia --privileged -p HOST_PORT:8000 -v "$PWD/data":/repo/data neuralet/smart-social-distancing:latest-jetson-nano -FROM nvcr.io/nvidia/l4t-base:r32.3.1 +FROM nvcr.io/nvidia/l4t-tensorflow:r32.5.0-tf1.15-py3 -RUN wget https://github.com/Tony607/jetson_nano_trt_tf_ssd/raw/master/packages/jetpack4.3/tensorrt.tar.gz -O /opt/tensorrt.tar.gz -RUN tar -xzf /opt/tensorrt.tar.gz -C /usr/local/lib/python3.6/dist-packages/ - -RUN wget https://github.com/sasikiran/jetson_tx2_trt_ssd/raw/master/libflattenconcat.so -O /opt/libflattenconcat.so # The `python3-opencv` package is old and doesn't support gstreamer video writer on Debian. So we need to manually build opencv. ARG OPENCV_VERSION=4.3.0 # http://amritamaz.net/blog/opencv-config RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ + ca-certificates \ cmake \ curl \ git \ + gnupg \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-ugly \ @@ -27,12 +25,16 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libgstreamer-plugins-base1.0-dev \ libgstreamer1.0-dev \ libsm6 \ + libswscale4 \ libswscale-dev \ libxext6 \ libxrender-dev \ mesa-va-drivers \ - python3-dev \ - python3-numpy \ + nano \ + pkg-config \ + python3-pip \ + vim \ + zip \ && rm -rf /var/lib/apt/lists/* \ && cd /tmp/ \ && curl -L https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.tar.gz -o opencv.tar.gz \ @@ -63,6 +65,15 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libxrender-dev \ && apt-get autoremove -y +RUN apt-get update + +RUN python3 -m pip install --upgrade pip + +RUN printf 'deb https://repo.download.nvidia.com/jetson/common r32 main\ndeb https://repo.download.nvidia.com/jetson/t210 r32 main' > /etc/apt/sources.list.d/nvidia-l4t-apt-source.list + +COPY ./bin/trusted-keys /tmp/trusted-keys +RUN apt-key add /tmp/trusted-keys + # https://askubuntu.com/questions/909277/avoiding-user-interaction-with-tzdata-when-installing-certbot-in-a-docker-contai ARG DEBIAN_FRONTEND=noninteractive @@ -70,12 +81,20 @@ COPY api/requirements.txt / # Installing pycuda using already-built wheel is a lot faster RUN apt-get update && apt-get install -y --no-install-recommends \ - build-essential \ - tzdata \ + graphsurgeon-tf \ libboost-python-dev \ libboost-thread-dev \ - pkg-config \ + libtcmalloc-minimal4 \ + libnvinfer6 \ + libnvinfer-dev \ + libhdf5-100 \ + libhdf5-dev \ + libprotobuf-dev \ + protobuf-compiler \ + python3-libnvinfer \ + python3-libnvinfer-dev \ python3-dev \ + python3-h5py \ python3-matplotlib \ python3-numpy \ python3-pillow \ @@ -83,20 +102,22 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python3-scipy \ python3-wget \ supervisor \ + tensorrt \ + tzdata \ + uff-converter-tf \ && rm -rf /var/lib/apt/lists/* \ && ln -sf $(which gcc) /usr/local/bin/gcc-aarch64-linux-gnu \ && ln -sf $(which g++) /usr/local/bin/g++-aarch64-linux-gnu \ - && wget https://github.com/Tony607/jetson_nano_trt_tf_ssd/raw/master/packages/jetpack4.3/pycuda-2019.1.2-cp36-cp36m-linux_aarch64.whl -O /tmp/pycuda-2019.1.2-cp36-cp36m-linux_aarch64.whl \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel && pip install -r requirements.txt \ - /tmp/pycuda-2019.1.2-cp36-cp36m-linux_aarch64.whl \ - && rm /tmp/pycuda-2019.1.2-cp36-cp36m-linux_aarch64.whl \ + && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow pycuda onnx nvidia-pyindex && pip install -r requirements.txt \ && apt-get purge -y \ - pkg-config \ && apt-get autoremove -y +COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so + +ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" + ENV DEV_ALLOW_ALL_ORIGINS=true ENV CONFIG_FILE=config-jetson-nano.ini -ENV OPENBLAS_CORETYPE=armv8 COPY . /repo/ WORKDIR /repo diff --git a/libs/detectors/jetson/detector.py b/libs/detectors/jetson/detector.py index 9ebad0d8..02f9e9fa 100644 --- a/libs/detectors/jetson/detector.py +++ b/libs/detectors/jetson/detector.py @@ -11,6 +11,7 @@ class Detector: Detector class is a high level class for detecting object using NVIDIA jetson devices. When an instance of the Detector is created you can call inference method and feed your input image in order to get the detection results. + Perform object detection with the given prebuilt tensorrt engine. :param config: Is a ConfigEngine instance which provides necessary parameters. :param source: A string that represents the camera. Ex: "Source_1". diff --git a/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index 67f57060..6c5925fa 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -3,6 +3,8 @@ import tensorrt as trt import pycuda.driver as cuda import time +import os +import pathlib from ..utils.fps_calculator import convert_infr_time_to_fps #import pycuda.autoinit # Required for initializing CUDA driver @@ -27,9 +29,27 @@ def _load_plugins(self): def _load_engine(self): """ Load engine file as a trt Runtime. """ - trt_bin_path = '/repo/data/jetson/TRT_%s.bin' % self.model - with open(trt_bin_path, 'rb') as f, trt.Runtime(self.trt_logger) as runtime: - return runtime.deserialize_cuda_engine(f.read()) + root_dir = "/repo" + exporters_dir = f"{root_dir}/exporters/jetson/" + base_model_dir = f'{root_dir}/data/jetson/' + model_file = f"TRT_{self.model}.bin" + model_path = f'{base_model_dir}{model_file}' + if not os.path.isfile(model_path): + logger.info("you didn't specify the model file so the COCO pretrained model will be used") + base_url = "https://github.com/Tony607/jetson_nano_trt_tf_ssd/raw/master/packages/jetpack4.3/" + logger.info('model does not exist under: {}, downloading from {}'.format(str(model_path), base_url + model_file)) + os.makedirs(base_model_dir, exist_ok=True) + os.system("bash " + exporters_dir + "generate_mobilenet_tensorrt.bash") + elif (pathlib.Path(model_path).suffix == ".pb"): + logger.info('model is a Tensorflow protobuf... Converting...') + os.makedirs(base_model_dir, exist_ok=True) + detector_class_count = 1 + os.system("bash " + exporters_dir + "generate_mobilenet_tensorrt.bash" + str(model_path) + " " + str(detector_class_count)) + model_file = "frozen_inference_graph.bin" + model_path = os.path.join(base_model_dir, model_file) + + with open(model_path, 'rb') as f, trt.Runtime(self.trt_logger) as runtime: + return runtime.deserialize_cuda_engine(f.read()) def _allocate_buffers(self): """