이번 포스팅은 deepstream 6.0을 이용한 PYTHON 예제를 실행 할 수 있는 환경을 docker에서 구성하는 과정을 담는다.

분명 하라는 instruction에서 하라는 대로 했지만 실패 해서 이 문서 저문서를 참고해 환경 구성에 성공했다.

 

deepstream 이 뭔지가 궁금한 분들은 아래 페이지를 읽어 보도록 하자. 내가 설명 하는 것 보다는 nvidia의 설명을 그대로 읽는게 더 도움이 될것 같다.

deepstream: https://developer.nvidia.com/deepstream-sdk

 

NVIDIA DeepStream SDK

Build and deploy AI-powered Intelligent Video Analytics apps and services. DeepStream offers a multi-platform scalable framework to deploy on the edge or connect to any cloud.

developer.nvidia.com

 

실패의 경험으로 부터 찾은 성공 방법이 누군가에게 도움이 되길 바란다.

 

목표:

deepstream 6.0 docker 이미지에 python 예제를 실행 할수 있도록 deepstream-python-apps을 바인딩

deepstream 6.0부터는 python binding이 기본 제공이 안된다고 한다.

그래서 python api 를 바인딩하고 예제를 돌려 봄으로서 정상적으로 binding 된것을 확인하는게 목표이다.

환경

나는 jetson nano에 도커를 이용해 환경을 구성했다.

 

host 환경

hardware: jetson nano

jetpack: 4.6(r32.6.1)

cudnn:8.2.1

cuda: 10.2

 

위 호스트 환경에서 deepstream-l4t docker이미지를 다운 받아 python 예제 실행을 위해 python binding을 진행했다.

 

docker version: 20.10.2, build 20.10.2-0ubuntu1~18.0.2

base image: nvcr.io/nvidia/deepstream-l4t:6.0-samples

아래 명령으로 받을 수있다. 

docker pull nvcr.io/nvidia/deepstream-l4t:6.0-samples

 

성공적으로 python 바인딩을 빌드 하기 위해 나는 호스트와 컨테이너(docker container)내부에서 필요 라이브러리나 패키지를 설치 했다.

 

따라서 호스트 사이드에서한 작업과 컨테이너 내부에서 한 작업을 각 섹션에서 설명한다. 

 

Host side

호스트에서 가장 먼저 한일은 nvidia-l4t-gstreamer를 설치 하는 것이었다.

(사실 이과정이 정확히 필요한지는 모르겠다.  아래 실패 사례의 기록에서 보면 gst-python 빌드 과정에서 gst/gst.h를 찾을수 없다는 에러가 발생해 그걸 해결하는 과정에서 이걸 설치 하게되었다. 혹 이게 필요 없는 과정이라면 댓글로 알려주시면 참 고맙겠습니다.)

우선 vi나 vim으로 아래 파일을 열고

 vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list

아래 두 문장을 파일에 쓰고 저장한다. 

이때 두번째 줄에 'jetson/t210'이라고 적은 부분이 있는데  't210' 은 jetson nano를 지칭하는 platform 구분자이다. tx2나 xavier는 다른 플렛폼 구분자를 써줘야 한다.

deb https://repo.download.nvidia.com/jetson/common r32.6 main
deb https://repo.download.nvidia.com/jetson/t210 r32.6 main

그리고 나서 아래 명령 실행한다.

apt update

실행 시 아래와 같은 에러를 마주 치는 경우가 있다.

Fig 1. NO_PUBKEY Error

Err:1 https://repo.download.nvidia.com/jetson/common r32.6 InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
Err:2 https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
Hit:4 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease
Hit:5 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease
Hit:6 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease
Reading package lists... Done                      
W: GPG error: https://repo.download.nvidia.com/jetson/common r32.6 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
E: The repository 'https://repo.download.nvidia.com/jetson/common r32.6 InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: GPG error: https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 0D296FFB880FB004
E: The repository 'https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

위 에러를 해결 하기 위해 나는 아래와 같은 명령을 입력했다.  repo에 접근 하기 위한 public key를 받아 오라는 명령이다.

 apt-key adv --fetch-key https://repo.download.nvidia.com/jetson/jetson-ota-public.asc

위 명령으로 에러를 해결하고 난후 'apt update' 명령은 아래 처럼 에러 없이 수행된다.

Hit:1 http://ports.ubuntu.com/ubuntu-ports bionic InRelease                                                 
Get:2 https://repo.download.nvidia.com/jetson/common r32.6 InRelease [2555 B]                               
Hit:3 http://ports.ubuntu.com/ubuntu-ports bionic-updates InRelease                
Get:4 https://repo.download.nvidia.com/jetson/t210 r32.6 InRelease [2547 B]
Hit:5 http://ports.ubuntu.com/ubuntu-ports bionic-backports InRelease              
Hit:6 http://ports.ubuntu.com/ubuntu-ports bionic-security InRelease    
Get:7 https://repo.download.nvidia.com/jetson/common r32.6/main arm64 Packages [17.4 kB]
Get:8 https://repo.download.nvidia.com/jetson/t210 r32.6/main arm64 Packages [9493 B]

