결론 부터 말하면 이 시도는 실패에 대한 기록을 담고 있다.

목적은 fastMot를 jetson nano에서 실행해 응용 프로그램에서 사용 하는 것이었는데 jetson nano의 performance를 잘못 파악했고 내 실수 인지 버그인지 inference 수행 시 메모리 부족 에러가 발생하고 정상 실행되지 않는다.

 

차후 이건 다시 시도 해보고 성공하면 성공 기록을 정리해 남겨야겠다.

 

결과

(이 포스팅 따라하시면 같은 사유로 inference 시 저와 같은 문제가 발생 할 수 있음을 분명히 미리 말씀드립니다. )

실행 할 수있게 각종 dependencies들을 설치 하고 빌드는 성공했으나 inference 수행히 메모리 에러 발생하며 실행 종료됨

 

목표:

아래 리포지토리의 모델 inference가 가능한 환경을 도커로 세팅해 jetson nano에서 사용 할수 있게 배포

target:https://github.com/GeekAlexis/FastMOT

 

GitHub - GeekAlexis/FastMOT: High-performance multiple object tracking based on YOLO, Deep SORT, and KLT 🚀

High-performance multiple object tracking based on YOLO, Deep SORT, and KLT 🚀 - GitHub - GeekAlexis/FastMOT: High-performance multiple object tracking based on YOLO, Deep SORT, and KLT 🚀

github.com

환경

 

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/l4t-ml:r32.5.0-py3

docker pull nvcr.io/nvidia/l4t-ml:r32.5.0-py3

base image에는 다음과 같은 패키지가 설치되어있다.

더보기
  • TensorFlow 1.15
  • PyTorch v1.7.0
  • torchvision v0.8.0
  • torchaudio v0.7.0
  • onnx 1.8.0
  • CuPy 8.0.0
  • numpy 1.19.4
  • numba 0.52.0
  • OpenCV 4.1.1
  • pandas 1.1.5
  • scipy 1.5.4
  • scikit-learn 0.23.2
  • JupyterLab 2.2.9

디펜던시 설치

1. cupy 9.2 설치

installed version:8.0.0b4

required version: 9.2

fastMot 를 실행 하는데 필요한 cupy로 버전 업데이트 진행

pip3 install --upgrade cython
pip3 install cupy==9.2

2. numba 버전 변경

installed version: '0.52.0'

required version: '0.48'

컨테이너에 기본 설치 된 numba 버전이 필요 버전보다 상위 버전이므로 다운 그레이드

아래 첫번째 명령에서 'apt install llvm-**X** ' 이걸 실행했는데 이러면 현 os와 호환가능한 등록된 모든 버전이 설치된다.

버전을 명시해서 설치하기 바란다...

# llvmlite requires below libraries
apt install llvm-**X** 

#set LLVM_CONFIG path
export LLVM_CONFIG=/usr/bin/llvm-config-7 

#install llvmlite
pip3 install llvmlite==0.31.0
pip3 install numba==0.48

 

Inference 시도

 

[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (1757) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error.
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (886) open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
Traceback (most recent call last):
  File "app.py", line 120, in <module>
    main()
  File "app.py", line 66, in main
    stream = fastmot.VideoIO(config.resize_to, args.input_uri, args.output_uri, **vars(config.stream_cfg))
  File "/home/FastMOT/fastmot/videoio.py", line 84, in __init__
    raise RuntimeError('Unable to read video stream')
RuntimeError: Unable to read video stream

디펜던시를 필요 버전으로 설치 하고 inference를 실행 하면 위와 같은 에러가 발생했다.

혹시나 카메라 문제인가 하고  코드에서 카메라 입력을 받아 오는 부분만 따로 때서 아래와 같이 테스트 코드를 만들어 돌려 봤다.

 

import cv2

cam = cv2.VideoCapture("v4l2src device=/dev/video0 ! video/x-raw, width=1920, height=1080, format=YUY2, framerate=5/1 ! videoscale ! video/x-raw, width=1280, height=720 ! videoconvert ! appsink sync=false")

for i in range(2000):
    ret, img = cam.read()
    cv2.imshow('test', img)
    if cv2.waitKey(1) == 27:
        break
~

이것도 에러가 발생한다.

[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (711) open OpenCV | GStreamer warning: Error opening bin: no element "4l2src"
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
Traceback (most recent call last):
  File "../show.py", line 10, in <module>
    cv2.imshow('test', img)
cv2.error: OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/highgui/src/window.cpp:352: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'

첫 번째 에러 솔루션

웬지 카메라 입력 받아 오는 부분이 문제인거 같아  아래 처럼 카메라 스펙을 확인해 봤다.

$v4l2-ctl -d /dev/video0 --list-formats-ext

	Index       : 1
	Type        : Video Capture
	Pixel Format: 'YUYV'
	Name        : YUYV 4:2:2
		Size: Discrete 1280x720
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x480
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)
		Size: Discrete 640x360
			Interval: Discrete 0.033s (30.000 fps)
			Interval: Discrete 0.040s (25.000 fps)
			Interval: Discrete 0.050s (20.000 fps)
			Interval: Discrete 0.067s (15.000 fps)
			Interval: Discrete 0.100s (10.000 fps)
			Interval: Discrete 0.200s (5.000 fps)

코드에서 요구하는 건 1920x1080 resolution인데 내 카메라는 그 사이즈를 지원하지 않는다.

그래서 아래 처럼 resolution을 1280x720, framerate 5/1 로 바꿧더니 에러가 해결 됐다.

cam = cv2.VideoCapture("v4l2src device=/dev/video0 ! video/x-raw, width=1280, height=720, format=YUY2, framerate=5/1 ! videoscale ! video/x-raw, width=1280, height=720 ! videoconvert ! appsink sync=false")

 

그래서 cfg/mot.json 파일에서 input stream resolution을 변경했다.

아래는 변경된 mot.json (configuration file)이다.

 

 

이후 아래와 같이 래퍼런스를 돌렸다.

python3 app.py --input-uri /dev/video0 --mot

아래와 같은 에러가 발생했다.

하지만 이건 문제가 아니다. chrome을 켜놓고 있었는데 tab을 전부 다 닫으니 이 문제는 안생긴다.

크롬을 닫고 실행 하면 에러 및 워닝 메시지가 출력되고

4분 쯤 모델 로딩 하는 시간이 걸리지만 뭔가 실행되고 있는 것같은 메시지가 아래 화면 처럼 나온다.

하지만 결과가 시각화 되지 않는다.

시각 화를 위해 아래와 같이 option을 추가 했다.

python3 app.py --input-uri /dev/video0 --mot --show

그랬더니 아래 화면 처럼 이라는 에러가 발생한다.

원인 파악 하고 고칠 시간이 없어 여기 까지만 확인하고 아직 고쳐서 돌려 보진 못했다.

 

LLVM ERROR: Unable to allocate memory for common symbols!

+ Recent posts