From 03c2f41e45bb3dd340d11539a95177e5842c4827 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 11:54:44 -0300 Subject: [PATCH 01/58] Updated Jetpack to 4.6 --- jetson-nano.Dockerfile | 52 ++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 8940447d..91d55cad 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -3,12 +3,8 @@ # 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.4.4-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 @@ -18,6 +14,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ cmake \ curl \ git \ + gnupg \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-ugly \ @@ -31,8 +28,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 +63,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libxrender-dev \ && apt-get autoremove -y +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 ./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 @@ -71,32 +76,49 @@ 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 \ + libnvinfer6 \ + libnvinfer-dev \ + libhdf5-100 \ + libhdf5-dev \ + python3-libnvinfer \ + python3-libnvinfer-dev \ pkg-config \ + pycuda \ python3-dev \ + python3-h5py \ python3-matplotlib \ python3-numpy \ + python3-opencv \ python3-pillow \ python3-pip \ 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 \ - && apt-get purge -y \ - pkg-config \ + && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow && pip install -r requirements.txt + && apt-get purge -y && apt-get autoremove -y +RUN wget https://github.com/sasikiran/jetson_tx2_trt_ssd/raw/master/libflattenconcat.so -O /opt/libflattenconcat.so +RUN apt update && apt install -y libtcmalloc-minimal4 + +ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" +RUN apt update && apt install -y cmake protobuf-compiler libprotobuf-dev +RUN pip install onnx +# ENV relative_path=/repo/adaptive_object_detection +# ENV PYTHONPATH=/repo:/repo/adaptive_object_detection + ENV DEV_ALLOW_ALL_ORIGINS=true ENV CONFIG_FILE=config-jetson-nano.ini -ENV OPENBLAS_CORETYPE=armv8 +# ENV OPENBLAS_CORETYPE=armv8 COPY . /repo/ WORKDIR /repo From b949fdae1c6a7f0b0ea10ccd1b1eb7d7bff88a1a Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 12:05:45 -0300 Subject: [PATCH 02/58] added binary --- bin/libflattenconcat.so | Bin 0 -> 74728 bytes jetson-nano.Dockerfile | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100755 bin/libflattenconcat.so diff --git a/bin/libflattenconcat.so b/bin/libflattenconcat.so new file mode 100755 index 0000000000000000000000000000000000000000..189ec1bec68c76b2639ce2aa5ab2509953fd5888 GIT binary patch literal 74728 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 MbN07YuobQU2bg@Z&Hw-a literal 0 HcmV?d00001 diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 91d55cad..23caa812 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -107,7 +107,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get purge -y && apt-get autoremove -y -RUN wget https://github.com/sasikiran/jetson_tx2_trt_ssd/raw/master/libflattenconcat.so -O /opt/libflattenconcat.so + +RUN wget https://github.com/neuralet/smart-social-distancing/raw/master/bin/libflattenconcat.so -O /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" From 2d9beef79f047382e37d934b784091a3cd327289 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 12:42:29 -0300 Subject: [PATCH 03/58] updated wget --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 23caa812..30005fd4 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -108,7 +108,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get autoremove -y -RUN wget https://github.com/neuralet/smart-social-distancing/raw/master/bin/libflattenconcat.so -O /opt/libflattenconcat.so +RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/libflattenconcat.so -O /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" From e2129b3dee49f8a34ed32c85e07599e40482f8ad Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 12:44:35 -0300 Subject: [PATCH 04/58] fix dockerfile --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 30005fd4..5226800f 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -103,7 +103,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && 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 \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow && pip install -r requirements.txt + && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow && pip install -r requirements.txt \ && apt-get purge -y && apt-get autoremove -y From fb0148dae809a4325ef935329a21e999d4664ec3 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 12:46:40 -0300 Subject: [PATCH 05/58] fix dockerfile --- jetson-nano.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 5226800f..b9901336 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -104,8 +104,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && ln -sf $(which gcc) /usr/local/bin/gcc-aarch64-linux-gnu \ && ln -sf $(which g++) /usr/local/bin/g++-aarch64-linux-gnu \ && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow && pip install -r requirements.txt \ - && apt-get purge -y - && apt-get autoremove -y + && apt-get purge -y \ + && apt-get autoremove -y \ RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/libflattenconcat.so -O /opt/libflattenconcat.so From befb51ee6fbe0709ba86186679e4b3eb5a5c250e Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 12:49:03 -0300 Subject: [PATCH 06/58] fix dockerfile --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index b9901336..1015db53 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -105,7 +105,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && ln -sf $(which g++) /usr/local/bin/g++-aarch64-linux-gnu \ && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow && pip install -r requirements.txt \ && apt-get purge -y \ - && apt-get autoremove -y \ + && apt-get autoremove -y RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/libflattenconcat.so -O /opt/libflattenconcat.so From 4b384df043e010b4c2c46db735af13bd3852216d Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 13:04:05 -0300 Subject: [PATCH 07/58] fix dependencies --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 1015db53..02b16646 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -74,7 +74,7 @@ ARG DEBIAN_FRONTEND=noninteractive 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 \ +RUN apt-get update && apt-get install -y \ build-essential \ graphsurgeon-tf \ libboost-python-dev \ From cee658b9c08633543e47dbb9896def7c41b8258b Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 13:06:08 -0300 Subject: [PATCH 08/58] fix dependencies --- jetson-nano.Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 02b16646..444c6ffe 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -24,6 +24,7 @@ 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 \ @@ -74,7 +75,7 @@ ARG DEBIAN_FRONTEND=noninteractive COPY api/requirements.txt / # Installing pycuda using already-built wheel is a lot faster -RUN apt-get update && apt-get install -y \ +RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ graphsurgeon-tf \ libboost-python-dev \ From 13e6aaf2b0e37ef53dc2589bef33d0b4fe14c1ee Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 14:09:43 -0300 Subject: [PATCH 09/58] fix dependencies --- jetson-nano.Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 444c6ffe..7b5ff7c6 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -66,9 +66,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 ./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 From 35f6a28605041797551b877009a51751fc36c5cf Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 14:13:33 -0300 Subject: [PATCH 10/58] added public key --- README.md | 2 +- bin/trusted-keys | 309 +++++++++++++++++++++++++++++++++++++++++ jetson-nano.Dockerfile | 3 + 3 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 bin/trusted-keys diff --git a/README.md b/README.md index 714ef28d..8e78f094 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. +* Works with JetPack 4.6. ```bash # 1) Download TensorRT engine file built with JetPack 4.3: 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/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 7b5ff7c6..02261a37 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -66,6 +66,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 +RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/trusted-keys -O /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 From 8bf9b81e172f9d154679ecf5821383577fcef4fa Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 14:16:33 -0300 Subject: [PATCH 11/58] add validation to key --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 02261a37..e3a0857e 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -66,7 +66,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 -RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/trusted-keys -O /tmp/trusted-keys +RUN wget --no-check-certificate https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/trusted-keys -O /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 From d36bdafaf113118ca51664a6350cd0dd9e601c79 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 14:37:02 -0300 Subject: [PATCH 12/58] fixes --- jetson-nano.Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index e3a0857e..3beb1d87 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -11,6 +11,7 @@ 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 \ @@ -66,7 +67,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 -RUN wget --no-check-certificate https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/trusted-keys -O /tmp/trusted-keys +RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/trusted-keys -O /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 From f3180a51442c149ad68b5ab9d40f73d25cfc7cd6 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 22 Sep 2021 15:30:07 -0300 Subject: [PATCH 13/58] fixes --- jetson-nano.Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 3beb1d87..41a0ba56 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -67,7 +67,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 -RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/trusted-keys -O /tmp/trusted-keys +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 @@ -88,7 +88,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python3-libnvinfer \ python3-libnvinfer-dev \ pkg-config \ - pycuda \ python3-dev \ python3-h5py \ python3-matplotlib \ @@ -105,7 +104,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && 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 \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow && pip install -r requirements.txt \ + && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ && apt-get purge -y \ && apt-get autoremove -y From 7435ded6c15f74796e7a4f156a9a079325ac149d Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 6 Oct 2021 16:12:47 -0300 Subject: [PATCH 14/58] Changed version to 4.5 --- README.md | 2 +- jetson-nano.Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8e78f094..f403d438 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ git checkout $(git tag | tail -1) ``` ###### Run on Jetson Nano -* Works with JetPack 4.6. +* Works with JetPack 4.5. ```bash # 1) Download TensorRT engine file built with JetPack 4.3: diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 41a0ba56..4c8cd297 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -3,7 +3,7 @@ # 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-tensorflow:r32.4.4-tf1.15-py3 +FROM nvcr.io/nvidia/l4t-tensorflow:r32.5.0-tf1.15-py3 # The `python3-opencv` package is old and doesn't support gstreamer video writer on Debian. So we need to manually build opencv. @@ -109,7 +109,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get autoremove -y -RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.6/bin/libflattenconcat.so -O /opt/libflattenconcat.so +RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" From 2f484d0df7b8ec4895a5440f54b2341d7a878d3e Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 6 Oct 2021 16:31:30 -0300 Subject: [PATCH 15/58] removed opencv installation --- jetson-nano.Dockerfile | 54 +++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 4c8cd297..6f87fc2b 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -36,33 +36,33 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 \ - && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ - && cd /tmp/opencv-${OPENCV_VERSION} \ - && mkdir build \ - && cd build \ - && cmake \ - -DBUILD_opencv_python3=yes \ - -DPYTHON_EXECUTABLE=$(which python3) \ - -DCMAKE_BUILD_TYPE=RELEASE \ - -DBUILD_TESTS=OFF \ - -DBUILD_PERF_TESTS=OFF \ - -DBUILD_EXAMPLES=OFF \ - -DINSTALL_TESTS=OFF \ - -DBUILD_opencv_apps=OFF \ - -DBUILD_DOCS=OFF \ - ../ \ - && make -j$(nproc) \ - && make install \ - && cd /tmp \ - && rm -rf opencv-${OPENCV_VERSION} \ - && apt-get purge -y \ - cmake \ - git \ - libgstreamer-plugins-base1.0-dev \ - libgstreamer1.0-dev \ - libxrender-dev \ + # && cd /tmp/ \ + # && curl -L https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.tar.gz -o opencv.tar.gz \ + # && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ + # && cd /tmp/opencv-${OPENCV_VERSION} \ + # && mkdir build \ + # && cd build \ + # && cmake \ + # -DBUILD_opencv_python3=yes \ + # -DPYTHON_EXECUTABLE=$(which python3) \ + # -DCMAKE_BUILD_TYPE=RELEASE \ + # -DBUILD_TESTS=OFF \ + # -DBUILD_PERF_TESTS=OFF \ + # -DBUILD_EXAMPLES=OFF \ + # -DINSTALL_TESTS=OFF \ + # -DBUILD_opencv_apps=OFF \ + # -DBUILD_DOCS=OFF \ + # ../ \ + # && make -j$(nproc) \ + # && make install \ + # && cd /tmp \ + # && rm -rf opencv-${OPENCV_VERSION} \ + # && apt-get purge -y \ + # cmake \ + # git \ + # libgstreamer-plugins-base1.0-dev \ + # libgstreamer1.0-dev \ + # libxrender-dev \ && apt-get autoremove -y 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 From 5a881a7cc218ff899431abd6a0c4e6e98efc6fbe Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Thu, 7 Oct 2021 13:16:50 -0300 Subject: [PATCH 16/58] changed opencv installation --- jetson-nano.Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 6f87fc2b..ccc2e703 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -92,7 +92,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python3-h5py \ python3-matplotlib \ python3-numpy \ - python3-opencv \ python3-pillow \ python3-pip \ python3-scipy \ @@ -104,7 +103,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && 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 \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ + && python3 -m pip install --upgrade pip setuptools==41.0.0 opencv-python wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ && apt-get purge -y \ && apt-get autoremove -y From 60ffd37ad99b2528239697ee602e80b1cd9056fa Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Thu, 7 Oct 2021 16:24:26 -0300 Subject: [PATCH 17/58] reverted opencv library --- api/requirements.txt | 2 +- jetson-nano.Dockerfile | 58 +++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 30 deletions(-) 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/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index ccc2e703..c0ca156f 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -36,33 +36,33 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ 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 \ - # && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ - # && cd /tmp/opencv-${OPENCV_VERSION} \ - # && mkdir build \ - # && cd build \ - # && cmake \ - # -DBUILD_opencv_python3=yes \ - # -DPYTHON_EXECUTABLE=$(which python3) \ - # -DCMAKE_BUILD_TYPE=RELEASE \ - # -DBUILD_TESTS=OFF \ - # -DBUILD_PERF_TESTS=OFF \ - # -DBUILD_EXAMPLES=OFF \ - # -DINSTALL_TESTS=OFF \ - # -DBUILD_opencv_apps=OFF \ - # -DBUILD_DOCS=OFF \ - # ../ \ - # && make -j$(nproc) \ - # && make install \ - # && cd /tmp \ - # && rm -rf opencv-${OPENCV_VERSION} \ - # && apt-get purge -y \ - # cmake \ - # git \ - # libgstreamer-plugins-base1.0-dev \ - # libgstreamer1.0-dev \ - # libxrender-dev \ + && cd /tmp/ \ + && curl -L https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.tar.gz -o opencv.tar.gz \ + && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ + && cd /tmp/opencv-${OPENCV_VERSION} \ + && mkdir build \ + && cd build \ + && cmake \ + -DBUILD_opencv_python3=yes \ + -DPYTHON_EXECUTABLE=$(which python3) \ + -DCMAKE_BUILD_TYPE=RELEASE \ + -DBUILD_TESTS=OFF \ + -DBUILD_PERF_TESTS=OFF \ + -DBUILD_EXAMPLES=OFF \ + -DINSTALL_TESTS=OFF \ + -DBUILD_opencv_apps=OFF \ + -DBUILD_DOCS=OFF \ + ../ \ + && make -j$(nproc) \ + && make install \ + && cd /tmp \ + && rm -rf opencv-${OPENCV_VERSION} \ + && apt-get purge -y \ + cmake \ + git \ + libgstreamer-plugins-base1.0-dev \ + libgstreamer1.0-dev \ + libxrender-dev \ && apt-get autoremove -y 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 @@ -103,10 +103,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && 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 \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 opencv-python wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ + && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ && apt-get purge -y \ && apt-get autoremove -y - +# opencv-python RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 From f9d72ee9692878522ad6eb779612499a2d842234 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Thu, 7 Oct 2021 17:54:16 -0300 Subject: [PATCH 18/58] commented opencv --- jetson-nano.Dockerfile | 114 ++++++++++++++++++++--------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index c0ca156f..75ff8a1c 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -9,61 +9,61 @@ FROM nvcr.io/nvidia/l4t-tensorflow:r32.5.0-tf1.15-py3 # 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 \ - gstreamer1.0-vaapi \ - libavcodec-dev \ - libavformat-dev \ - libgstreamer-plugins-base1.0-dev \ - libgstreamer1.0-dev \ - libsm6 \ - libswscale4 \ - libswscale-dev \ - libxext6 \ - libxrender-dev \ - mesa-va-drivers \ - 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 \ - && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ - && cd /tmp/opencv-${OPENCV_VERSION} \ - && mkdir build \ - && cd build \ - && cmake \ - -DBUILD_opencv_python3=yes \ - -DPYTHON_EXECUTABLE=$(which python3) \ - -DCMAKE_BUILD_TYPE=RELEASE \ - -DBUILD_TESTS=OFF \ - -DBUILD_PERF_TESTS=OFF \ - -DBUILD_EXAMPLES=OFF \ - -DINSTALL_TESTS=OFF \ - -DBUILD_opencv_apps=OFF \ - -DBUILD_DOCS=OFF \ - ../ \ - && make -j$(nproc) \ - && make install \ - && cd /tmp \ - && rm -rf opencv-${OPENCV_VERSION} \ - && apt-get purge -y \ - cmake \ - git \ - libgstreamer-plugins-base1.0-dev \ - libgstreamer1.0-dev \ - libxrender-dev \ - && apt-get autoremove -y +# 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 \ +# gstreamer1.0-vaapi \ +# libavcodec-dev \ +# libavformat-dev \ +# libgstreamer-plugins-base1.0-dev \ +# libgstreamer1.0-dev \ +# libsm6 \ +# libswscale4 \ +# libswscale-dev \ +# libxext6 \ +# libxrender-dev \ +# mesa-va-drivers \ +# 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 \ +# && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ +# && cd /tmp/opencv-${OPENCV_VERSION} \ +# && mkdir build \ +# && cd build \ +# && cmake \ +# -DBUILD_opencv_python3=yes \ +# -DPYTHON_EXECUTABLE=$(which python3) \ +# -DCMAKE_BUILD_TYPE=RELEASE \ +# -DBUILD_TESTS=OFF \ +# -DBUILD_PERF_TESTS=OFF \ +# -DBUILD_EXAMPLES=OFF \ +# -DINSTALL_TESTS=OFF \ +# -DBUILD_opencv_apps=OFF \ +# -DBUILD_DOCS=OFF \ +# ../ \ +# && make -j$(nproc) \ +# && make install \ +# && cd /tmp \ +# && rm -rf opencv-${OPENCV_VERSION} \ +# && apt-get purge -y \ +# cmake \ +# git \ +# libgstreamer-plugins-base1.0-dev \ +# libgstreamer1.0-dev \ +# libxrender-dev \ +# && apt-get autoremove -y 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 @@ -103,10 +103,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && 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 \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ + && python3 -m pip install --upgrade pip setuptools==41.0.0 opencv-python wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ && apt-get purge -y \ && apt-get autoremove -y -# opencv-python +# RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 From 32171c72bbddad8938f6c10959619d96ab6fd3b9 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Thu, 7 Oct 2021 17:57:54 -0300 Subject: [PATCH 19/58] fixed library --- jetson-nano.Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 75ff8a1c..5a38e7df 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -65,6 +65,10 @@ ARG OPENCV_VERSION=4.3.0 # libxrender-dev \ # && apt-get autoremove -y +RUN apt-get update && apt-get install -y python3-pip pkg-config zip gnupg + +RUN python3 -m pip install pip==20.1 + 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 From 6901fd000dc4f1606757292e126eed17e3ef78bf Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 10:48:38 -0300 Subject: [PATCH 20/58] added upgrade --- jetson-nano.Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 5a38e7df..0443d841 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -121,6 +121,8 @@ RUN pip install onnx # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection +RUN apt upgrade + ENV DEV_ALLOW_ALL_ORIGINS=true ENV CONFIG_FILE=config-jetson-nano.ini # ENV OPENBLAS_CORETYPE=armv8 From 243ef59808a31c0af8c6f69ce0d8e20148945008 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 10:58:22 -0300 Subject: [PATCH 21/58] pip latest version --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 0443d841..27a76c8d 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -67,7 +67,7 @@ ARG OPENCV_VERSION=4.3.0 RUN apt-get update && apt-get install -y python3-pip pkg-config zip gnupg -RUN python3 -m pip install pip==20.1 +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 From 8992ebeae411b5a1d90810eebaf3035bcd032f27 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 12:29:29 -0300 Subject: [PATCH 22/58] added more libraries --- jetson-nano.Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 27a76c8d..6ea0b798 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -66,6 +66,7 @@ ARG OPENCV_VERSION=4.3.0 # && apt-get autoremove -y RUN apt-get update && apt-get install -y python3-pip pkg-config zip gnupg +# curl RUN python3 -m pip install --upgrade pip @@ -110,18 +111,18 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && python3 -m pip install --upgrade pip setuptools==41.0.0 opencv-python wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ && apt-get purge -y \ && apt-get autoremove -y -# RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" +RUN apt install curl build-essential nano vim pkg-config zip RUN apt update && apt install -y cmake protobuf-compiler libprotobuf-dev RUN pip install onnx # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection -RUN apt upgrade +RUN apt upgrade -y ENV DEV_ALLOW_ALL_ORIGINS=true ENV CONFIG_FILE=config-jetson-nano.ini From 74da208d264fea1cbcc8d9fed9b88a1c4cb28dee Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 12:47:34 -0300 Subject: [PATCH 23/58] added more libraries --- jetson-nano.Dockerfile | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 6ea0b798..c8e1554a 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -112,13 +112,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get purge -y \ && apt-get autoremove -y -RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so -RUN apt update && apt install -y libtcmalloc-minimal4 +# RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so +COPY ./bin/libflattenconcat.so.6 /opt/libflattenconcat.so +RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano vim pkg-config zip protobuf-compiler libprotobuf-dev onnx ca-certificates nvidia-pyindex ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" -RUN apt install curl build-essential nano vim pkg-config zip -RUN apt update && apt install -y cmake protobuf-compiler libprotobuf-dev -RUN pip install onnx +RUN apt update # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection From b5c3ed39b7a8a8889355500ae00a9358caae7c6d Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 12:49:52 -0300 Subject: [PATCH 24/58] fix dependencies --- jetson-nano.Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index c8e1554a..bb30e793 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -114,10 +114,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so COPY ./bin/libflattenconcat.so.6 /opt/libflattenconcat.so -RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano vim pkg-config zip protobuf-compiler libprotobuf-dev onnx ca-certificates nvidia-pyindex +RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano vim pkg-config zip ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" -RUN apt update +RUN apt update && apt install -y protobuf-compiler libprotobuf-dev ca-certificates nvidia-pyindex +RUN pip install -y onnx # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection From 96bae671afabbefd8735d898498cacce948b9917 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 12:50:30 -0300 Subject: [PATCH 25/58] fix dependencies --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index bb30e793..36c7b7fd 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -113,7 +113,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get autoremove -y # RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so -COPY ./bin/libflattenconcat.so.6 /opt/libflattenconcat.so +COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano vim pkg-config zip ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" From 0d1d0694cc9bc3a789e12b6ffadc021219596b26 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 13:04:01 -0300 Subject: [PATCH 26/58] fix dependencies --- jetson-nano.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 36c7b7fd..babbda01 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -117,8 +117,8 @@ COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano vim pkg-config zip ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" -RUN apt update && apt install -y protobuf-compiler libprotobuf-dev ca-certificates nvidia-pyindex -RUN pip install -y onnx +RUN apt update && apt install -y protobuf-compiler libprotobuf-dev ca-certificates +RUN pip install -y onnx nvidia-pyindex # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection From 532c5d24b5a18312b178d1ef08454087ea79bcbe Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 8 Oct 2021 13:06:28 -0300 Subject: [PATCH 27/58] fix dependencies --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index babbda01..754616a6 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -118,7 +118,7 @@ RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" RUN apt update && apt install -y protobuf-compiler libprotobuf-dev ca-certificates -RUN pip install -y onnx nvidia-pyindex +RUN pip install onnx nvidia-pyindex # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection From 8329869f1710b426bb4f105fb9fcef542d1e2a89 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Mon, 11 Oct 2021 16:42:23 -0300 Subject: [PATCH 28/58] changed version --- jetson-nano.Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 754616a6..86acd80d 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -7,7 +7,7 @@ FROM nvcr.io/nvidia/l4t-tensorflow:r32.5.0-tf1.15-py3 # 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 +# 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 \ @@ -108,7 +108,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && 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 \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 opencv-python wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ + && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ && apt-get purge -y \ && apt-get autoremove -y @@ -118,7 +118,7 @@ RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" RUN apt update && apt install -y protobuf-compiler libprotobuf-dev ca-certificates -RUN pip install onnx nvidia-pyindex +RUN pip install onnx nvidia-pyindex opencv-python==4.3.0.38 # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection From e0270640a90056386d94bbe0bae84a353272c77d Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Tue, 12 Oct 2021 10:24:45 -0300 Subject: [PATCH 29/58] restored old opencv installation --- jetson-nano.Dockerfile | 121 ++++++++++++++++++++--------------------- 1 file changed, 59 insertions(+), 62 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 86acd80d..7d710a9d 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -6,66 +6,64 @@ FROM nvcr.io/nvidia/l4t-tensorflow:r32.5.0-tf1.15-py3 -# 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 \ -# gstreamer1.0-vaapi \ -# libavcodec-dev \ -# libavformat-dev \ -# libgstreamer-plugins-base1.0-dev \ -# libgstreamer1.0-dev \ -# libsm6 \ -# libswscale4 \ -# libswscale-dev \ -# libxext6 \ -# libxrender-dev \ -# mesa-va-drivers \ -# 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 \ -# && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ -# && cd /tmp/opencv-${OPENCV_VERSION} \ -# && mkdir build \ -# && cd build \ -# && cmake \ -# -DBUILD_opencv_python3=yes \ -# -DPYTHON_EXECUTABLE=$(which python3) \ -# -DCMAKE_BUILD_TYPE=RELEASE \ -# -DBUILD_TESTS=OFF \ -# -DBUILD_PERF_TESTS=OFF \ -# -DBUILD_EXAMPLES=OFF \ -# -DINSTALL_TESTS=OFF \ -# -DBUILD_opencv_apps=OFF \ -# -DBUILD_DOCS=OFF \ -# ../ \ -# && make -j$(nproc) \ -# && make install \ -# && cd /tmp \ -# && rm -rf opencv-${OPENCV_VERSION} \ -# && apt-get purge -y \ -# cmake \ -# git \ -# libgstreamer-plugins-base1.0-dev \ -# libgstreamer1.0-dev \ -# libxrender-dev \ -# && apt-get autoremove -y +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 \ + gstreamer1.0-vaapi \ + libavcodec-dev \ + libavformat-dev \ + libgstreamer-plugins-base1.0-dev \ + libgstreamer1.0-dev \ + libsm6 \ + libswscale4 \ + libswscale-dev \ + libxext6 \ + libxrender-dev \ + mesa-va-drivers \ + pkg-config \ + python3-pip \ + 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 \ + && tar zxvf opencv.tar.gz && rm opencv.tar.gz \ + && cd /tmp/opencv-${OPENCV_VERSION} \ + && mkdir build \ + && cd build \ + && cmake \ + -DBUILD_opencv_python3=yes \ + -DPYTHON_EXECUTABLE=$(which python3) \ + -DCMAKE_BUILD_TYPE=RELEASE \ + -DBUILD_TESTS=OFF \ + -DBUILD_PERF_TESTS=OFF \ + -DBUILD_EXAMPLES=OFF \ + -DINSTALL_TESTS=OFF \ + -DBUILD_opencv_apps=OFF \ + -DBUILD_DOCS=OFF \ + ../ \ + && make -j$(nproc) \ + && make install \ + && cd /tmp \ + && rm -rf opencv-${OPENCV_VERSION} \ + && apt-get purge -y \ + cmake \ + git \ + libgstreamer-plugins-base1.0-dev \ + libgstreamer1.0-dev \ + libxrender-dev \ + && apt-get autoremove -y -RUN apt-get update && apt-get install -y python3-pip pkg-config zip gnupg +RUN apt-get update && apt-get install -y python3-pip pkg-config gnupg # curl RUN python3 -m pip install --upgrade pip @@ -82,7 +80,6 @@ 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 \ graphsurgeon-tf \ libboost-python-dev \ libboost-thread-dev \ @@ -114,10 +111,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so -RUN apt update && apt install -y libtcmalloc-minimal4 curl build-essential nano vim pkg-config zip +RUN apt update && apt install -y libtcmalloc-minimal4 nano vim pkg-config zip ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" -RUN apt update && apt install -y protobuf-compiler libprotobuf-dev ca-certificates +RUN apt update && apt install -y protobuf-compiler libprotobuf-dev RUN pip install onnx nvidia-pyindex opencv-python==4.3.0.38 # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection From ee5aa0b522913c44e31ffe6b53ac1684ebf11d11 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Tue, 12 Oct 2021 10:32:57 -0300 Subject: [PATCH 30/58] fix dockerfile --- jetson-nano.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 7d710a9d..383e744e 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -6,9 +6,9 @@ FROM nvcr.io/nvidia/l4t-tensorflow:r32.5.0-tf1.15-py3 -The `python3-opencv` package is old and doesn't support gstreamer video writer on Debian. So we need to manually build opencv. +# 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 +# http://amritamaz.net/blog/opencv-config RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ ca-certificates \ From 4ade482a1f24496267409ac9b0c7421db7a340f7 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Tue, 12 Oct 2021 16:21:58 -0300 Subject: [PATCH 31/58] added tensorrt install method --- jetson-nano.Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 383e744e..b462ea27 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -99,7 +99,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python3-scipy \ python3-wget \ supervisor \ - tensorrt \ + # tensorrt \ tzdata \ uff-converter-tf \ && rm -rf /var/lib/apt/lists/* \ @@ -109,6 +109,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get purge -y \ && apt-get autoremove -y +RUN tar -xzf /opt/tensorrt.tar.gz -C /usr/local/lib/python3.6/dist-packages/ + # RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 nano vim pkg-config zip From c249e19e44b47f05a8f04d9afd7b5cb62bdb1145 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Tue, 12 Oct 2021 16:53:06 -0300 Subject: [PATCH 32/58] omit changes --- jetson-nano.Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index b462ea27..383e744e 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -99,7 +99,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ python3-scipy \ python3-wget \ supervisor \ - # tensorrt \ + tensorrt \ tzdata \ uff-converter-tf \ && rm -rf /var/lib/apt/lists/* \ @@ -109,8 +109,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get purge -y \ && apt-get autoremove -y -RUN tar -xzf /opt/tensorrt.tar.gz -C /usr/local/lib/python3.6/dist-packages/ - # RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so RUN apt update && apt install -y libtcmalloc-minimal4 nano vim pkg-config zip From 1b56c69d64270f4374ee32c9d879c1d63074c4ab Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Tue, 12 Oct 2021 17:16:58 -0300 Subject: [PATCH 33/58] migrate new code --- exporters/Dockerfile | 43 +++++ ...add_plugin_and_preprocess_ssd_mobilenet.py | 164 ++++++++++++++++++ exporters/install.sh | 30 ++++ exporters/libflattenconcat.so.6 | Bin 0 -> 74728 bytes exporters/trt_exporter.py | 96 ++++++++++ generate_tensorrt_2.bash | 26 +++ libs/detectors/jetson/detector.py | 1 + libs/detectors/jetson/mobilenet_ssd_v2.py | 25 ++- 8 files changed, 382 insertions(+), 3 deletions(-) create mode 100644 exporters/Dockerfile create mode 100644 exporters/add_plugin_and_preprocess_ssd_mobilenet.py create mode 100755 exporters/install.sh create mode 100755 exporters/libflattenconcat.so.6 create mode 100644 exporters/trt_exporter.py create mode 100644 generate_tensorrt_2.bash diff --git a/exporters/Dockerfile b/exporters/Dockerfile new file mode 100644 index 00000000..56324290 --- /dev/null +++ b/exporters/Dockerfile @@ -0,0 +1,43 @@ +# docker can be installed on the dev board following these instructions: +# https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-repository , step 4: arm64 +# 1) build: docker build -f Dockerfile -t "neuralet/jetson-nano:tf-ssd-to-trt" . +# 2) run: docker run -it --runtime nvidia --privileged --network host -v /PATH_TO_DOCKERFILE_DIRECTORY/:/repo neuralet/jetson-nano:tf-ssd-to-trt + +FROM nvcr.io/nvidia/l4t-base:r32.3.1 + +ENV TZ=US/Pacific +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +VOLUME /repo + +RUN apt-get update && apt-get install -y python3-pip pkg-config + +RUN python3 -m pip install --upgrade pip + +RUN apt-get install -y python3-numpy + +RUN python3 -m pip install pycuda + +RUN apt-get install -y vim git +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 ./trusted-keys /tmp/trusted-keys +RUN apt-key add /tmp/trusted-keys +RUN apt-get update +RUN apt-get install -y tensorrt +RUN apt-get install -y libnvinfer6 libnvinfer-dev python3-libnvinfer python3-libnvinfer-dev +RUN apt-get install -y graphsurgeon-tf uff-converter-tf +RUN pip3 install protobuf +RUN apt-get install -y pkg-config libhdf5-100 libhdf5-dev +RUN apt-get install -y python3-h5py +RUN pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v43 tensorflow==1.15.2+nv20.2 +RUN pip3 install wget + +COPY libflattenconcat.so.6 /repo +COPY graphsurgeon.patch-4.2.2 /repo +COPY install.sh /repo +RUN chmod +x /repo/install.sh && /repo/install.sh + +WORKDIR /repo +ENTRYPOINT ["python3", "build_engine.py"] +CMD ["--config", "configs/config_ssd_mobilenet_v2_pedestrian.ini"] diff --git a/exporters/add_plugin_and_preprocess_ssd_mobilenet.py b/exporters/add_plugin_and_preprocess_ssd_mobilenet.py new file mode 100644 index 00000000..5ffbed13 --- /dev/null +++ b/exporters/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/install.sh b/exporters/install.sh new file mode 100755 index 00000000..66ab9b10 --- /dev/null +++ b/exporters/install.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set -e +cd /repo +# install pycuda if necessary +if ! python3 -c "import pycuda" > /dev/null 2>&1; then + ./install_pycuda.sh +fi + +echo "** Patch 'graphsurgeon.py' in TensorRT" + +script_path=$(realpath $0) +gs_path=$(ls /usr/lib/python3.?/dist-packages/graphsurgeon/node_manipulation.py) +patch_path=$(dirname $script_path)/graphsurgeon.patch + +if head -30 ${gs_path} | tail -1 | grep -q NodeDef; then + # This is for JetPack-4.2 + patch -N -p1 -r - ${gs_path} ${patch_path}-4.2 && echo +fi +if head -22 ${gs_path} | tail -1 | grep -q update_node; then + # This is for JetPack-4.2.2 + patch -N -p1 -r - ${gs_path} ${patch_path}-4.2.2 && echo +fi + +echo "** Making symbolic link of libflattenconcat.so" + +trt_version=$(echo /usr/lib/aarch64-linux-gnu/libnvinfer.so.? | cut -d '.' -f 3) +ln -sf libflattenconcat.so.${trt_version} libflattenconcat.so + +echo "** Installation done" diff --git a/exporters/libflattenconcat.so.6 b/exporters/libflattenconcat.so.6 new file mode 100755 index 0000000000000000000000000000000000000000..189ec1bec68c76b2639ce2aa5ab2509953fd5888 GIT binary patch literal 74728 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 MbN07YuobQU2bg@Z&Hw-a literal 0 HcmV?d00001 diff --git a/exporters/trt_exporter.py b/exporters/trt_exporter.py new file mode 100644 index 00000000..2db74a20 --- /dev/null +++ b/exporters/trt_exporter.py @@ -0,0 +1,96 @@ +"""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=90, 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/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: + 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(uff_path, network) + engine = builder.build_cuda_engine(network) + + 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/generate_tensorrt_2.bash b/generate_tensorrt_2.bash new file mode 100644 index 00000000..fca599cd --- /dev/null +++ b/generate_tensorrt_2.bash @@ -0,0 +1,26 @@ +#!/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/detectors/data/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 $relative_path/detectors/data/ + fi + tar -xvf $relative_path/detectors/data/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/detectors/data/ + pb_file="$relative_path/detectors/data/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + adaptive_model=0 + num_classes=90 + +fi + + +echo "************ Generating TensorRT from: $pb_file **************" +python3 $relative_path/exporters/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes +# mv $relative_path/data/jetson/frozen_inference_graph.bin $relative_path/detectors/data/ 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..fb64d508 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -27,9 +27,28 @@ 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()) + parent_dir = str(Path(__file__).parent.absolute()) + base_dir = '/repo/data/jetson/' + # detector_class_count = len(classes) + logging.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/" + model_file = "frozen_inference_graph.bin" + model_path = os.path.join(base_dir, model_file) + if not os.path.isfile(model_path): + logging.info('model does not exist under: {}, downloading from {}'.format(str(model_path), base_url + model_file)) + os.makedirs(base_dir, exist_ok=True) + os.system("bash "+ parent_dir + "/../generate_tensorrt.bash") + # import pathlib + # if ( pathlib.Path(model_path).suffix == ".pb" ): + # logging.info('model is a Tensorflow protobuf... Converting...') + # os.makedirs(base_dir, exist_ok=True) + # os.system("bash "+ parent_dir + "/../generate_tensorrt.bash " + str(model_path) + " " + str(detector_class_count)) + # model_file = "frozen_inference_graph.bin" + # model_path = os.path.join(base_dir, model_file) + + #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()) def _allocate_buffers(self): """ From 97b8028784e1865492d227f0977214d991afc78f Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 13 Oct 2021 12:50:19 -0300 Subject: [PATCH 34/58] upload new model --- libs/detectors/jetson/mobilenet_ssd_v2.py | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index fb64d508..44f0696a 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -27,17 +27,17 @@ def _load_plugins(self): def _load_engine(self): """ Load engine file as a trt Runtime. """ - parent_dir = str(Path(__file__).parent.absolute()) - base_dir = '/repo/data/jetson/' - # detector_class_count = len(classes) - logging.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/" - model_file = "frozen_inference_graph.bin" - model_path = os.path.join(base_dir, model_file) - if not os.path.isfile(model_path): - logging.info('model does not exist under: {}, downloading from {}'.format(str(model_path), base_url + model_file)) - os.makedirs(base_dir, exist_ok=True) - os.system("bash "+ parent_dir + "/../generate_tensorrt.bash") + # parent_di""" r = str(Path(__file__).parent.absolute()) + # base_dir = '/repo/data/jetson/' + # # detector_class_count = len(classes) + # logging.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/" + # model_file = "frozen_inference_graph.bin" + # model_path = os.path.join(base_dir, model_file) + # if not os.path.isfile(model_path): + # logging.info('model does not exist under: {}, downloading from {}'.format(str(model_path), base_url + model_file)) + # os.makedirs(base_dir, exist_ok=True) + # os.system("bash "+ parent_dir + "/../generate_ten """sorrt.bash") # import pathlib # if ( pathlib.Path(model_path).suffix == ".pb" ): # logging.info('model is a Tensorflow protobuf... Converting...') @@ -46,9 +46,9 @@ def _load_engine(self): # model_file = "frozen_inference_graph.bin" # model_path = os.path.join(base_dir, model_file) - #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()) + trt_bin_path = '/repo/data/jetson/frozen_inference_graph.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()) def _allocate_buffers(self): """ From d3e3b586d108ff1a4d641db70b7afbd97ea9f1e2 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 13 Oct 2021 12:52:52 -0300 Subject: [PATCH 35/58] fix --- libs/detectors/jetson/mobilenet_ssd_v2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index 44f0696a..68377dda 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -46,7 +46,8 @@ def _load_engine(self): # model_file = "frozen_inference_graph.bin" # model_path = os.path.join(base_dir, model_file) - trt_bin_path = '/repo/data/jetson/frozen_inference_graph.bin' % self.model + trt_bin_path = '/repo/data/jetson/frozen_inference_graph.bin' + # 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()) From 1f0734982fade2c3c98b37283051c4fec8da44e1 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Wed, 13 Oct 2021 16:30:03 -0300 Subject: [PATCH 36/58] fix dockerfile --- jetson-nano.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 383e744e..476f1a85 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -115,7 +115,7 @@ RUN apt update && apt install -y libtcmalloc-minimal4 nano vim pkg-config zip ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" RUN apt update && apt install -y protobuf-compiler libprotobuf-dev -RUN pip install onnx nvidia-pyindex opencv-python==4.3.0.38 +RUN pip install onnx nvidia-pyindex # ENV relative_path=/repo/adaptive_object_detection # ENV PYTHONPATH=/repo:/repo/adaptive_object_detection From a25374ec8d4a7e3ff8a62f70c46eac6709bb59e3 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Thu, 14 Oct 2021 16:34:27 -0300 Subject: [PATCH 37/58] refactored script code --- README.md | 6 +-- exporters/{ => jetson}/Dockerfile | 0 ...add_plugin_and_preprocess_ssd_mobilenet.py | 0 .../jetson/generate_mobilenet_tensorrt.bash | 25 ++++++++++ exporters/{ => jetson}/install.sh | 0 exporters/{ => jetson}/libflattenconcat.so.6 | Bin exporters/{ => jetson}/trt_exporter.py | 6 +-- generate_tensorrt_2.bash | 26 ---------- jetson-nano.Dockerfile | 12 ++--- libs/detectors/jetson/mobilenet_ssd_v2.py | 45 +++++++++--------- 10 files changed, 58 insertions(+), 62 deletions(-) rename exporters/{ => jetson}/Dockerfile (100%) rename exporters/{ => jetson}/add_plugin_and_preprocess_ssd_mobilenet.py (100%) create mode 100644 exporters/jetson/generate_mobilenet_tensorrt.bash rename exporters/{ => jetson}/install.sh (100%) rename exporters/{ => jetson}/libflattenconcat.so.6 (100%) rename exporters/{ => jetson}/trt_exporter.py (95%) delete mode 100644 generate_tensorrt_2.bash diff --git a/README.md b/README.md index f403d438..021d8576 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ git checkout $(git tag | tail -1) ``` ###### Run on Jetson Nano -* Works with JetPack 4.5. +* 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/exporters/Dockerfile b/exporters/jetson/Dockerfile similarity index 100% rename from exporters/Dockerfile rename to exporters/jetson/Dockerfile diff --git a/exporters/add_plugin_and_preprocess_ssd_mobilenet.py b/exporters/jetson/add_plugin_and_preprocess_ssd_mobilenet.py similarity index 100% rename from exporters/add_plugin_and_preprocess_ssd_mobilenet.py rename to exporters/jetson/add_plugin_and_preprocess_ssd_mobilenet.py diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash new file mode 100644 index 00000000..636dfb5d --- /dev/null +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -0,0 +1,25 @@ +#!/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 $relative_path/data/jetson/ + fi + tar -xvf $relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ + pb_file="$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + adaptive_model=0 + num_classes=1 + +fi + + +echo "************ Generating TensorRT from: $pb_file **************" +python3 $relative_path/exporters/jetson/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes diff --git a/exporters/install.sh b/exporters/jetson/install.sh similarity index 100% rename from exporters/install.sh rename to exporters/jetson/install.sh diff --git a/exporters/libflattenconcat.so.6 b/exporters/jetson/libflattenconcat.so.6 similarity index 100% rename from exporters/libflattenconcat.so.6 rename to exporters/jetson/libflattenconcat.so.6 diff --git a/exporters/trt_exporter.py b/exporters/jetson/trt_exporter.py similarity index 95% rename from exporters/trt_exporter.py rename to exporters/jetson/trt_exporter.py index 2db74a20..5b68856a 100644 --- a/exporters/trt_exporter.py +++ b/exporters/jetson/trt_exporter.py @@ -22,7 +22,7 @@ import numpy as np import add_plugin_and_preprocess_ssd_mobilenet as plugin -def export_trt(pb_file, output_dir, num_classes=90, neuralet_adaptive_model=1): +def export_trt(pb_file, output_dir, num_classes=1, neuralet_adaptive_model=1): """ Exports the Tensorflow pb models to TensorRT engines. Args: @@ -30,7 +30,7 @@ def export_trt(pb_file, output_dir, num_classes=90, neuralet_adaptive_model=1): output_dir: A directory to store the output files num_classes: Detector's number of classes """ - lib_flatten_concat_file = "exporters/libflattenconcat.so.6" + lib_flatten_concat_file = "exporters/jetson/libflattenconcat.so.6" # initialize if trt.__version__[0] < '7': ctypes.CDLL(lib_flatten_concat_file) @@ -86,7 +86,7 @@ def export_trt(pb_file, output_dir, num_classes=90, neuralet_adaptive_model=1): 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") + 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 diff --git a/generate_tensorrt_2.bash b/generate_tensorrt_2.bash deleted file mode 100644 index fca599cd..00000000 --- a/generate_tensorrt_2.bash +++ /dev/null @@ -1,26 +0,0 @@ -#!/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/detectors/data/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 $relative_path/detectors/data/ - fi - tar -xvf $relative_path/detectors/data/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/detectors/data/ - pb_file="$relative_path/detectors/data/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" - adaptive_model=0 - num_classes=90 - -fi - - -echo "************ Generating TensorRT from: $pb_file **************" -python3 $relative_path/exporters/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes -# mv $relative_path/data/jetson/frozen_inference_graph.bin $relative_path/detectors/data/ diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index 476f1a85..d425dfb7 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -30,8 +30,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libxext6 \ libxrender-dev \ mesa-va-drivers \ + nano \ pkg-config \ python3-pip \ + vim \ zip \ && rm -rf /var/lib/apt/lists/* \ && cd /tmp/ \ @@ -63,8 +65,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libxrender-dev \ && apt-get autoremove -y -RUN apt-get update && apt-get install -y python3-pip pkg-config gnupg -# curl +RUN apt-get update RUN python3 -m pip install --upgrade pip @@ -89,7 +90,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libhdf5-dev \ python3-libnvinfer \ python3-libnvinfer-dev \ - pkg-config \ python3-dev \ python3-h5py \ python3-matplotlib \ @@ -109,21 +109,17 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get purge -y \ && apt-get autoremove -y -# RUN wget https://github.com/neuralet/smart-social-distancing/blob/UpdateJetpack4.5/bin/libflattenconcat.so -O /opt/libflattenconcat.so COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so -RUN apt update && apt install -y libtcmalloc-minimal4 nano vim pkg-config zip +RUN apt update && apt install -y libtcmalloc-minimal4 ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" RUN apt update && apt install -y protobuf-compiler libprotobuf-dev RUN pip install onnx nvidia-pyindex -# ENV relative_path=/repo/adaptive_object_detection -# ENV PYTHONPATH=/repo:/repo/adaptive_object_detection RUN apt upgrade -y 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/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index 68377dda..fc1488a7 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,28 +29,27 @@ def _load_plugins(self): def _load_engine(self): """ Load engine file as a trt Runtime. """ - # parent_di""" r = str(Path(__file__).parent.absolute()) - # base_dir = '/repo/data/jetson/' - # # detector_class_count = len(classes) - # logging.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/" - # model_file = "frozen_inference_graph.bin" - # model_path = os.path.join(base_dir, model_file) - # if not os.path.isfile(model_path): - # logging.info('model does not exist under: {}, downloading from {}'.format(str(model_path), base_url + model_file)) - # os.makedirs(base_dir, exist_ok=True) - # os.system("bash "+ parent_dir + "/../generate_ten """sorrt.bash") - # import pathlib - # if ( pathlib.Path(model_path).suffix == ".pb" ): - # logging.info('model is a Tensorflow protobuf... Converting...') - # os.makedirs(base_dir, exist_ok=True) - # os.system("bash "+ parent_dir + "/../generate_tensorrt.bash " + str(model_path) + " " + str(detector_class_count)) - # model_file = "frozen_inference_graph.bin" - # model_path = os.path.join(base_dir, model_file) - - trt_bin_path = '/repo/data/jetson/frozen_inference_graph.bin' - # 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: + parent_dir = str(pathlib.Path(__file__).parent.absolute()) + logger.info(f"Parent dir is {parent_dir}") + base_dir = '/repo/data/jetson/' + model_file = f"TRT_{self.model}.bin" + model_path = f'{base_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_dir, exist_ok=True) + os.system("bash "+ base_dir + "/../generate_mobilenet_tensorrt.bash") + if (pathlib.Path(model_path).suffix == ".pb"): + logger.info('model is a Tensorflow protobuf... Converting...') + os.makedirs(base_dir, exist_ok=True) + detector_class_count = 1 + os.system("bash "+ base_dir + "/../generate_mobilenet_tensorrt.bash " + str(model_path) + " " + str(detector_class_count)) + model_file = "frozen_inference_graph.bin" + model_path = os.path.join(base_dir, model_file) + + # model_path = '/repo/data/jetson/frozen_inference_graph.bin' + 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): From 36d5a9b26fb1fdafb22f09642b3f471c8334aa27 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 14:19:24 -0300 Subject: [PATCH 38/58] fix path --- libs/detectors/jetson/mobilenet_ssd_v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index fc1488a7..d5ead688 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -33,7 +33,7 @@ def _load_engine(self): logger.info(f"Parent dir is {parent_dir}") base_dir = '/repo/data/jetson/' model_file = f"TRT_{self.model}.bin" - model_path = f'{base_dir}/{model_file}' + model_path = f'{base_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/" From d1cc732f89dc49b7efcaf05217fa4ffa294550bd Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 14:25:35 -0300 Subject: [PATCH 39/58] fix script location path --- libs/detectors/jetson/mobilenet_ssd_v2.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index d5ead688..9cce03be 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -31,22 +31,24 @@ def _load_engine(self): """ Load engine file as a trt Runtime. """ parent_dir = str(pathlib.Path(__file__).parent.absolute()) logger.info(f"Parent dir is {parent_dir}") - base_dir = '/repo/data/jetson/' + 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_dir}{model_file}' + 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_dir, exist_ok=True) - os.system("bash "+ base_dir + "/../generate_mobilenet_tensorrt.bash") + os.makedirs(base_model_dir, exist_ok=True) + os.system("bash " + exporters_dir + "generate_mobilenet_tensorrt.bash") if (pathlib.Path(model_path).suffix == ".pb"): logger.info('model is a Tensorflow protobuf... Converting...') - os.makedirs(base_dir, exist_ok=True) + os.makedirs(base_model_dir, exist_ok=True) detector_class_count = 1 - os.system("bash "+ base_dir + "/../generate_mobilenet_tensorrt.bash " + str(model_path) + " " + str(detector_class_count)) + os.system("bash "+ "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_dir, model_file) + model_path = os.path.join(base_model_dir, model_file) # model_path = '/repo/data/jetson/frozen_inference_graph.bin' with open(model_path, 'rb') as f, trt.Runtime(self.trt_logger) as runtime: From 502b78d91ca9af26e084138719461c8c83f44f8f Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 14:29:24 -0300 Subject: [PATCH 40/58] added root dir --- exporters/jetson/generate_mobilenet_tensorrt.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index 636dfb5d..62462ccd 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -22,4 +22,4 @@ fi echo "************ Generating TensorRT from: $pb_file **************" -python3 $relative_path/exporters/jetson/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes +python3 repo/$relative_path/exporters/jetson/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes From 0321a2f354cc8e66643aa390398bc1ea35f242ba Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 14:37:09 -0300 Subject: [PATCH 41/58] weird fix root --- exporters/jetson/generate_mobilenet_tensorrt.bash | 8 ++++---- libs/detectors/jetson/mobilenet_ssd_v2.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index 62462ccd..f785eec6 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -9,12 +9,12 @@ then num_classes=$2 else - if [ ! -f "$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz" ]; then + if [ ! -f "repo$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 $relative_path/data/jetson/ fi - tar -xvf $relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ - pb_file="$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + tar -xvf repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ + pb_file="repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 @@ -22,4 +22,4 @@ fi echo "************ Generating TensorRT from: $pb_file **************" -python3 repo/$relative_path/exporters/jetson/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes +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/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index 9cce03be..fc44ec97 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -46,7 +46,7 @@ def _load_engine(self): logger.info('model is a Tensorflow protobuf... Converting...') os.makedirs(base_model_dir, exist_ok=True) detector_class_count = 1 - os.system("bash "+ "bash " + exporters_dir + "generate_mobilenet_tensorrt.bash" + str(model_path) + " " + str(detector_class_count)) + 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) From 3404db0d8b6b08edf7ee3e5f70728b94beddd47b Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 14:39:33 -0300 Subject: [PATCH 42/58] weird fix root --- exporters/jetson/generate_mobilenet_tensorrt.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index f785eec6..0c9f1b60 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -11,9 +11,9 @@ then else if [ ! -f "repo$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 $relative_path/data/jetson/ + 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 $relative_path/data/jetson/ + 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/ pb_file="repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 From 6e48b51a395beeb5ed2e887cb4777a9bae152ba0 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 14:47:56 -0300 Subject: [PATCH 43/58] undid weird fix --- exporters/jetson/generate_mobilenet_tensorrt.bash | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index 0c9f1b60..636dfb5d 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -9,12 +9,12 @@ then num_classes=$2 else - if [ ! -f "repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz" ]; then + 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/ + wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz -P $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/ - pb_file="repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + tar -xvf $relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ + pb_file="$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 @@ -22,4 +22,4 @@ 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 +python3 $relative_path/exporters/jetson/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes From 659698d6f362f45f331b40085917e1ba4ffd3dcb Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 15:39:33 -0300 Subject: [PATCH 44/58] test --- exporters/jetson/generate_mobilenet_tensorrt.bash | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index 636dfb5d..30730169 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -9,12 +9,12 @@ then num_classes=$2 else - if [ ! -f "$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz" ]; then + if [ ! -f "./repo$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 $relative_path/data/jetson/ + 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 $relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ - pb_file="$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + tar -xvf ./repo$reporelative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C ./repo$relative_path/data/jetson/ + pb_file="./repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 From aea40eaba8b38ddbce240c26e88e0ff3779f9c6f Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 15:42:05 -0300 Subject: [PATCH 45/58] test --- exporters/jetson/generate_mobilenet_tensorrt.bash | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index 30730169..f9aa5af2 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -9,12 +9,12 @@ then num_classes=$2 else - if [ ! -f "./repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz" ]; then + 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/ + 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$reporelative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C ./repo$relative_path/data/jetson/ - pb_file="./repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + tar -xvf $relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ + pb_file="$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 From 14f56de93c7cf43a3ffa1316a90d864a4d8add39 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 15:55:19 -0300 Subject: [PATCH 46/58] fix path --- exporters/jetson/generate_mobilenet_tensorrt.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index f9aa5af2..846cc3cb 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -13,7 +13,7 @@ else 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 $relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ + tar -xvf /repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29.tar.gz --no-same-owner -C $relative_path/data/jetson/ pb_file="$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 From 1b9c92dc25571a71ebbf41e82f517f0563d18d6d Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 15:56:55 -0300 Subject: [PATCH 47/58] fix path --- exporters/jetson/generate_mobilenet_tensorrt.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index 846cc3cb..e65b7642 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -13,7 +13,7 @@ else 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 $relative_path/data/jetson/ + 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/ pb_file="$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 From 7853bae534a0e05bfb84f08175a51748a54aa3ec Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 15:59:04 -0300 Subject: [PATCH 48/58] fix path --- exporters/jetson/generate_mobilenet_tensorrt.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index e65b7642..2766a22f 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -14,7 +14,7 @@ else 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/ - pb_file="$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/frozen_inference_graph.pb" adaptive_model=0 num_classes=1 @@ -22,4 +22,4 @@ fi echo "************ Generating TensorRT from: $pb_file **************" -python3 $relative_path/exporters/jetson/trt_exporter.py --pb_file $pb_file --out_dir $relative_path/data/jetson --neuralet_adaptive_model $adaptive_model --num_classes $num_classes +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 From 478348ca411ea129714e77f64b94a311ee291297 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 16:02:26 -0300 Subject: [PATCH 49/58] fix trt exporter --- exporters/jetson/trt_exporter.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exporters/jetson/trt_exporter.py b/exporters/jetson/trt_exporter.py index 5b68856a..0353c8da 100644 --- a/exporters/jetson/trt_exporter.py +++ b/exporters/jetson/trt_exporter.py @@ -64,14 +64,15 @@ def export_trt(pb_file, output_dir, num_classes=1, neuralet_adaptive_model=1): debug_mode=False) input_dims = (3, 300, 300) with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.UffParser() as parser: - builder.max_workspace_size = 1 << 28 + config = builder.create_builder_config() + config.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(uff_path, network) - engine = builder.build_cuda_engine(network) + engine = builder.build_engine(network, config) buf = engine.serialize() engine_path = os.path.join(output_dir, model_file_name + ".bin") From 66ee1f03787967c30c48fb1d509ed6a5f68f279a Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 16:07:59 -0300 Subject: [PATCH 50/58] fix trt exporter --- exporters/jetson/trt_exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/jetson/trt_exporter.py b/exporters/jetson/trt_exporter.py index 0353c8da..f71b1496 100644 --- a/exporters/jetson/trt_exporter.py +++ b/exporters/jetson/trt_exporter.py @@ -67,7 +67,7 @@ def export_trt(pb_file, output_dir, num_classes=1, neuralet_adaptive_model=1): config = builder.create_builder_config() config.max_workspace_size = 1 << 28 builder.max_batch_size = 1 - builder.fp16_mode = True + # builder.fp16_mode = True parser.register_input('Input', input_dims) parser.register_output('MarkOutput_0') From f13bfa08845749c9ced00d71913274a13d4f31bd Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Fri, 15 Oct 2021 16:11:59 -0300 Subject: [PATCH 51/58] fix trt exporter --- exporters/jetson/generate_mobilenet_tensorrt.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index 2766a22f..ded04f7e 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -16,7 +16,7 @@ else 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/ pb_file="/repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" adaptive_model=0 - num_classes=1 + num_classes=90 fi From e040f1616ce04a525aecbef35ed8d942c39d8721 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Mon, 18 Oct 2021 10:37:54 -0300 Subject: [PATCH 52/58] fixed script renaming --- exporters/jetson/generate_mobilenet_tensorrt.bash | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exporters/jetson/generate_mobilenet_tensorrt.bash b/exporters/jetson/generate_mobilenet_tensorrt.bash index ded04f7e..931872f6 100644 --- a/exporters/jetson/generate_mobilenet_tensorrt.bash +++ b/exporters/jetson/generate_mobilenet_tensorrt.bash @@ -14,7 +14,9 @@ else 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/ - pb_file="/repo$relative_path/data/jetson/ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb" + 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 From 2696b93c286eab0a9b5c84a88b5a4929e8a84f00 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Mon, 18 Oct 2021 10:38:34 -0300 Subject: [PATCH 53/58] removed dockerfile --- exporters/jetson/Dockerfile | 43 ------------------------------------- exporters/jetson/install.sh | 30 -------------------------- 2 files changed, 73 deletions(-) delete mode 100644 exporters/jetson/Dockerfile delete mode 100755 exporters/jetson/install.sh diff --git a/exporters/jetson/Dockerfile b/exporters/jetson/Dockerfile deleted file mode 100644 index 56324290..00000000 --- a/exporters/jetson/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -# docker can be installed on the dev board following these instructions: -# https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-repository , step 4: arm64 -# 1) build: docker build -f Dockerfile -t "neuralet/jetson-nano:tf-ssd-to-trt" . -# 2) run: docker run -it --runtime nvidia --privileged --network host -v /PATH_TO_DOCKERFILE_DIRECTORY/:/repo neuralet/jetson-nano:tf-ssd-to-trt - -FROM nvcr.io/nvidia/l4t-base:r32.3.1 - -ENV TZ=US/Pacific -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - -VOLUME /repo - -RUN apt-get update && apt-get install -y python3-pip pkg-config - -RUN python3 -m pip install --upgrade pip - -RUN apt-get install -y python3-numpy - -RUN python3 -m pip install pycuda - -RUN apt-get install -y vim git -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 ./trusted-keys /tmp/trusted-keys -RUN apt-key add /tmp/trusted-keys -RUN apt-get update -RUN apt-get install -y tensorrt -RUN apt-get install -y libnvinfer6 libnvinfer-dev python3-libnvinfer python3-libnvinfer-dev -RUN apt-get install -y graphsurgeon-tf uff-converter-tf -RUN pip3 install protobuf -RUN apt-get install -y pkg-config libhdf5-100 libhdf5-dev -RUN apt-get install -y python3-h5py -RUN pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v43 tensorflow==1.15.2+nv20.2 -RUN pip3 install wget - -COPY libflattenconcat.so.6 /repo -COPY graphsurgeon.patch-4.2.2 /repo -COPY install.sh /repo -RUN chmod +x /repo/install.sh && /repo/install.sh - -WORKDIR /repo -ENTRYPOINT ["python3", "build_engine.py"] -CMD ["--config", "configs/config_ssd_mobilenet_v2_pedestrian.ini"] diff --git a/exporters/jetson/install.sh b/exporters/jetson/install.sh deleted file mode 100755 index 66ab9b10..00000000 --- a/exporters/jetson/install.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -set -e -cd /repo -# install pycuda if necessary -if ! python3 -c "import pycuda" > /dev/null 2>&1; then - ./install_pycuda.sh -fi - -echo "** Patch 'graphsurgeon.py' in TensorRT" - -script_path=$(realpath $0) -gs_path=$(ls /usr/lib/python3.?/dist-packages/graphsurgeon/node_manipulation.py) -patch_path=$(dirname $script_path)/graphsurgeon.patch - -if head -30 ${gs_path} | tail -1 | grep -q NodeDef; then - # This is for JetPack-4.2 - patch -N -p1 -r - ${gs_path} ${patch_path}-4.2 && echo -fi -if head -22 ${gs_path} | tail -1 | grep -q update_node; then - # This is for JetPack-4.2.2 - patch -N -p1 -r - ${gs_path} ${patch_path}-4.2.2 && echo -fi - -echo "** Making symbolic link of libflattenconcat.so" - -trt_version=$(echo /usr/lib/aarch64-linux-gnu/libnvinfer.so.? | cut -d '.' -f 3) -ln -sf libflattenconcat.so.${trt_version} libflattenconcat.so - -echo "** Installation done" From 615b1d03034939d47533e1684c21e4ee70aea3af Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Mon, 18 Oct 2021 13:36:40 -0300 Subject: [PATCH 54/58] add fp16 --- exporters/jetson/trt_exporter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/exporters/jetson/trt_exporter.py b/exporters/jetson/trt_exporter.py index f71b1496..e0a11fad 100644 --- a/exporters/jetson/trt_exporter.py +++ b/exporters/jetson/trt_exporter.py @@ -67,7 +67,9 @@ def export_trt(pb_file, output_dir, num_classes=1, neuralet_adaptive_model=1): config = builder.create_builder_config() config.max_workspace_size = 1 << 28 builder.max_batch_size = 1 - # builder.fp16_mode = True + if builder.platform_has_fp16: + config.set_flag(trt.BuilderFlag.FP16) + # builder.fp16_mode = True TODO: This setting got deprecated parser.register_input('Input', input_dims) parser.register_output('MarkOutput_0') From e1b6a1c416167900b0266b1211f84af4a15ea419 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Mon, 18 Oct 2021 13:42:51 -0300 Subject: [PATCH 55/58] fix --- exporters/jetson/trt_exporter.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/exporters/jetson/trt_exporter.py b/exporters/jetson/trt_exporter.py index e0a11fad..9fde05c1 100644 --- a/exporters/jetson/trt_exporter.py +++ b/exporters/jetson/trt_exporter.py @@ -67,9 +67,8 @@ def export_trt(pb_file, output_dir, num_classes=1, neuralet_adaptive_model=1): config = builder.create_builder_config() config.max_workspace_size = 1 << 28 builder.max_batch_size = 1 - if builder.platform_has_fp16: - config.set_flag(trt.BuilderFlag.FP16) - # builder.fp16_mode = True TODO: This setting got deprecated + config.set_flag(trt.BuilderFlag.FP16) + # builder.fp16_mode = True TODO: This setting got deprecated parser.register_input('Input', input_dims) parser.register_output('MarkOutput_0') From f2bd7fabf4e538183b122a09b7916ce7db60bcf6 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Mon, 18 Oct 2021 13:48:22 -0300 Subject: [PATCH 56/58] removed comment --- exporters/jetson/trt_exporter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/exporters/jetson/trt_exporter.py b/exporters/jetson/trt_exporter.py index 9fde05c1..7c69f713 100644 --- a/exporters/jetson/trt_exporter.py +++ b/exporters/jetson/trt_exporter.py @@ -68,7 +68,6 @@ def export_trt(pb_file, output_dir, num_classes=1, neuralet_adaptive_model=1): config.max_workspace_size = 1 << 28 builder.max_batch_size = 1 config.set_flag(trt.BuilderFlag.FP16) - # builder.fp16_mode = True TODO: This setting got deprecated parser.register_input('Input', input_dims) parser.register_output('MarkOutput_0') From 92c45546735ee8deb2c620f8c735ab78a2afe6a6 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Mon, 18 Oct 2021 13:49:20 -0300 Subject: [PATCH 57/58] removed comment --- libs/detectors/jetson/mobilenet_ssd_v2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index fc44ec97..740e4e39 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -50,7 +50,6 @@ def _load_engine(self): model_file = "frozen_inference_graph.bin" model_path = os.path.join(base_model_dir, model_file) - # model_path = '/repo/data/jetson/frozen_inference_graph.bin' with open(model_path, 'rb') as f, trt.Runtime(self.trt_logger) as runtime: return runtime.deserialize_cuda_engine(f.read()) From 2f0afb474ac18a492cff3b82d0a6343366525327 Mon Sep 17 00:00:00 2001 From: Renzo Gambone Date: Thu, 21 Oct 2021 15:17:06 -0300 Subject: [PATCH 58/58] dockerfile improvements --- jetson-nano.Dockerfile | 10 ++++------ libs/detectors/jetson/mobilenet_ssd_v2.py | 4 +--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/jetson-nano.Dockerfile b/jetson-nano.Dockerfile index d425dfb7..1912e76f 100644 --- a/jetson-nano.Dockerfile +++ b/jetson-nano.Dockerfile @@ -84,10 +84,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ graphsurgeon-tf \ libboost-python-dev \ libboost-thread-dev \ + libtcmalloc-minimal4 \ libnvinfer6 \ libnvinfer-dev \ libhdf5-100 \ libhdf5-dev \ + libprotobuf-dev \ + protobuf-compiler \ python3-libnvinfer \ python3-libnvinfer-dev \ python3-dev \ @@ -105,18 +108,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && 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 \ - && python3 -m pip install --upgrade pip setuptools==41.0.0 wheel protobuf wget pillow pycuda && pip install -r requirements.txt \ + && 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 \ && apt-get autoremove -y COPY ./bin/libflattenconcat.so /opt/libflattenconcat.so -RUN apt update && apt install -y libtcmalloc-minimal4 ENV LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libtcmalloc_minimal.so.4" -RUN apt update && apt install -y protobuf-compiler libprotobuf-dev -RUN pip install onnx nvidia-pyindex - -RUN apt upgrade -y ENV DEV_ALLOW_ALL_ORIGINS=true ENV CONFIG_FILE=config-jetson-nano.ini diff --git a/libs/detectors/jetson/mobilenet_ssd_v2.py b/libs/detectors/jetson/mobilenet_ssd_v2.py index 740e4e39..6c5925fa 100644 --- a/libs/detectors/jetson/mobilenet_ssd_v2.py +++ b/libs/detectors/jetson/mobilenet_ssd_v2.py @@ -29,8 +29,6 @@ def _load_plugins(self): def _load_engine(self): """ Load engine file as a trt Runtime. """ - parent_dir = str(pathlib.Path(__file__).parent.absolute()) - logger.info(f"Parent dir is {parent_dir}") root_dir = "/repo" exporters_dir = f"{root_dir}/exporters/jetson/" base_model_dir = f'{root_dir}/data/jetson/' @@ -42,7 +40,7 @@ def _load_engine(self): 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") - if (pathlib.Path(model_path).suffix == ".pb"): + 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