업데이트가 끝나면 목표로 처음 목표 였던 nvidia-l4t-gstreamer를 설치 한다.

sudo apt install --reinstall nvidia-l4t-gstreamer

 

 

Inside docker

도커를 실행 하기 위해 내가 사용한 명령 및 옵션은 아래와 같다.

docker

 

컨테이너 내부에서도 가장 먼저 한일은 gstreamer관련 툴, 라이브러리, 패키지 등을 설치하는 것이다.

host side에서 nvidia-l4t-gstreamer를 설치 한 것과 같은 이유로 gst-python을 빌드 하는 과정에서

gst/gst.h 와 관련된 에러가 나오는데 이 문제를 해결하기 위한 방법이다.

 

검색을 한참 해보고 nvidia측에서 한 답변과 인터넷의 똑똑한 분들이 추천한 방법들을 많이 시도해 봤지만

내 경우에 그 제안들은 해결방법이 아니었기 때문에 아래 문서를 보고 gstreamer와 관련된 걸 전부다 설치 했다.

 

최소한의 설치로 이 문제를 해결하면 edge device의 특성상 disk space를 아낄 수 있겠지만 시간 관계상 급한데로 전부 설치 했다.

 

GStreamer-1.0 Installation and Setup

 

generic-no-api_r2

Your browser has DOM storage disabled. Make sure DOM storage is enabled and try again.

docs.nvidia.com

 

위와 같은 이유로 나는 아래 명령을 컨테이너 내부에서 실행해 gstreamer와 관련된 패키지들을 설치 했다.

apt-get update
apt-get install gstreamer1.0-tools gstreamer1.0-alsa \
  gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
  gstreamer1.0-libav
apt-get install libgstreamer1.0-dev \
  libgstreamer-plugins-base1.0-dev \
  libgstreamer-plugins-good1.0-dev \
  libgstreamer-plugins-bad1.0-dev

그리고 아래 패키지들도 추가로 설치 했다. (나는 이걸 컨테이너 내부에서 설치했는데 nvidia 측에서는 이건 host에 설치해야 하는 거고 docker 옵션 중 --runtime nvidia 를 사용 하면 아래 명령으로 설치한 것들이 container에 자동으로 마운트 되는 구조라고 한다. )

apt install libssl1.0.0 libgstreamer1.0-0 libgstrtspserver-1.0-0 libjansson4=2.11-1

그리고 나서 아래 link의 안내를 따라 진행했다.

link:https://github.com/NVIDIA-AI-IOT/deepstream_python_apps/tree/master/bindings

 

GitHub - NVIDIA-AI-IOT/deepstream_python_apps: DeepStream SDK Python bindings and sample applications

DeepStream SDK Python bindings and sample applications - GitHub - NVIDIA-AI-IOT/deepstream_python_apps: DeepStream SDK Python bindings and sample applications

github.com

apt install -y git python-dev python3 python3-pip python3.6-dev python3.8-dev cmake g++ build-essential \
    libglib2.0-dev libglib2.0-dev-bin python-gi-dev libtool m4 autoconf automake
    
cd /opt/nvidia/deepstream/deepstream-6.0/sources
git clone https://github.com/NVIDIA-AI-IOT/deepstream_python_apps.git
cd deepstream_python_apps
git submodule update --init

Installing Gst-python

cd 3rdparty/gst-python/
./autogen.sh
make
make install

 Building the bindings

cd deepstream_python_apps/bindings
mkdir build
cd build
cmake ..
make

이러고 나니 이렇게 에러 없이 빌드를 성공할 수 있었다.

 

Fig 2. build bindings 성공 화면

 

예제 실행

위 설명에서 build bindings 까지 성공하고 나면 아래 그림 처럼 build 폴더내에 'pyds.so' 파일이 생성된다.

Fig 3. pyds.so 생성된 모습

생성된 pyds.so 파일은  /opt/nvidia/deepstream/deepstream-6.0/lib 에 복사 해줘야 한다.

아래 명령에서 나는 상대 경로를 사용했다. pyds.so 파일이 최종적으로 위치 해야 하는 곳에 복사만 해주면 된다.

cp pyds.so ../../../../lib/
# 또는
# cp pyds.so /opt/nvidia/deepstream/deepstream-6.0/lib

만약 pyds.so 파일을 저 위치에 복사 하지 않으면 아래와 같은 에러 메시지를 보게 될 것이다.

내가 실제로 봤다...  저거 복사하라는 말은 instruction에서 못봤는데...

 

Traceback (most recent call last):
File “deepstream_test_1_usb.py”, line 29, in
import pyds
ModuleNotFoundError: No module named ‘pyds’

 

