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)이라고 판단했음을 다음 그림을 통해 알 수 있다.
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 버전에서는 컴파일에 실패했다. 실패 이유는 다음과 같다.
동일한 이유로 실패한 경우가 있는지 찾아봤더니 있었다.
=> 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/
'Dev > matlab' 카테고리의 다른 글
[MATLAB] 숫자형을 문자형으로, 문자형을 숫자형으로 변환하기, num2str 함수와 str2num 함수 (2) | 2019.04.16 |
---|---|
matlab에서 문자열 비교하기, strcmp 함수 (0) | 2019.04.12 |
matlab을 이용해서 파일 복사하기, copyfile 함수 (0) | 2019.04.11 |
matlab을 통해 txt 파일(메모장)에 기록을 남기려면?, fprintf 함수 (0) | 2019.04.11 |
LIBSVM 활용하여 매트랩에서 SVM 사용하기 (34) | 2018.12.19 |
메모장에 있는 숫자들을 matlab에서 읽어내려면?, textread 함수 (2) | 2017.10.07 |
[MATLAB] 폴더 속의 이미지 파일들의 이름을 읽어내고 싶을 때는?, dir 함수 (2) | 2017.09.27 |
[MATLAB] grape-based visual saliency (GBVS)로 saliency 맵 산출하기 (6) | 2017.05.16 |