Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

prlab 블로그

docker 컨테이너에서 웹캠영상을 디스플레이하는법 본문

스터디흔적/인공지능 및 기계학습

docker 컨테이너에서 웹캠영상을 디스플레이하는법

거녀엉 2020. 8. 24. 10:44

docker 컨테이너가 GUI까지 포함할 경우 오버헤드가 많아 비효율적임.

 

하지만, 딥러닝 또는 영상처리 코드를 작성할 때 이미지를 확인해야할 경우 리눅스의 x 윈도우가 필요함

 

이때, 도커는 로컬환경의 xhost와 컨테이너를 연결하여 로컬 환경의 GUI를 가져다 쓸 수 있음(로컬환경의 웹캠이나 기타 장치도 마찬가지)

 

이때 사용되는 "$ docker run" 명령은 아래와 같음

 

$ docker run -p 8888:8888 --gpus all --privileged --rm -it -v /dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -v /dev/snd:/dev/snd -e="QT_X11_NO_MITSHM=1" -v ~/docker:/data [이미지이름] bash

 

명령어 옵션이 굉장히 많은데 각 옵션은 아래와 같은 역할을 수행

 

-p 8888:8888   ---> 이 옵션은 로컬 포트와 컨테이너 포트를 맵핑하는 코드

 

--gpus all  ---> 이 옵션은 gpu 드라이버를 가져와 사용하는 코드. 또한, 직접해보진 않았지만 "$ docker run --gpus all" 과 "$nvidia-docker run"은 동일한 작업을하는 것으로 생각됨

 

--privileged  ---> 이 옵션은 권한에 대한 옵션인데 자세한것은 아직 모름 

 

--rm    ---> 이 옵션은 컨테이너를 종료할때, 컨테이너를 유휴상태로 전환하는게 아니라 아예 지워버리는 옵션으로 $ docker commit(현재 컨테이너 상태를 저장하는 명령) 여부를 항상 생각해야함.

 

-it    ---> 도커환경에서 인터랙티브한 환경을 제공한다고 하는데 자세한건 모름

 

-v /dev/video0:/dev/video0  ---> 로컬환경의 웹캠(이미징장치) 0번을 도커 환경의 이미징장치 0번으로 맵핑

-v /tmp/.X11-unix:/tmp/.X11-unix    ---> 로컬과 컨테이너의 X윈도우를 서로 연결

-e DISPLAY=unix$DISPLAY  ---> 디스플레이에 필요한 정보를 공유하는것으로 생각됨???

-v /dev/snd:/dev/snd   ---> 아직모르지만, 컨테이너에서 x 윈도우 디스플레이시 필요함

-e="QT_X11_NO_MITSHM=1"     ---> 아직모르지만, 컨테이너에서 x 윈도우 디스플레이시 필요함

 

-v ~/docker:/data   ---> 모든 -v 옵션은 마운트된 하드 주소의 데이터를 공유하기 위한 옵션으로 로컬 ~/docker와 컨테이너 /data를 같은 주소와 같은 데이터를 가지는 하드디스크 메모리가 동시에 마운트됨

 

결과적으로 웹캠에서 영상을 받아 디스플레이할 수 있는 컨테이너를 실행하기 위해선 아래와 같은 명령어가 필요!  포트번호나 몇몇 옵션은 상황에 맞게 변경해야함!

 

 

 

opencv 라이브러리로 테스트할 때 몇몇 에러가 있었음!

 

아마 컨테이너 필요한 라이브러리가 없어서 발생하는 문제로 생각됨 아래 코드로 opencv 재설치 또는 설치하면 해결되는 것을 확인

 

$ apt-get update

$ apt-get -y install libgtk2.0-dev

$ apt-get -y install pkg-config

$ conda remove opencv

$ conda update conda

$ conda install --channel menpo opencv

$ pip install opencv-contrib-python

 

$ apt install libgl1-mesa-glx

 

필요라이브러리 설치가 끝나고 웹캠 영상을 띄웠을때 No protocol specified 에러가 발생할 수 있음. 아래는 웹캠 이미지 띄우는 test용 코드.

만약 No protocol specified 에러가 발생한다면, docker commit으로 현재 컨테이너를 이미지로 저장한 후, 로컬 터미널에서 $ xhost local:root 명령어를 입력하고 저장한 이미지를 아래 명령어로 다시 컨테이너로 활성화하면 해결됨.

 

$ docker run -p 8888:8888 --gpus all --privileged --rm -it -v /dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -v /dev/snd:/dev/snd -e="QT_X11_NO_MITSHM=1" -v ~/docker:/data [저장한 이미지] bash

 

아마도, $ xhost local:root를 통해서 권한 문제로 컨테이너가 디스플레이 안되던 문제가 해결되는 듯함.

 

 

감사하게도 위 정보들을 참고할 수 있었던 곳

https://curioso365.tistory.com/44

https://light-tree.tistory.com/150

https://github.com/jessfraz/dockerfiles/issues/6

Comments