이전에 만든 도커 이미지에서 usbcamera로 영상을 받아 처리하는 프로그램을 만든뒤 실행 파일로 배포 하기 위해 

pyinstaller를 이용하기로 했다. 

 

최종 목표는 '[Jetson nano] docker를 이용한 개발 환경 세팅'에서 만든 컨테이너에서 실행 파일을 만들어 

개발에 필요한 pakage들이 없는 환경에서 프로그램이 실행되도록 만드는 것이다. 

 

실제 배포할 프로젝트의 코드는 좀 크니 여기선 간단히 opencv만 있는 단일 파일을 기준으로 실행파일을 만들어 본다. 

 

아래는 연습용으로 빌드할 스크립트이다. 

import cv2

cam = cv2.VideoCapture(0)
cam.set(3, 640)
cam.set(4, 480)

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

 

빌드

위의 스크립트를 main_cam.py로 저장한 후 아래 명령으로 빌드를 시도 했다.

pyinstaller -w -F main_cam.py

만들어진 파일을 실행 시켜 보니 아래와 같은 opencv 에러가 발생했다. 이런 이슈가 생길거 같아 미리 opencv만 있는 작은 

연습 스크립트로 빌드를 테스트 해본것이다. 

에러의 내용은 cv2를 반복적으로 로드 하는 현상이 발생한다는 것이다. 

Fig 1. Error 캡쳐

디버깅

사실 위 문제가 왜 발생하는지 알아내는데 2일이나 시간을 허비했지만 스스로 원인은 파악하지 못했고

nvidia에 l4t container에서 opencv 응용 프로그램을 pyinstaller로 빌드하려고 하니 위 에러가 발생했다고 

문의 하니 이것은 잘 알려진 버전 문제라고 응답했다. (잘 알려진 문제 치곤 검색해도 해결법이 잘 안나온다..)

 

원인은 pyinstaller 버전과 프로그램에서 사용하는 opencv 버전이 호환 가능하지 않다는 것이다. 

 

솔루션

처음 빌드 하는데 사용한 내 환경은

pyinstaller version: 4.8

opencv 버전은 :4.1.1 (이전 포스트에선 3.2.0을 설치 했는데 문제가 좀 있어서 업그레이드 했다.)

 

아래 링크는 이 문제를 해결하는 방법이 기록된 영문 페이지 이다. 

link:https://elinux.org/Jetson/L4T/TRT_Customized_Example#PyInstaller_with_OpenCV

 

Jetson/L4T/TRT Customized Example - eLinux.org

This page collects information to deploy customized models with TensorRT and some common questions for Jetson. TensorRT Python OpenCV with ONNX model Below is an example to deploy TensorRT from an ONNX model with OpenCV images. Verified environment: import

elinux.org

 

nvidia 측에 따르면 두가지 해결 방법이 있다.

 

 

1. opencv 버전을 업그레이드.  

아래 명령을 이용하라고 한다. (하지만 이건 좀 애매하다 나는 4.5.* 버전의 opencv도 설치해서 이 문제를 해결하려고 시도했지만 같은 문제가 지속적으로 발생해 포기했다.)

 pip3 install opencv-python

2. pyinstaller 와 pyinstaller-hooks-contrib 버전 다운 그레이드

아래 명령을 이용하면 된다. 

pip3 install pyinstaller==4.2
pip3 install pyinstaller-hooks-contrib==2021.2
pyinstaller --onefile --paths="/usr/lib/python3.6/dist-packages/cv2/python-3.6" target.py

나는 두번째 옵션인 pyinstaller 버전 다운 그레이드를 선택했다.

실행 결과 아래와 같이 위 스크립트를 onefile로 빌드해 성공했다. 

Fig 2.실행 성공 화면

 

* pyinstaller 버전마다 자동으로 package import 를 문제 없이 할수 있는 package 버전이 다른 것으로 보인다. 

나도 pyinstaller를 자주 사용하진 않아 이 문제를 정확히 파악하진 못했다. 

다만 혹시 비슷한 문제를 격고 있는 분들은 pyinstaller 와 프로젝트에서 사용하는 package 버전들 간의 호환성 문제는 아닌지 고려해 보고 호환 되는 버전의 pyinstaller를 사용 하면 도움이 될것 같다. 

 

+ Recent posts