이전 포스팅에서 젯슨 나노 조립을 완료 했고 이번에 할일은 usb 웹캠을 통해 영상을 입력 받고 pytorch를 설치 하는 것이다.
 
내 최종 목표는 만든 응용 프로그램을 도커라이즈 해서 자동 배포 하는 것 이므로
웹캠 영상을 도커 컨태이너 내부에서 받아 사용해야 하고 pytorch 도 컨테이너 내부에 설치 해야 한다.
 
위의 문제를 가장 간단히 해결할 수 있는 방법은 바로 nvidia 에서 제공하는 L4T-pytorch를 사용 하는 것이다.
적어도 내 목적을 이루는 대에는 가장 손쉬운 방법이며 더 복잡한 것을 해야 하는 사람들에게 좋은 출발점이 될것 이다.

 

sudo 없이 도커사용

가장 먼저 한일은 sudo 명령 없이 도커를 사용하기 위해 docker group에 user를 포함시키는 일이다.
nvidia에서 제공하는 jetson nano os 를 설치 하고 나면 기본적으로 docker는 설치 되어있지만
user를 자동으로 docker그룹에 포함시지는 않는다.
 
그래서 아래 명령을 이용해 사용자를 docker group에 할당한다.

 

 sudo usermod -aG docker $USER

그리고 로그아웃 후 재 로그인 해주면 docker 명령을 sudo 명령 없이 사용할 수 있다.
 
다음으로 swap memory를 4GB 늘리는 작업이다.(일단 4GB로 했는데 opencv 4.5 설치시 6GB이상으로 늘려야 한다고 한다...)
 아래의 swap 메모리 설정은 nvidia에서 제공하는 tutorial을 참고 해 작성했다.
 
link : nvidia jetson nano tutorial

Jetson AI Courses and Certification

Jetson AI Courses and Certifications NVIDIA’s Deep Learning Institute (DLI) delivers practical, hands-on training and certification in AI at the edge for developers, educators, students, and lifelong learners. This is a great way to get the critical AI s

developer.nvidia.com

우선 swap 메모리를 4GB 할당하는 파일을 만든다. (혹 swap 메모리가 뭔지 모르는 독자는 os 와 관련된 내용을 아주 약간이나마 공부해 두면 이런거 이해하기가 편하다...)

sudo systemctl disable nvzramconfig
sudo fallocate -l 4G /mnt/4GB.swap
sudo chmod 600 /mnt/4GB.swap
sudo mkswap /mnt/4GB.swap

그리고 만들어진 swap 설정을 boot시 로드하기 위해 /etc/fstab에 적용한다.

sudo vim /etc/fstab

vim으로 연 /etc/fstab 파일의 맨 아래 줄에 다음을 추가 한 후 저장한다.

/mnt/4GB.swap            swap                     swap           defaults                                     0 0

바뀐 설정을 로드 하고 (그냥 재부팅 해도 된다.) swap 용량을 확인하기 위해 아래 명령을 이용한다.

free -m

아래와 같이 swap size가 바뀐걸 확인할 수 있다.

swap 메모리 용량 확인

적절한 docker image 다운 받기

다음으로 할 일은 자신의 목적에 맞는 적절한 도커 이미지를 다운 받는 일이다.
나는 torch1.8, torchvision, opencv가 기본적으로 필요하다. docker file을 만들어 필요한걸 일일이 설치 할 수도 있지만
시간 절약과 효율성을 위해서 nvidia에서 제공하는 L4T image 를 사용하기로 했다.
아래 링크를 타고 들어가면 jetson nano에서 사용가능한 pytorch, torchvision등을 포함해 생성된 이미지를 다운받을 수 있다.
 
link:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch

NVIDIA L4T PyTorch | NVIDIA NGC

PyTorch is a GPU accelerated tensor computational framework with a Python front end. This container contains PyTorch and torchvision pre-installed in a Python 3.6 environment to get up & running quickly with PyTorch on Jetson.

catalog.ngc.nvidia.com

내가 다운 받은 버전은 아래 버전이다. 내 목적에 부합해서 받은 것 뿐 각자 자기의 목적에 맞는 버전을 받으면 된다.
 

  • l4t-pytorch:r32.6.1-pth1.8-py3
    • PyTorch v1.8.0
    • torchvision v0.9.0
    • torchaudio v0.8.0

아래 명령을 통해 이미지를 다운 받을 수 있다.

docker pull nvcr.io/nvidia/l4t-pytorch:r32.6.1-pth1.8-py3

 

이미지를 다운 받고 컨테이너를 실행해 잘 동작하는지 확인해 보자.
container 실행 명령은 다음과 같다. 

docker run -it --rm --runtime nvidia --network host --privileged -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /dev:/dev nvcr.io/nvidia/l4t-pytorch:r32.6.1-pth1.8-py3

 
 

docker conatiner 에서 usb cam 영상 읽기

다운 받은 컨테이너에서 cv2.VideoCapture()를 이용해 usb영상을 읽으려 했으나 아래와 같은 문제가 발생했다.

AttributeError: module 'cv2' has no attribute 'VideoCapture'

그래서 이게 뭔일인가 하고 cv2.__path__ 로 모듈 경로를 확인해 해당 폴더를 확인해 보니 거기엔 아무 것도 없었다.
왜 없는 건지 모르겠지만 깨끗하게 단하나의 파일도 없었다. 그래서  아래 명령을 통해 opencv 를 설치 했다.
 

apt update 
apt-get install python3-opencv

상기 명시된 컨테이너에서 위 명령으로 설치한 opencv 버전은 '3.2.0'이다.
 
그리고 미리 만든 show.py란 파일을 실행시켜 카메라 동작을 확인했다.
아래는 show.py의 내용이다.

import cv2

if __name__=='__main__':
	cam =cv2.VideoCapture(0)
    if cam.isOpened():
        cam.set(cv2.CAP_PROP_FRAME_WIDTH, 640) #영상 width 설정
        cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) #영상 height 설정
        while True:
        	ret, img =cam.read() #영상 읽기
            cv2.imshow('img', img)
            if cv2.waitKey(1) == 27 : #esc 누르면 종료
            	break

아래 사진은 위 스크립트 실행시 나타나는 usb camera 영상이다.
영상은 잘 나오지만 맘에 안드는 것은 터미널에 지속적으로 뜨는 'currupt JPEG data:~~' 라는 warning 들이다.
다음 검색을 좀 해보니 opencv설치 시 함께 설치 되는 필요 libary와 관련된 버그 라고 하는데
다음엔 최신 버전인 opencv 4.5 설치 해보고 이문제 가 사라지는지 확인해봐야겠다. (opencv4.5 는 필요해서 설치하는 것이다... 이 문제를 해결할 기 위해 설치하는건 아니다..)

 

container 내에서 usb camera 입력 확인 영상

 

+ Recent posts