> ## Content Index
> Fetch the complete content index at: https://www.popit.kr/llms.txt
> Use this file to discover other available public pages before exploring further.

# Torch와 OpenCV를 활용한 실시간 이미지 분류 데모
- URL: https://www.popit.kr/realtime-image-classification-torch-opencv/
- Published: 2017-02-20T15:05:39.000Z
- Updated: 2017-02-20T15:20:34.000Z
- Author: 송 준이
- Tags: #소프트웨어, #해외글 요약, #데이터분석, deeplearning, torch, opencv

작년 비젼랩스(VisionLabs)는 딥러닝 프레임워크인 Torch와 이미지 처리 라이브러리인 OpenCV를 결합하여 만든 [torch-opencv](https://github.com/VisionLabs/torch-opencv?ref=popit.kr)를 공개했다. Sergey Zagoruyko는 [torch-opencv](https://github.com/VisionLabs/torch-opencv?ref=popit.kr)을 이용한 몇가지 데모를 [torch-opencv-demos](https://github.com/szagoruyko/torch-opencv-demos?ref=popit.kr#torch7-opencv-demos)에서 소개했다. 이 글에서는 이 중에서 "이미지넷 분류 모델을 사용한 개체 식별"과 "성별/나이 분류 모델을 사용한 성별과 나이 식별", 그리고 안드레이 카패시(Andrej Karpathy)가 만든 "[NeuralTalk2](https://github.com/karpathy/neuraltalk2?ref=popit.kr) 기반의 이미지 캡션 생성"에 대해 소개한다. 

## 데모 보기

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

### 이미지넷 분류 데모

[](https://youtu.be/E2d6ey2G278?ref=popit.kr)

그림. 이미지넷 분류 데모([https://youtu.be/E2d6ey2G278](https://youtu.be/E2d6ey2G278?ref=popit.kr))

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

### 성별/나이 예측 데모

![torch_opencv_demo_featured](https://www.popit.kr/content/images/wp/2017/02/torch_opencv_demo_featured-600x390.png)

그림. 성별/나이 예측 데모([https://youtu.be/PXyOdeEoxdo](https://youtu.be/PXyOdeEoxdo?ref=popit.kr))

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

### NeuralTalk2 이미지 캡션 생성 데모

![Screen Shot 2017-02-19 at 3.48.54 PM](https://www.popit.kr/content/images/wp/2017/02/Screen-Shot-2017-02-19-at-3.48.54-PM-600x472.png)

그림. NeuralTalk2 이미지 캡션 데모([https://youtu.be/fSwJEcQmkak](https://youtu.be/fSwJEcQmkak?ref=popit.kr))

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

## 설치하기

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

### OpenCV 설치하기

먼저 OpenCV를 설치한다.

```sh
$ brew instal opencv3 --with-contrib
```

### Torch 설치하기

Torch를 설치한다. 루아 인터프리터인 LuaJit과 의존 라이브러리와 주요 Torch 패키지가 모두 포함된 배포 버전인 [torch/distro](https://github.com/torch/distro?ref=popit.kr)를 이용하여 설치한다. 먼저 [torch/distro](https://github.com/torch/distro?ref=popit.kr) 레파지토리를 로컬로 클론한다.

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

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

```sh
$ cd distro
$ bash install-deps

```

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

```sh
$ ./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
```

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

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

$ source ~/.profile
```

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

```sh
./test.sh
```

### Torch-OpenCV 설치하기

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

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

### 추가로 설치하기

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

```sh
$ brew install protobuf

$ luarocks install loadcaffe

```

### 데모 레파지토리 설치하기

[torch-opencv-demos](https://github.com/szagoruyko/torch-opencv-demos?ref=popit.kr#torch7-opencv-demos) 데모 레파지토리도 로컬로 클론한다.

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

## 실행하기

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

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

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

```sh
$ cd imagenet_classification/
```

### 

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

```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}
```

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

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

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

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

```sh
$ cd age_gender/
```

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

```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 명령을 사용한다. 만약 아래와 같이 데모를 실행할 때 에러가 발생한다면,

```sh
$ 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 데이터베이스를 생성한 후 재실행한다. 시간이 조금 걸린다.

```sh
$ 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](https://github.com/karpathy/neuraltalk2/issues/123?ref=popit.kr)에서 찾아볼 수 있다. 데모를 실행하려면 hdf5 1.8 버전을 설치하도록 한다. 그리고 brew switch 명령을 이용해서 hdf5에 심볼릭 링크를 생성한다.

```sh
$ brew search hdf5
homebrew/science/hdf5                                                                                    homebrew/science/hdf5@1.8

$ brew install homebrew/science/hdf5@1.8

$ 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 패키지를 설치한다.

```sh
$ luarocks install hdf5
```

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

```sh
$ 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](https://github.com/karpathy/neuraltalk2?ref=popit.kr)를 로컬로 클론한다.

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

$ cd neuraltalk2
```

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

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

$ unzip checkpoint_v1_cpu.zip
```

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

```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 옵션을 추가한다.

```sh
$  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](https://research.googleblog.com/2016/09/show-and-tell-image-captioning-open.html?ref=popit.kr)에서 찾아볼 수 있다. 

## 참고자료

- [Github: torch-opencv](https://github.com/VisionLabs/torch-opencv?ref=popit.kr)
- [Deep Fun with OpenCV and Torch](http://torch.ch/blog/2016/06/01/deep-fun-with-opencv.html?ref=popit.kr)
- [Github: torch-opencv-demos](https://github.com/szagoruyko/torch-opencv-demos?ref=popit.kr#torch7-opencv-demos)
- [Github: neuraltalk2](https://github.com/karpathy/neuraltalk2?ref=popit.kr)
- [Github: torch/distro](https://github.com/torch/distro?ref=popit.kr)
- [\[OS X\] xphoto issue #159](https://github.com/VisionLabs/torch-opencv/issues/159?ref=popit.kr)
- [Error: unable to locate HDF5 header file at hdf5.h](https://github.com/karpathy/neuraltalk2/issues/123?ref=popit.kr)
- [Show and Tell: image captioning open sourced in TensorFlow](https://research.googleblog.com/2016/09/show-and-tell-image-captioning-open.html?ref=popit.kr)