해결된 질문
작성
·
1K
0
안녕하세요
OpenCV DNN으로 Faster RCNN Object Detectoin 실습 02를 수강하고 있습니다.
환경은, 저는 구글클라우드를 사용하지 않고, 아래 링크에 따라 제 데스크탑에 우분투를 설치하여 Deepo 도커를 이용한 GPU 서버로 만든 뒤 SSH 및 주피터랩을 통해 강의를 듣고있습니다. 우분투 데스크탑을 GPU 서버로, 맥북프로를 SSH 클라이언트로 삼아 강의와 거의 유사한 환경을 구축하여 실습하고 있습니다.
https://eungbean.github.io/2019/11/11/Docker-for-ai/
성공적으로 작동하고 있고, 실제로 위처럼 사진 예시는 잘 검출해냈습니다.
그런데, 동영상의 경우 2 가지 문제가 발생했습니다.
1. Video('경로명') 으로 동영상이 주피터에서 재생되는 것으로 보아, 동영상을 추출까지는 하는 것 같은데, 정작 RCNN을 돌리기 위해 프레임을 따면 0프레임짜리 동영상이라는 응답만 나옵니다. 따라서 while문을 돌지 못하고 바로 종료해버립니다. 무엇이 문제일지 모르겠습니다. 여러 함수가 있다보니, codec 함수가 문제인지 cap.get 메서드가 문제인지, 아니면 VideoWriter 메서드가 문제인지, 어떤 요인이 frame_cnt를 0으로 만들었는지 잘 모르겠습니다.
2. 저는 구글클라우드를 쓰지 않다보니, gsuite 명령어를 쓸 수 없습니다. 따라서 동영상의 경우, 어떻게 결과물을 저장해야할지 모르겠습니다. 그리고, 사실 사진의 경우도 마찬가지인게 Jupyter 상에서 output 을 공시하는건 가능한데, 어떻게 GPU 서버 원격 디렉토리에 저장해야할지 모르겠습니다. 어떻게 하면 Ubuntu 터미널에서 gsuite 명령어와 같은 효과를 내는 명령을 내릴 수 있을까요?
감사합니다.
답변 8
0
0
1. 네 맞습니다. 상대경로로 하면 Video() 자체는 재생되는데, cv2.VideoCapture(상대경로) 하면 frame 이 0이 나옵니다.
2. 절대경로로 하면 Video() 도 재생이 안되고, cv2.VideoCapture(절대경로) 또한 frame 이 0이 나옵니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
문제 해결했습니다.
도커가 독립환경이다보니까, 호스트에 있는 코덱파일이라도 도커 이미지 내부에 따로 비디오 디코더가 포함되어있지 않으면 동영상을 해석할 수 없는 문제가 있을거라고 예상했고,
이에 docker exec -it lab '각종 명령어'
를 서버 로컬 터미널에 입력하여 터미널을 통해 컨테이너에 이런저런 코덱 디코더를 깔았습니다. 그 뒤, 확인해보니 영상처리가 제대로 되었음을 확인할 수 있었습니다.
설치한 디코더 관련 파일은 ubuntu_restricted_extras, ffmpeg, libdvd 입니다. 그 뒤, sudo apt-update 를 exec 를 통해 실행시켰고
하루 자고 다시 reboot 시켜 실행해보니 제대로 작동했습니다.
절대경로 상대경로 동영상 재생문제 자체는 코덱문제가 아닌 것 같은데, 브라우저 문제인가 의심됩니다. 하지만 주피터에서 정상적으로 도커에 있는 동영상 파일을 읽어들이니, 큰 문제가 아닙니다.
정말 감사합니다!
0
뭔가 디렉토리 문제인것 같습니다.
제가 DOCKER를 잘 몰라서요.
1. 일단은 상대 경로로 하면 Video()는 나오는데, cv2.VideoCapture(상대경로)는 frame 0이 나온다는 건가요?
2. 절대 경로로 하면 Video(절대 경로)도 안되고 cv2.VideoCapture(절대경로)도 안된다는 건가요?
3. 1, 2 번 모두 cv2.VideoCapture()가 안되면 docker환경에서 cv2.VideoCapture()를 어떻게 가능하게 할수 있는 방법이 필요할것 같습니다만, 문제를 단순하게 하기 위해서 먼저 특정 파일을 가져다 놓고 상대경로/절대경로에서 cv2.VideoCapture()가 어떻게 동작하는지 확인해 주실 수 있을지요?
감사합니다.
0
아, 혼란을 드린 것 같습니다.
우선 도커라서 /home 이 최상위 디렉토리가 아니라, /data 가 최상위 디렉토리로 되어있습니다.
/data/DLCV/data/video/John_Wick_small.mp4 에도 영상파일이 있고, 혹시 보안적으로 jupyter에서 home으로 가는게 안되는건가 싶어서 /data/DLCV/Detection/fast_rcnn 디렉토리에도 John_Wick_small.mp4 를 똑같이복사한 것입니다.
일단 말씀하신대로 절대경로를 확인했고, 절대경로로 동영상에 접근했을 때는 "지원되는 형식 및 MIME 유형의 동영상을 찾을 수 없습니다" 라고 하며 재생이 되지 않았습니다.
그런데 이상하게, 상대경로로 동영상에 접근했을 때는 동영상이 재생이 되는 결과를 얻을 수 있었습니다.
절대경로를 잘못 입력한 것이 아닌가 하는 의심을 할 수밖에 없었지만, 절대경로를 잘못 입력하면
ValueErrorTraceback (most recent call last) <ipython-input-52-77a40a07ef19> in <module> 1 get_ipython().system('pwd') ----> 2 Video('/data/data/video/John_Wick_small.mp4') # 도커 내부의 상대경로 /usr/local/lib/python3.6/dist-packages/IPython/core/display.py in __init__(self, data, url, filename, embed, mimetype, width, height) 1372 "Consider passing Video(url='...')", 1373 ]) -> 1374 raise ValueError(msg) 1375 1376 self.mimetype = mimetype ValueError: To embed videos, you must pass embed=True (this may make your notebook files huge) Consider passing Video(url='...')라는 에러가 나오게 되어있으므로, 절대경로 자체는 맞는 것 같습니다.
0
cv2.VideoCapture('John_Wick_small.mp4')라고 해주셨는데 현재 주피터 노트북이 있는 디렉토리에 'John_Wick_small.mp4' 파일이 있는 건가요?
1. 아니라면 cv2.VideoCapture()에 인자로 파일의 절대경로를 아래와 같이 넣어주시고 다시 한번 확인 부탁드립니다.
cv2.VideoCapture('/home/사용자명/DLCV/data/video/John_Wick_small.mp4')
2. /home/사용자명/DLCV/data/video 디렉토리 밑에 mp4 파일이 다른 여러개가 있습니다. 해당 파일로 바꿔서 cv2.VideoCapture('/home/사용자명/DLCV/data/video/다른파일명.mp4') 실행이 되는지 확인 부탁드립니다.
감사합니다.
0
cv2.CAP_PROP_FRAME_폭/높이 는 3,4를 제대로 반환하는데
cap.get(cv2.CAP_PROP_FRAME_폭/높이) 단계에서 항상 0이 나오는 것을 확인할 수 있었습니다.
구글링으로 if not raise Exception 문을 활용해보라는 말이 있어서, isOpened() 여부를 체크해봤는데, Exception 이 떴습니다.
생각을 해보니, 제가 지금 도커 컨테이너를 통해 기계학습을 돌리고 있는데, root 계정에 mp4 코덱을 apt-get 시켜봤자 도커 컨테이너는 독립적이니까 정작 주피터 노트북은 당연히 영향을 전혀 받지 않는게 아닌가, 이런 의심이 듭니다.
0
1. 말씀대로 우분투 데스크탑에 마우스를 연결해서, 동영상이 제대로 된 파일인지 확인을 해보았습니다.
~/DLCV/data/video 에서 John_Wick_small.mp4 파일의 용량은 1.8MB로 멀쩡했습니다만, 우분투에 기본적으로 깔린 video 플레이어가 먹통인지, 재생이 되지 않았습니다.
우분투에서 동영상이 재생되지 않는 점이 영 미심쩍어 좀 더 파고들어봤더니, 이런 에러가 나왔습니다.
우분투에서 자체적으로 MPEG-4 AAC 디코더를 가지고 있지 않아 영상을 재생할 수 없다는 내용이었는데, 매우 유력하게 이 것이 원인이 아닌가 생각되었습니다. 그래서 AAC 디코더를 설치했고, 동영상이 제대로 돌아가는걸 확인했지만 여전히 0프레임이 찍힙니다.
그럼 코덱이 문제가 아니라는건데, 다른 어떤 원인이 있을 수 있을지 짚이는 점이 있으신가요?
2. 0 프레임이 나오는 문제를 해결하면, 동영상이 ~/DLCV/data/output 디렉토리에 들어가있는 것을 확인할 수 있을 것 같습니다.
이미지의 경우, cv2.imwrite('파일명',이미지배열) 로 저장가능함을 확인했습니다. 감사합니다!
0
안녕하십니까,
1. 특이한 경우군요.
주피터에서 파일이 재생되는 것을 보면 경로를 잘못 치신것은 아닌것 같습니다만, 그래도 한번 더 확인 부탁드립니다.
OS 에 들어가셔서, ~/DLCV/data/video 로 가셔서 해당 파일의 크기를 확인 부탁드립니다.
다른 코드 다 빼고,아래만 실행해서 결과 확인 부탁드립니다.
cap = cv2.VideoCapture('직접 디렉토리 절대 경로명 입력')
print(cap.get(cv2.CAP_PROP_FRAME_COUNT))
2. 동영상 저장의 경우는 ~/DLCV/data/output 디렉토리에 video_output_path 명으로 동영상 파일이 저장됩니다. mac 용 sftp를 이용하여 ubuntu 서버에 접속하여 해당 파일을 download 받으시면 됩니다.
이미지 저장의 경우 이미지 배열을 cv2.save('저장하려는 파일명', 이미지배열) 을 이용하여 원하는 디렉토리에 파일로 저장이 가능합니다.
감사합니다.