요즘 꽤나 HOT 한 주제 중에 하나인 Deep Learning.
딥러닝을 구현하기엔 쉽지 않고, 또 누군가가 만들어준 좋은 라이브러리가 있는데 굳이 내가 고생 할 필요가없지..
Caffe C/C++, CUDA
Torch 7 C/C++, CUDA, Linux, Android, Mac
Theano Python
일반적으로 많이 사용하는 라이브러리 인 것 같은데 나는 windows 환경에서 C++을 이용하는 Caffe를 처음 이용 해 보기로 했다.
처음 보는 이친구 어떻게 다뤄야 할지 막막하던 차에 나랑 pc 환경이 아주 비슷한 분이 caffe 환경설정하는 방법을 올려두셨더군.
https://initialneil.wordpress.com/
원문은 위 주소에서 확인 가능하고 나는 다음을 위해 따로 기록.
//========================================================
[ Visual Studio 2013 + CUDA 6.5 + OpenCV 2.4.9 에서의 Caffe 환경설정 ]
1. Caffe’s GitHub(https://github.com/BVLC/caffe)를 다운로드 받고 압축을 해제 해 둔다.
2. VisualStudio에서 Win32콘솔 응용 프로그램으로 프로젝트를 생성한다.
파일 -> 새로만들기 -> 프로젝트
Win32 콘솔 응용 프로그램, (이때 경로는 추후 편의를 위해 1번에서 압축풀어둔 caffe의 root 폴더를 이용하라고 권장하던데??)
빈 프로젝트 생성
3. 64bit 프로그래밍을 위해 플랫폼 변경
빌드 -> 구성관리자 -> 활성 솔루션 플랫폼 -> 새로만들기 -> x64 -> 확인
4. caffe\src\caffe 경로에 있는 cpp 파일(총 8개)을 프로젝트 소스파일에 추가
5. 속성관리자에서 x64 Debug/Release 의 경로설정을 해 준다.
속성페이지 -> 일반 -> 출력 디렉터리 -> ..\..\bin\ (원문에서는 ..\bin 을 사용했지만 내 설정환경에서는 이 경로가 caffe root 폴터, 또한 뒤에 \ 하나 더 안붙이면 warning 뜨니 붙여주자)
속성페이지 -> C/C++ -> 일반 -> 추가포함 디렉토리에 아래 경로 추가
..\include; ..\src;
6. 3rdparty 라이브러리 설치 및 경로설정
해당 단계에서는 CUDA, OpenCV, Boost, OpenBLAS 를 설치하고 경로를 설정한다.
(만약 windows 64bit + vs2013을 사용한다면 원 저자가 제공하는 프리빌드 된 파일을 받아서 사용해도 된다)
CUDA 6.5 https://developer.nvidia.com/cuda-toolkit-65
OpenCV 2.4.9 http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.9/
Boost http://sourceforge.net/projects/boost/files/boost-binaries/
OpenBLAS http://sourceforge.net/projects/openblas/files/
추가포함디렉토리에 아래 경로를 추가 해준다. (사용자 설정에 따라 다름, 원저자는 환경변수 및 매크로 이용)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include
C:\Program Files\opencv2.4.9\build\include
C:\local\boost_1_56_0
마찬가지로 링커 -> 일반 -> 추가 라이브러리 디렉터리 에도 아래 경로를 추가한다.
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib\x64
C:\Program Files\opencv2.4.9\build\x64\vc12\lib
C:\local\boost_1_56_0\lib64-msvc-12.0
링커 -> 입력 -> 추가종속성에 아래의 라이브러리를 입력 해준다
Debug
opencv_core249d.lib;opencv_calib3d249d.lib;opencv_contrib249d.lib;opencv_flann249d.lib;
opencv_highgui249d.lib;opencv_imgproc249d.lib;opencv_legacy249d.lib;opencv_ml249d.lib;
opencv_gpu249d.lib;opencv_objdetect249d.lib;opencv_photo249d.lib;opencv_features2d249d.lib;
opencv_nonfree249d.lib;opencv_stitching249d.lib;opencv_video249d.lib;opencv_videostab249d.lib;
cudart.lib;cuda.lib;nppi.lib;cufft.lib;cublas.lib;curand.lib;%(AdditionalDependencies)
Release
opencv_core249.lib;opencv_flann249.lib;opencv_imgproc249.lib;opencv_highgui249.lib;opencv_legacy249.lib;
opencv_video249.lib;opencv_ml249.lib;opencv_calib3d249.lib;opencv_objdetect249.lib;opencv_stitching249.lib;
opencv_gpu249.lib;opencv_nonfree249.lib;opencv_features2d249.lib;cudart.lib;cuda.lib;nppi.lib;cufft.lib;
cublas.lib;curand.lib;%(AdditionalDependencies)
GFlags, HDF5, LMDB 등의 라이브러리의 경우 3rdparty 에 포함되어 있고 직접 설정을 원한다면 원저자의 글을 참고하여 caffe root 폴더에 3rdparty 폴더 만들어서 설정.
Caffe 실행을 위해 몇가지 dll 파일을 복사해준다.(저자의 3rdpartry 파일을 이용하면 세팅되어있음)
Libglog.dll : GLog -> caffe\bin
Libopenblas.dll : OpenBLAS -> caffe\bin
Msvcp120.dll : HDF5 -> caffe\bin
Msvcr120.dll : HDF5 -> caffe\bin
추가포함디렉터리와 추가라이브러리디렉터리에 아래 경로를 추가해준다.
include
../3rdparty/include; ../3rdparty/include/openblas; ../3rdparty/include/hdf5; ../3rdparty/include/lmdb;
Lib
../3rdparty/lib
추가종속성에 아래 라이브러리를 추가로 입력 해준다.
Debug
gflagsd.lib;libglog.lib;libopenblas.dll.a;libprotobufd.lib;libprotoc.lib;leveldbd.lib;lmdbd.lib;libhdf5_D.lib;
libhdf5_hl_D.lib;Shlwapi.lib;
Release
gflags.lib;libglog.lib;libopenblas.dll.a;libprotobuf.lib;libprotoc.lib;leveldb.lib;lmdb.lib;libhdf5.lib;libhdf5_hl.lib;
Shlwapi.lib;
리눅스에서는 바로 컴파일 가능하다는데, 윈도우 에서는 일부 소스코드를 수정 해줘야 한다.(7~10번 과정)
7. “commom.cpp”
에러를 확인하기 위해 먼저 common.cpp 파일만 컴파일 해 준다.
컴파일 하면 아래와 같이 getpid error 가 발생 할 것이다
소스코드 상단에 #include <process.h>를 추가 해주고 fopen_s 에러를 막기 위해 속성페이지 -> C/C++ -> 전처리기 -> 전처리기정의에 “_CRT_SECURE_NO_WARNINGS” 를 넣어준다.
“getpid”를 사용하는 라인을 아래와 같이 수정 해 준다.
- #ifndef _MSC_VER
- pid = getpid();
- #else
- pid = _getpid();
- #endif
다시 컴파일 하면 common.cpp 파일은 에러없이 컴파일이 가능하다.
8. “blob.cpp”
#include “caffe/proto/caffe.pb.h” 구문을 활성화 하기위해서는 caffe.proto파일을 생성해야한다.
Proto.exe 파일을 caffe\3rdparty\bin 에 복사
GeneratePB.bat 파일을 caffe\scripts 폴더에 복사
속성페이지 -> 빌드이벤트 -> 빌드 전 이벤트 -> 명령줄에 “../scripts/GeneratePB.bat” 추가
이후 다시 컴파일 하면 caffe.pb.h is being generated 라는 문구와 함께 컴파일이 가능하다.
(caffe_pretty_print.pb.h 관련 에러가 발생하면 error 해결 1번 확인)
( error C4996 이 발생하면 아래의 error 해결 2번 확인, 원문의 13번 참고)
9. “net.cpp”
“mkstemp” missing error 가 발생하면 http://stackoverflow.com/questions/6036227/mkstemp-implementation-for-win32 참고하여 해결
또는 io.hpp 상단에 #include “mkstemp.h 문구 추가. (원저자가 구현해둠)
Close 관련 에러를 해결하기 위해 io.hpp 파일의 MakeTempFilename 함수의 close(df) 를 아래와같이 변경 해준다.
- #ifndef _MSC_VER
- close(fd);
- #else
- _close(fd);
- #endif
io.hpp 파일에 mkdtemp 관련 에러를 해결하기위해 문제의 문장을 아래와 같이 수정 해준다
- #ifndef _MSC_VER
- char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
- #else
- errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
- #endif
여기까지 추가 해 주면 net,cpp 파일 컴파일이 가능하다
10. "solver.cpp"
snprintf error를 해결하기 위해 아래의 문장을 추가 해 준다.
- #ifdef _MSC_VER
- #define snprintf sprintf_s
- #endif
11. caffe/src/layers의 파일들 컴파일
GPU를 사용하기 위해 CUDA를 활성화 해 줘야 한다.
프로젝트 - 빌드종속성 - 사용자 지정 빌드로 들어가서 CUDA를 활성화 해 준다
프로젝트 - 소스에 새로운 필터를 추가 해 주고 caffe/src/layers 에 있는 *.cu 파일을 모두 추가 해준다.
bull_layer.cu 파일의 const float kBNLL_THRESHOLD = 50.; 문구를 아래와 같이 바꿔준다
#define kBNLL_THRESHOLD 50.0
이후 모든 .cu 파일의 속성에서 항목 형식을 CUDA C/C++ 로 변경 해 준다
이제 layers 폴더도 정상적으로 컴파일이 가능하다.
12. 이제 caffe/src/util 폴더에 있는 파일을 컴파일 해야한다.
위에서 한것과 마찬가지로 util 필터 추가하고 cpp파일 추가.
이후 io.cpp 파일에서 ReadProtoFromBinaryFile 함수의 "O_RDONLY" 부분을 "O_RDONLY|OBINARY" 로 수정 해준다.
또 POSIX 에러를 막기위해 아래 문구를 상단에 추가해준다
- #ifdef _MSC_VER
- #define open _open
- #endif
close는 file.close() 를 제외하고 나머지 close 를 _close()로 수정 한다.
math_functions.cpp 파일 상단에 아래의 문구를 추가 해준다.
- #define __builtin_popcount __popcnt
- #define __builtin_popcountl __popcnt
13. 이제 caffe/src/proto 에 있는 파일을 위한과정.
속성 -> C/C++ -> 명령줄에 다음 문구를 추가 해 준다 "-D_SCL_SECURE_NO_WARNINGS"
여기 까지 하면 caffe 환경설정의 대장정의 끝이다.
컴파일을 해 보면 에러 없이 컴파일 되는 것을 확인 할 수 있을 것이다.
추가적인 문제가 발생 할 경우는 다음 포스팅에서 다루도록 한다.
어유 한번 써보기 쉽지 않구만...
'전공관련 > Deep Learning' 카테고리의 다른 글
[Caffe] NVIDIA DIGITS 버전 업데이트 하기. (0) | 2016.03.18 |
---|---|
[Deep Learning] Weight update method 정리. (0) | 2016.02.24 |
[Deep Learning] Xavier Initialization에 관하여.. (0) | 2016.02.22 |
[Caffe] Caffe를 이용하여 학습할때 snapshot을 이용하여 이어서 학습하기 (0) | 2015.12.16 |
[Deep Learning] 컴퓨터 비전을 위한 심층학습 기법 강의정리 (0) | 2015.12.15 |