요즘 꽤나 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 |
[Caffe] Caffe + opencv + CUDA 설치방법 ( in windows ) (25) | 2015.07.16 |
댓글을 달아 주세요
비밀댓글입니다
기본적으로 caffe 환경 설정 한 후에는 간단한 사용 수준에서는 크게 어려운 사항이 없습니다. 아키텍쳐 설계, 학습 파라미터 설정 만 해주시고 새로 학습하고자 하시는 DB를 levelDB나 lmdb 형태로 변환 하고 학습 하면 됩니다.
학습 단계에서 검증세트로 학습률을 중간중간 테스트 해 볼수도 있고 테스트 세트를 따로 준비해서 학습 후에 평가를 해도 됩니다.
caffe는 deep learning을 위한 학습알고리즘을 구현 해 둔 것일 뿐 나머지 학습이나 평가 같은 사항은 기존에 사용하시던 다른 머신러닝 알고리즘과 동일하게 적용 하시면 될 것 같습니다.
8번 blob.cpp 컴파일중인데 아래와 같은 에러가 나타나내요..
fatal error C1083: 포함 파일을 열 수 없습니다. 'caffe/proto/caffe.pb.hpp': No such file or directory
그래서 검색해서 다운받아서 넣엇더니...다른에러가뜹니다..
fatal error C1189: #error : This file was generated by an older version of protoc which is <<
해결방법이 있을까요?
caffe.pb.hpp 파일을 다운로드 받으시지 마시고
scripts\GeneratePB.bat 파일을 에디터로 열어 보시면 몇가지 파일 경로들이 보이실 겁니다. 이 경로를 사용하시는 환경에 맞게 바꿔주시고 저장하신후에 다시 한번 컴파일을 해 보시면 정상적으로 파일이 생성 될 겁니다.
비밀댓글입니다
비밀댓글입니다
비밀댓글입니다
비밀댓글입니다
비밀댓글입니다
댓글 다신걸 이제야 봤네요. 메일 주소 남겨주시면 메일 한번 드리겠습니다
비밀댓글입니다
천재님
혹시 GPU안쓰고 CPU로만 돌릴려면 어떻게 해야 되는지 아시나요 ?
소스코드 찾아보시면 #ifdef CPU_ONLY 구문이 포함된 부분이 여러군데 있습니다 해당부분들 찾아서 상단에 CPU_ONLY 를 정의 해 주시던가 공통으로 include 되는 부분 찾아서 정의 해 주셔도 됩니다.
또 빌드종속성 - 사용자 지정 빌드 에서 CUDA 체크 하셨던 부분 해제 해주셔야 합니다
이후 사용실 때 Caffe::set_mode(Caffe::GPU); 대신 파라미터로 CPU를 주셔서 Caffe::set_mode(Caffe::CPU); 모드 설정 해 주시고 하용 하시면 됩니다.
비밀댓글입니다
이 내용은 원 저자가 작성한 내용을 그대로 옮겨서 저런식으로 경로 설정이 되어있는데 이 방법보다는 $(SolutionDir) 매크로 같은걸 이용하시면 보다 편리합니다. 경로설정 하실때 매크로 버튼 눌러보시면 각 매크로가 어떤 경로나 값을 지정하는지 확인 하실 수 있고요.
절대경로로 추가하면 혹 프로젝터 경로가 바뀔경우 입출력 경로가 꼬여버리는 문제가 있으므로 그닥 추천하지 않습니다.
5번스텝에 질문좀 드리겠습니다.
속성페이지 -> 일반 -> 출력 디렉터리 -> ..\..\bin\ (원문에서는 ..\bin 을 사용했지만 내 설정환경에서는 이 경로가 caffe root 폴터, 또한 뒤에 \ 하나 더 안붙이면 warning 뜨니 붙여주자)
Q1) 여기서 bin폴더는 어디있나요? 경로 설정이 너무 햇갈려서 직접 부여하고싶은데 아무래 찾아봐도 없네요 ㅠㅠ
Q2) 그리고,
속성페이지 -> C/C++ -> 일반 -> 추가포함 디렉토리에 아래 경로 추가
..\include; ..\src;
여기서 include,src폴더는 다운받은 폴더에 있는거 말씀하시는거죠??
위에꺼 잘못해서 비밀글써서 다시 씁니다. (비밀번호 설정을 안했는데..)
감사합니다 늘 블로그 와서 공부하고 있습니다.
위에 적은내용이랑 같은 내용입니다.
절대경로의 경우 프로젝트 위치가 바뀔경우 입출력 경로가 꼬일 수 있으므로 그닥 추천하지 않고요. 상대경로를 설정하실때 .. 와 같은 상위폴더경로 같은경우는 현재위치가 어디인지 햇갈릴수도 있으니까 $(SolutionDir) 같은 매크로 사용하시면 좋을 것 같습니다. 매크로 버튼 눌러보시면 각 매크로가 어떤 경로나 값을 지칭하는지 확인 가능합니다.
bin 폴더는 컴파일 된 파일이 출력 될 경로로 폴더 하나 만들어 주시면 되고, include나 src는 다운로드 받으신 caffe에 있는 경로에 맞게 지정 해 주시면 됩니다.
저도 완전 초보라 나중에 제가 다시볼 목적 + 저같은분 혹시나 도움될까 해서 적어두는거라 부정확한 정보도 있고 저만 알아보게 적는 경우도 있다보니... 차차 개선 해야겠죠.
비밀댓글입니다
비밀댓글입니다
생성된 caffe.exe 파일을 사용하려면 뒤에 파라미터를 넣어줘야 합니다. 윈도우 상에서 실행시키면 메세지 확인 할 틈도 없이 종료되어 버리니 cmd 창에서 실행 해 보시면 메세지 확인 가능하실 겁니다. 설명 나오는 대로 파라미터 같이 넣어주시면 학습 또는 테스트 가능 합니다.
원래 사이트에서 3rd party를 다운 받아야 하는건가요? 아니면, 그냥 opencv, openblas, cuda 설치만 하면 되는건가요?
common만 에러 100개 ㅠㅠ
OpenCV, CUDA, Boost 는 설치 해주시고 나머지는 원저자가 올려둔 3rdparty 파일 사용하시면 됩니다. 다른 설정을 원하시면 나머지 라이브러리들도 개별적으로 설치 하셔도 상관 없습니다.
비밀댓글입니다
이 방법은 caffe 가 공식적으로 windows를 지원하기 전에 사용하던 방법으로 지금은 사용하지 않습니다.
http://jangjy.tistory.com/249 이 글을 참고하셔서 공식적으로 지원하는 버전을 이용하시면 될 것 같습니다.
hid_t가 선언되지 않았다는 에러가 hdf5.h에 뜨는데 어떻게 해결해야 할까요?
카테고리
태그목록
달력
LATEST FROM OUR BLOG
BLOG VISITORS
Copyright © 2015 Socialdev. All Rights Reserved.
티스토리툴바