pyds.so 복사 하고 난 후 python 예제가 실행 되는 지 확인 하기 위해 아래 파일을 실행했다.

example path : /opt/nvidia/deepstream/deepstream-6.0/sources/deepstream_python_apps/apps/deepstream-test1-usbcam

cd /opt/nvidia/deepstream/deepstream-6.0/sources/deepstream_python_apps/apps/deepstream-test1-usbcam
python3 deepstream_test_1_usb.py /dev/video0

Fig 4. 예제 실행 후 warning이 뜨는 화면

예제를 실행 하고 나면 gstreamer warning이 마구 발생하며 꼭 실행이 안될 것 처럼 log가 나온다.

하지만 실행은 된다.

아래는 실행 화면 인다. 아이패드로 유재석 씨 사진을 띄워 카메라 앞에 두니 사람으로 인식하는 모습을 볼 수 있다.

Fig 5. 예제 실행 후 사람 인식 모습

이렇게 deepstream 6.0 python예제를 실행 시키는 방법을 알아 봤다.

이제 예제 코드를 분석해 sdk 사용법을 파악 한 후 본 프로젝트 개발을 시작해야겠다.

 

 

아래는 첫 시도에서 실패 했던 과정에 대한 기록이다.

더보기

down load deepstream 6.0-l4t sample container:

docker pull nvcr.io/nvidia/deepstream-l4t:6.0-samples

앞으로의 내용은 거의 아래 link를 따라 한것 인데 나는 이걸 따라 해서 실패 했다. 그래서 이 문서 저문서를 참고해 성공한 방법이 위 포스팅 내용이었다.

 

GitHub - NVIDIA-AI-IOT/deepstream_python_apps: DeepStream SDK Python bindings and sample applications

DeepStream SDK Python bindings and sample applications - GitHub - NVIDIA-AI-IOT/deepstream_python_apps: DeepStream SDK Python bindings and sample applications

github.com

python binding installation

apt-get install python-gi-dev
export GST_LIBS="-lgstreamer-1.0 -lgobject-2.0 -lglib-2.0"
export GST_CFLAGS="-pthread -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include"

apt-get install python3-dev libpython3-dev
apt-get install libtool m4 automake 
apt install libgstreamer1.0-dev

git clone https://github.com/GStreamer/gst-python.git
cd gst-python
git checkout 1a8f48a
./autogen.sh PYTHON=python3
./configure PYTHON=python3
make
make install

위 명령을 실행 시키다 보면 아래와 같은 에러가 발생한다.

libtoolize:   error: One of these is required:
libtoolize:                 gm4 gnum4 m4
libtoolize:   error: Please install GNU M4, or 'export M4=/path/to/gnu/m4'.

그래서 아래 패키지를 설치해줬다.

apt-get install libtool m4 automake

 

설치후 다시 gst-python 을 빌드하면 다시 아래와 같은 error가 발생한다.

정확히는 './autogen.sh PYTHON=python3' 명령 실행 후 발생한다.

checking for headers required to compile python extensions... not found
configure: error: could not find Python headers
  configure failed

그래서 아래 명령을 통해 필요한 패키지들을 설치

apt-get install python3-dev libpython3-dev

그리고 나면 './autogen.sh PYTHON=python3' 명령은 무사히 넘어 갈수 있다.

 

그러나 './configure PYTHON=python3' 실행시 문제의 아래 error가 발생한다.

make[3]: Entering directory '/opt/nvidia/gst-python/gi/overrides'
  CC       _gi_gst_la-gstmodule.lo
gstmodule.c:31:10: fatal error: gst/gst.h: No such file or directory
 #include <gst/gst.h>
          ^~~~~~~~~~~
compilation terminated.

위 에러에 대한 해결 방법을 검색 하면 아래 페이지를 볼 수 있다. 하지만 시는데로 해도 문제가 해결되지 않아 나는 위에서 열거한 그 많은 gstreamer 관련 패키지를 모두 설치 한것이다....

link:https://forums.developer.nvidia.com/t/no-such-file-or-directory-include-gst-gst-h/156423/6

 

No such file or directory #include <gst/gst.h>

cc -c -o deepstream_app.o -DPLATFORM_TEGRA -I./ -I…/…/apps-common/includes -I…/…/…/includes -DDS_VERSION_MINOR=0 -DDS_VERSION_MAJOR=5 pkg-config --cflags gstreamer-1.0 gstreamer-video-1.0 x11 json-glib-1.0 deepstream_app.c Package gstreamer-video

forums.developer.nvidia.com

apt-get install libgstreamer1.0-dev libjson-glib-dev

여기 까지가 실패했던 첫번째 시도의 내용이다.

그리고 container를 종료 하고 인터넷을 열심히 검색해 이문서 저문서의 내용을 종합해 python bindings 빌드에 성공한 내용이 이번 포스팅의 내용이다.

 

+ Recent posts