Torch-opencv

torch
opencv
machinelearning

#1

작년 비젼랩스(VisionLabs)는 딥러닝 프레임워크인 Torch와 이미지 처리 라이브러리인 OpenCV를 결합하여 만든 torch-opencv를 공개했다. Sergey Zagoruyko는 torch-opencv을 이용한 몇가지 데모를 torch-opencv-demos에서 소개했다.

이 글에서는 이 중에서 “이미지넷 분류 모델을 사용한 개체 식별”과 “성별/나이 분류 모델을 사용한 성별과 나이 식별”, 그리고 안드레이 카패시(Andrej Karpathy)가 만든 “NeuralTalk2 기반의 이미지 캡션 생성”에 대해 소개한다.

데모 보기

먼저 내가 실행하여 녹화해둔 데모를 먼저 살펴본다. 이렇게 개인의 얼굴이 인터넷에 떠도는 것이 마음이 편치는 않다.

이미지넷 분류 데모

Screen Shot 2017-02-19 at 3.42.42 PM

그림. 이미지넷 분류 데모(https://youtu.be/E2d6ey2G278)

이미지넷 분류 데모에서는 카메라에 보이는 개체 중 정확도가 가장 높은 상위 5개의 물건의 이름을 좌측 상단에 표시한다.

성별/나이 예측 데모

torch_opencv_demo_featured

그림. 성별/나이 예측 데모(https://youtu.be/PXyOdeEoxdo)

성별/나에 예측 데모에서는 카메라에 보이는 사람들의 얼굴 영역을 포착하고, 성별과 나이를 예측하여 표시한다.

NeuralTalk2 이미지 캡션 생성 데모

Screen Shot 2017-02-19 at 3.48.54 PM

그림. NeuralTalk2 이미지 캡션 데모(https://youtu.be/fSwJEcQmkak)

NeuralTalk2 데모에서는 카메라에 보이는 영상 프레임을 설명하는 캡션을 좌측 상단에 표시한다.

설치하기

이제 실제로 데모를 실행해보기 위한 환경을 구성하자. torch-opencv는 Torch와 OpenCV를 결합한 것이므로 Torch와 OpenCV를 각각 설치해야 한다 그리고 데모 레파지토리인 torch-opencv-demos를 다운받는다. 각 데모별로 추가로 설치해야 하는 라이브러리가 있으며, 이는 해당 데모를 실행할 때 설명한다. 설치 방법은 맥 OSX를 기준으로 한다.

OpenCV 설치하기

먼저 OpenCV를 설치한다.

$ brew instal opencv3 --with-contrib

Torch 설치하기

Torch를 설치한다. 루아 인터프리터인 LuaJit과 의존 라이브러리와 주요 Torch 패키지가 모두 포함된 배포 버전인 torch/distro를 이용하여 설치한다. 먼저 torch/distro 레파지토리를 로컬로 클론한다.

$ git clone https://github.com/torch/distro.git

의존성 라이브러리를 설치한다. 시간이 조금 걸린다.

$ cd distro $ bash install-deps

마지막으로 Torch를 설치한다.

$ ./install.sh … Not updating your shell profile. You might want to add the following lines to your shell profile: . /Users/socurites/Git/Torch/distro/install/bin/torch-activate

설치가 끝나면 쉘 프로필 파일을 열어 아래를 추가한다.

$ vi ~/.profile . /Users/socurites/Git/Torch/distro/install/bin/torch-activate

$ source ~/.profile

정상적으로 설치가 되었는지 테스트해본다.

./test.sh

Torch-OpenCV 설치하기

torch-opencv 패키지를 설치한다. 설치할 때 OpenCV가 설치된 경로를 지정해줘야 한다. 또한 현재 OpenCV 버전은 3.2.0이며, xphoto 바인딩은 3.1.0 버전에서만 존재하므로 xphoto는 바인딩하지 않도록 추가로 설정한다. 관련 이슈는 [OS X] xphoto issue #159에서 살펴볼 수 있다.

$ OpenCV_DIR=/usr/local/Cellar/opencv3/3.2.0/share/OpenCV DONT_WRAP=xphoto luarocks install cv

추가로 설치하기

학습된 성별/나이 예측 모델은 카페(Caffe) 모델이므로 Torch에서 사용할 수 있도록 loadcaffe 패키지를 추가로 설치한다.

$ brew install protobuf $ luarocks install loadcaffe

데모 레파지토리 설치하기

torch-opencv-demos 데모 레파지토리도 로컬로 클론한다.

$ git clone https://github.com/szagoruyko/torch-opencv-demos.git

실행하기

이제 데모 레파지토리로 이동하여, 각 데모를 실행해 본다.

이미지넷 분류 데모 실행하기

이미지넷 분류 데모 디렉토리로 이동하면, 데모 프로그램인 demo.lua 파일이 존재한다.

$ cd imagenet_classification/

demo.lua를 열어서 아래와 같이 원본 코드를 주석 처리하고, 코드를 약간 수정한다.

--local _, frame = cap:read{}
local ok, frame = cap:read{}
 
...
 
--while true do
while ok do
 
...
 
--if cv.waitKey{30} >= 0 then break end
--cap:read{image=frame}
cv.waitKey{30}
ok = cap:read{image=frame}

수정된 코드를 저장한 후, 실행한다. 최초 실행시에는 모델을 네트워크를 통해 다운로드하는데 시간이 걸릴 수 있다.

$ th demo.lua 
==> Downloading image and network  
==> Loading network

성별/나이 예측 데모 실행하기

성별/나이 예측 데모 디렉토리로 이동한다.

$ cd age_gender/

demo.lua를 열어서 아래와 같이 원본 코드를 주석 처리하고, 코드를 약간 수정한다.

--while true do
while ok do
 
...
 
--ok = cap:read{frame}
--if cv.waitKey{1} >= 0 or not ok then break end
cv.waitKey{20}
ok = cap:read{frame}

얼굴 영역을 식별하는 데는 OpenCV의 haar-cascade 모델을 사용한다. 해당 모델 파일은 OpenCV 설치 디렉토리 하위에 위치한다(/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/). 이 데모에서는 이 중에서도 haarcascade_frontalface_default.xml를 사용한다.

데모 프로그램에서는 이 파일의 경로를 찾는데 locate 명령을 사용한다. 만약 아래와 같이 데모를 실행할 때 에러가 발생한다면,

$ th demo.lua camera
 
Looking for haarcascades/haarcascade_frontalface_default.xml...
 
WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:
 
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

locate 데이터베이스를 생성한 후 재실행한다. 시간이 조금 걸린다.

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

마찬가지로 데모를 최초로 실행할 때는 모델을 네트워크를 통해 다운로드하는데 시간이 걸릴 수 있다.

NeuralTalk2 이미지 캡션 생성 데모 실행하기

NeuralTalk2 데모를 실행하려면 hdf5 라이브러리와 Torch hdf5 패키지를 설치해야 한다. 주의할 점은 최신 버전은 hdf5 1.10 버전을 설치하면 데모가 정상적으로 실행되지 않는다. 관련 이슈는 Error: unable to locate HDF5 header file at hdf5.h에서 찾아볼 수 있다.

데모를 실행하려면 hdf5 1.8 버전을 설치하도록 한다. 그리고 brew switch 명령을 이용해서 hdf5에 심볼릭 링크를 생성한다.

Shell

$ brew search hdf5
homebrew/science/hdf5                                                                                    homebrew/science/[email protected]
 
 
$ brew install homebrew/science/[email protected]
 
$ cd /usr/local/Cellar/
 
$ mv hdf5\@1.8/ hdf5
 
$ brew switch hdf5 1.8.18
Cleaning /usr/local/Cellar/hdf5/1.8.18
107 links created for /usr/local/Cellar/hdf5/1.8.18

루아 hdf5 패키지를 설치한다.

$ luarocks install hdf5

그리고 앞에서 Torch 배포판을 이용해서 설치한 루아 디렉토리의 hdf5 패키지에 hdf5 헤더 디렉토리의 위치를 설정한다.

$ vi /Users/socurites/Git/Torch/distro/install/share/lua/5.1/hdf5/hdf5._config
 
hdf5._config = {
  HDF5_INCLUDE_PATH = "/usr/local/Cellar/hdf5/1.8.18/include",
  HDF5_LIBRARIES = "/usr/local/lib/libhdf5.dylib;/usr/local/lib/libsz.dylib;/usr/lib/libz.dylib;/usr/lib/libdl.dylib;/usr/lib/libm.dylib"
}

NeuralTalk2 데모 레파지토리 neuraltalk2를 로컬로 클론한다.

$ git clone https://github.com/karpathy/neuraltalk2.git

$ cd neuraltalk2

그리고 학습된 모델을 다운로드한다. 내 머신에서는 CPU를 사용하므로 CPU 체코포인트를 다운로드 한다. 용량이 크니, 차분히 다른 볼일을 본다.

$ wget http://cs.stanford.edu/people/karpathy/neuraltalk2/checkpoint_v1_cpu.zip

$ unzip checkpoint_v1_cpu.zip

데모 프로그램인 videocaptioning.lua 파일을 열어서 아래 부분을 수정한다.

--local ok, frame = cap:read{}
--while loop 앞부분으로 이동함.
 
...
 
--while true do
local ok, frame = cap:read{}
while ok do
 
...
 
--if cv.waitKey{30} >= 0 then break end
--cap:read{image=frame}
cv.waitKey{30}
ok = cap:read{image=frame}

데모를 실행한다. CPU를 사용하므로 -gpuid -1 옵션을 추가한다.

$ th videocaptioning.lua -gpuid -1 -model ~/Downloads/model_id1-501-1448236541.t7_cpu.t7

현재는

이 데모가 만들어진 시점 이후로 1년 가까이 지났고, 그 동안 관련 모델은 계속해서 발전했고 또 공개되었다. 이미지 캡션 모델은 구글이 작년 10월 텐서플로우(TensorFlow) 모델을 공개했으며 Show and Tell: image captioning open sourced in TensorFlow에서 찾아볼 수 있다.

참고자료

Github: torch-opencv Deep Fun with OpenCV and Torch Github: torch-opencv-demos Github: neuraltalk2 Github: torch/distro [OS X] xphoto issue #159](https://github.com/VisionLabs/torch-opencv/issues/159) Error: unable to locate HDF5 header file at hdf5.h](https://github.com/karpathy/neuraltalk2/issues/123) Show and Tell: image captioning open sourced in TensorFlow](https://research.googleblog.com/2016/09/show-and-tell-image-captioning-open.html)