이번 포스팅은 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
실행 시 아래와 같은 에러를 마주 치는 경우가 있다.
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
이러고 나니 이렇게 에러 없이 빌드를 성공할 수 있었다.
예제 실행
위 설명에서 build bindings 까지 성공하고 나면 아래 그림 처럼 build 폴더내에 '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
예제를 실행 하고 나면 gstreamer warning이 마구 발생하며 꼭 실행이 안될 것 처럼 log가 나온다.
하지만 실행은 된다.
아래는 실행 화면 인다. 아이패드로 유재석 씨 사진을 띄워 카메라 앞에 두니 사람으로 인식하는 모습을 볼 수 있다.
이렇게 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 빌드에 성공한 내용이 이번 포스팅의 내용이다.
'jetson' 카테고리의 다른 글
[jetson nano] edge device에서 FastMOT inference (0) | 2022.01.23 |
---|---|
[jetson nano] pyinstaller 이용 실행파일 만들기 (0) | 2022.01.18 |
[jetson nano] opencv 4.5.1 설치 (0) | 2022.01.15 |
[Jetson nano] docker를 이용한 개발 환경 세팅 (4) | 2022.01.15 |
jetson nano 조립 및 세팅 (0) | 2022.01.10 |