2019-02-25 14:40:37

CNN과 같은 딥러닝 알고리즘을 구동하기에는 개인적으로 파이썬이 가장 좋다고 생각하지만, 파이썬에 익숙치 않고 매틀랩만 다룰 수 있는 사람이라면 매틀랩용 CNN 라이브러리인 MatConvNet을 사용하기 추천한다. 먼저 어떻게 설치하는지 설명한 다음에 설치가 잘 되었는지 확인하는 순으로 글을 작성하려고 한다. 

 

Matlab용 CNN 라이브러리 MatConvNet 설치하기 

나는 다음과 같은 환경에서 MatConvNet을 설치했다.

win10 + visual studio 2015 + Matlab 2018b + CUDA 8.0 + cuDNN 5.1

 

MatConvNet의 가장 최신 버전인 matconvnet-1.0-beta25는 여기서 다운로드 받을 수 있다. 

=> http://www.vlfeat.org/matconvnet/


Visual studio 2015(visual studio community 2015 with Update 3)는 여기서 다운로드 받을 수 있다. 

=> https://my.visualstudio.com/Downloads?q=visual%20studio%202015&wt.mc_id=o~msft~vscom~older-downloads

또한 CUDA 8.0을 다운로드 후 설치한다. 

=> https://developer.nvidia.com/cuda-toolkit-archive

그 다음에는 CUDA 8.0과 매칭되는 cuDNN 5.1을 설치한다. cuDNN 5.1은 여기서 다운로드 받을 수 있다. 

=> https://developer.nvidia.com/rdp/cudnn-archive

다운로드 후에는 압축을 풀고 matconvnet-1.0-beta25 디렉터리 아래에 local이라는 폴더를 하나 만들고 거기에 cudnn-8.0을 갖다 놓는다. 그리고 local/cudnn-8.0/bin 디렉터리 안에 있는 cudnn64_5.dll을 matlab/mex 디렉터리 안에 복사해 넣는다. 

참고로 matlab에 matlab 툴박스 중의 하나인 parallel computing toolbox가 설치되어 있어야만 GPU 버전의 MatConvNet을 사용할 수 있다. 물론 없어도 CPU 버전은 사용가능하다. 

=> https://secure.csse.uwa.edu.au/run/help4402?p=np&a=13

자 이제 준비는 모두 끝났고, CPU 버전과 GPU 버전을 각각 컴파일한 후 잘 작동하는지 확인해보자.   

 

CPU 버전 컴파일 및 실행

CPU 버전을 컴파일해주기 위해서는 다음과 같은 코드를 matlab 명령창에 타이핑해줘야한다. 

 

cd matconvnet-1.0-beta25
addpath matlab
vl_compilenn

 

컴파일에 성공했다면, 미리 훈련된 이미지 분류용 CNN을 읽어들여, 하나의 이미지에 대해 분류를 시켜보자. 코드는 다음과 같다. 먼저 imagenet에 훈련된 vgg-f 모델을 다운로드 받는 것부터 시작되어 vgg-f 모델을 불러들인 후 peppers.png 이미지에 대해 분류작업을 실시한다. 

 

% Download a pre-trained CNN from the web (needed once).
urlwrite(...
  'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ...
  'imagenet-vgg-f.mat') ;

% Setup MatConvNet.
run matlab/vl_setupnn ;

% Load a model and upgrade it to MatConvNet current version.
net = load('imagenet-vgg-f.mat') ;
net = vl_simplenn_tidy(net) ;

% Obtain and preprocess an image.
im = imread('peppers.png') ;
im_ = single(im) ; % note: 255 range
im_ = imresize(im_, net.meta.normalization.imageSize(1:2)) ;
im_ = im_ - net.meta.normalization.averageImage ;

% Run the CNN.
res = vl_simplenn(net, im_) ;

% Show the classification result.
scores = squeeze(gather(res(end).x)) ;
[bestScore, best] = max(scores) ;
figure(1) ; clf ; imagesc(im) ;
title(sprintf('%s (%d), score %.3f',...
   net.meta.classes.description{best}, best, bestScore)) ;

 

실행결과 peppers.png을 보고 0.704의 확신 정도로 피망(bell pepper)이라고 판단했음을 다음 그림을 통해 알 수 있다.  

 

CPU 버전 컴파일 성공~! 잘 작동하는 것을 확인했다.

 

GPU 버전 컴파일 및 실행

이번에는 GPU 버전에서 컴파일해보자. GPU 버전을 컴파일해주기 위해서는 다음과 같이 matlab 명령창에 타이핑해줘야한다. 

 

cd matconvnet-1.0-beta25
addpath matlab

vl_compilenn('enableGpu', true, 'cudaRoot', 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0',...
    'cudaMethod', 'nvcc', 'enableCudnn', 'true',...
    'cudnnRoot', 'local\cudnn-8.0');

 

그러나 GPU 버전에서는 컴파일에 실패했다. 실패 이유는 다음과 같다. 

 

GPU 버전 컴파일 실패 이유.

 

동일한 이유로 실패한 경우가 있는지 찾아봤더니 있었다. 
=> https://github.com/vlfeat/matconvnet/issues/1129
=> https://github.com/vlfeat/matconvnet/issues/1143

그래서 그들이 제안한대로 vl_compilenn.m의 359줄을 flags.mexlink = {''-largeArrayDims','-lmwblas'}; 에서 flags.mexlink = {'-lmwblas'}로 바꾸었다. 그랬더니 그 줄은 잘 넘어갔는데 새로운 에러가 발생했다. 이 에러를 겪은 사람은 없었는지 해결방법을 못 찾았다. 하지만 큰 문제는 아닌 것 같아서, 개인적으로 코드를 아래와 같이 살짝 수정했다. 

 

 

그랬더니 GPU 버전도 컴파일에 성공할 수 있었다. 잘 작동하나 확인해보자. 이번에는 피망 사진 대신 다른 사진을 넣어서 분류가 제대로 되었나 확인해보았다. 

 

 

분류가 적절히 되었음을 확인할 수 있었다. 

 

MatConvNet은 다수의 이미 훈련된 CNN 모델들을 제공하고 있다. 덕분에 꽤 유익하게 잘 사용하고 있다. 

 

 

<참고자료>
[1] http://www.itdaan.com/blog/2018/03/17/99379afe60c6c771e56e6db39fc1bf37.html

MatConvNet 설치:  Win10 + VS2015 + Matlab 2017a + CUDA 8.0 + cuDNN 5.1
[2] https://devtalk.nvidia.com/default/topic/1014305/cuda-8-0-installation-fail-quot-could-not-find-compatible-graphics-hardware-quot-/ 

CUDA 8.0 설치 실패시 참고
[3] http://www.vlfeat.org/matconvnet/install/