Faster-R-CNN Install on Ubuntu 16.04(GTX1080 CUDA 8.0,cuDNN 5.1)


pycaffe로 구현된 py-faster R-CNN을 uBuntu 16.04에 설치하는 방법을 다룬다.
그래픽카드는 GTX 1080이며 CUDA 8.0과 cuDNN 5.1을 사용한다.

Caffe 의존성 라이브러리 설치

핵심은 BVLC에서 최신 caffe는 설치할 필요가 없다.
왜냐하면, Faster-R-CNN 소스코드에 이미 구버전 caffe가 포함되어 있기 때문이다.
해당 버전은 2015년에 Microsoft에서 기존 Caffe를 수정해서 만든것이다.
버클리 대학에서 지공하는 공식 Caffe에는 Faster R-CNN에만 있는 RoI pooling와 같은 여러 기능들을 지원하지 않아서 실행이 안된다.

따라서 http://caffe.berkeleyvision.org/에서 prerequisites를 보고 그것들만 설치해 준다.

1. CUDA, cuDNN 설치하기

GTX 1080이기 때문에 CUDA 8과 cuDNN 5.1을 설치한다.
이전 post 참조

2. CUDA 환경변수 설정하기

TensorFlow와 다르게 설정 해줘야 한다.

vi ~/.bashrc

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

3. python virtual environment 설정

tensorflow와의 충돌을 막기위해서 virtualenv를 사용한다.

#install
$ sudo apt-get install python-pip python-dev python-virtualenv 
$ virtualenv --system-site-packages targetDirectory 

# activate shell
$ source ~/tensorflow/bin/activate # If using bash, ksh, sh, or 

활성화 하면 shell 앞에 (caffe_py2_virtualenv) jemin@jemin-desktop:와 같이 나옵니다.
이제부터 pip로 설치하면 모두 해당 virtual environment directory에 설치가 됩니다.
이때 sudo를 붙이면 중복성이 발생하니 pip로만 설치를 합니다.

4. 필요 라이브러리 설치

uBuntu 16.04를 기준으로 한다.

의존성 가이드 공식사이트: http://caffe.berkeleyvision.org/install_apt.html

sudo apt-get install opencl-headers build-essential \
  protobuf-compiler libprotoc-dev libboost-all-dev libleveldb-dev \
  hdf5-tools libhdf5-serial-dev \
  libopencv-core-dev libopencv-highgui-dev \
  libsnappy-dev libsnappy1 libatlas-base-dev cmake libstdc++6-4.8-dbg \
  libgoogle-glog0 libgoogle-glog-dev libgflags-dev liblmdb-dev

5. openCV 설치하기

openCV를 직접 받아서 compile해서 설치해야 최신 CUDA를 잘 지원한다.
그래서 github에서 직접 받아서 cmake를 통해서 설치한다.

의존성 라이브러리들

sudo apt-get install build-essential cmake git pkg-config libjpeg8-dev \
libjasper-dev libpng12-dev libgtk2.0-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev gfortran
sudo apt-get install libtiff5-dev 

앞으로도 caffe에서도 사용하는 ATLAS (among many other BLAS implementation)을 설치한다.
sudo apt-get install libatlas-base-dev
이것 역시 openCV에서도 사용한다.

openCV 설치

git clone https://github.com/opencv/opencv.git
cd opencv
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
	-D CMAKE_INSTALL_PREFIX=/usr/local \
	-D INSTALL_C_EXAMPLES=ON \
	-D INSTALL_PYTHON_EXAMPLES=ON \
	-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
	-D BUILD_EXAMPLES=ON ..
  
make -j8
sudo make -j8 install
sudo ldconfig

설치확인

py-faster-rcnn 설치

공식사이트

1. github 다운

내부에 fast-rcnn git이 또 존재하므로 반드시 --recursive option을 줘서 두 개의 git repository에서 모두 다운 받아야 한다.

# Make sure to clone with --recursive
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git

2. 의존성 파일 설치

  • cython 필요

    • sudo apt-get install cython
  • python package 설치, virtual env 활성화 상태에서

    • pip install easydict
    • pip install scikit-learn
    • pip protobuf
  • requirements.txt에 있는 python module 설치

    • cd py-faster-rcnn/caffe-faster-rcnn/python
    • for req in $(cat requirements.txt); do pip install $req | cut -d ">" -f1; done

3. 핵심 caffe 버전 통합

BVLC Caffe 2017최신 버전과 현재 내부에 있는 2015년 버전 MS 수정 caffe를 merge해야 한다.

원래 Microsoft Caffe

(caffe_py2_virtualenv) jemin@jemin-desktop:~/caffe/second/py-faster-rcnn/caffe-f                                                                                                                                                             ast-rcnn$ git log
commit 0dcd397b29507b8314e252e850518c5695efbb83
Author: Ross Girshick <ross.girshick@gmail.com>
Date:   Sun Aug 9 13:41:39 2015 -0700

    Fast and Faster R-CNN change set
     - smooth l1 loss
     - roi pooling
     - expose phase in pycaffe
     - dropout scaling at test time (needed for MSRA-trained ZF network)

차이점은
vi src/caffe/proto/caffe.proto를 열어서 보면 아래와 같이 Faster R CNN용 옵션들이 모두 있다는 것이다.
optional ROIPoolingParameter roi_pooling_param = 8266711;

최신 버전의 caffe를 설치해서 사용할 경우 이러한 Microsoft에서 변경한 내용들이 없기 때문에 추후에 demo.py를 실행 할 때

Message type "caffe.LayerParameter" has no field named "roi_pooling_param". 에러를 발생 시킨다. 따라서 반드시 2015년에 수정된 Microsoft caffe를 기반으로 merge를 수행 해야 한다.

(caffe_py2_virtualenv) jemin@jemin-desktop:~/caffe/second/py-faster-rcnn/caffe-f                                                                                                                                                             ast-rcnn$ git remote add caffe https://github.com/BVLC/caffe.git
(caffe_py2_virtualenv) jemin@jemin-desktop:~/caffe/second/py-faster-rcnn/caffe-f                                                                                                                                                             ast-rcnn$ git remote -v
caffe   https://github.com/BVLC/caffe.git (fetch)
caffe   https://github.com/BVLC/caffe.git (push)
origin  https://github.com/rbgirshick/caffe-fast-rcnn.git (fetch)
origin  https://github.com/rbgirshick/caffe-fast-rcnn.git (push)
(caffe_py2_virtualenv) jemin@jemin-desktop:~/caffe/second/py-faster-rcnn/caffe-f                                                                                                                                                             ast-rcnn$ git fetch caffe
remote: Counting objects: 13599, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 13599 (delta 3344), reused 3341 (delta 3341), pack-reused 10251
오브젝트를 받는 중: 100% (13599/13599), 13.71 MiB | 55.00 KiB/s, 완료.
델타를 알아내는 중: 100% (9619/9619), 로컬 오브젝트 582개 마침.
https://github.com/BVLC/caffe URL에서
 * [새로운 브랜치]   device-abstraction -> caffe/device-abstraction
 * [새로운 브랜치]   gh-pages   -> caffe/gh-pages
 * [새로운 브랜치]   master     -> caffe/master
 * [새로운 브랜치]   opencl     -> caffe/opencl
 * [새로운 브랜치]   parallel   -> caffe/parallel
 * [새로운 브랜치]   tutorial   -> caffe/tutorial
 * [새로운 브랜치]   williford-patch-1 -> caffe/williford-patch-1
 * [새로운 브랜치]   windows    -> caffe/windows
 * [새로운 태그]     acm-mm-oss -> acm-mm-oss
 * [새로운 태그]     bsd        -> bsd
 * [새로운 태그]     rc         -> rc
 * [새로운 태그]     rc2        -> rc2
 * [새로운 태그]     rc3        -> rc3
 * [새로운 태그]     rc5        -> rc5
 * [새로운 태그]     rcnn-release -> rcnn-release
 * [새로운 태그]     v0.1       -> v0.1
 * [새로운 태그]     v0.9       -> v0.9
 * [새로운 태그]     v0.99      -> v0.99
 * [새로운 태그]     v0.999     -> v0.999
 * [새로운 태그]     v0.9999    -> v0.9999
 * [새로운 태그]     rc4        -> rc4
(caffe_py2_virtualenv) jemin@jemin-desktop:~/caffe/second/py-faster-rcnn/caffe-fast-rcnn$ git branch
* (HEAD 0dcd397 위치에서 분리됨)
  master

git merge -X theirs caffe/master

-X theirs의 의미는 caffe/master를 기준으로 merge 한다는 의미이다.

추가로 아래의 파일에서 해당 코드를 주석처리 하거나 제거한다.

vi ./include/caffe/layers/python_layer.hpp
Remove self_.attr("phase") = static_cast<int>(this->phase_); from include/caffe/layers/python_layer.hpp after merging.

요약하면 아래와 같으며, 해당 issue는 원래 저자 github에 있다.
issue 316

# Maybe you can try to merge caffe master branch into caffe-fast-rcnn.
cd caffe-fast-rcnn  
git remote add caffe https://github.com/BVLC/caffe.git  
git fetch caffe  
git merge -X theirs caffe/master  
#Remove self_.attr("phase") = static_cast<int>(this->phase_); 
#from include/caffe/layers/python_layer.hpp after merging.

4. py-caffe 빌드와 설치

Makefile.config 설정
py-faster-rcnn/caffe-fast-rcnn에서 caffe를 빌드할 때 사용한다.

cp Makefile.config.example Makefile.config를 한다.
각자 환경에 맞춰서 주석처리된 부분을 풀고 환경변수를 설정 해야 한다.

# cuDNN acceleration switch (uncomment to build with cuDNN).
USE_CUDNN := 1
# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3
# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda
# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 through *_61 lines for compatibility.
# For CUDA < 8.0, comment the *_60 and *_61 lines for compatibility.
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
		-gencode arch=compute_20,code=sm_21 \
		-gencode arch=compute_30,code=sm_30 \
		-gencode arch=compute_35,code=sm_35 \
		-gencode arch=compute_50,code=sm_50 \
		-gencode arch=compute_52,code=sm_52 \
		-gencode arch=compute_60,code=sm_60 \
		-gencode arch=compute_61,code=sm_61 \
		-gencode arch=compute_61,code=compute_61
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
PYTHON_INCLUDE := $(VIRTUAL_ENV)/include/python2.7 \
		$(VIRTUAL_ENV)/lib/python2.7/site-packages/numpy/core/include
# We need to be able to find libpythonX.X.so or .dylib.
PYTHON_LIB := /usr/lib
# Uncomment to support layers written in Python (will link against Python libs)
WITH_PYTHON_LAYER := 1

# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
# Uncomment to use `pkg-config` to specify OpenCV library paths.
# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)
USE_PKG_CONFIG := 1
# N.B. both build and distribute dirs are cleared on `make clean`
BUILD_DIR := build
DISTRIBUTE_DIR := distribute
# The ID of the GPU that 'make runtest' will use to run unit tests.
TEST_GPUID := 0
# enable pretty build (comment to see full commands)
Q ?= @

caffe-fast-rcnn에서 빌드하기

mkdir build
cd build
cmake ..
make -j8 all
make -j8 pycaffe
make -j8 install
make -j8 runtest

cython module들 빌드

py-faster-rcnn/lib에서 make -j8

caffe 환경변수 설정

vi ~/.bashrc
export CAFFE_ROOT=/home/jemin/caffe/second/py-faster-rcnn/caffe-fast-rcnn
export PYTHONPATH=/home/jemin/caffe/second/py-faster-rcnn/caffe-fast-rcnn/python:$PYTHONPATH

5. 설치 확인

(caffe_py2_virtualenv) jemin@jemin-desktop:~/caffe/second/py-faster-rcnn/caffe-fast-rcnn$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
>>> caffe.__version__
'1.0.0-rc5'

6. 미리 빌드된 모델 다운받기

caffe zoo에서 VOC2007로 미리 트레이닝된 zf net과 vgg16을 다운 받는다.

cd py-faster-rcnn
./data/scripts/fetch_faster_rcnn_models.sh

Simple demo.py 실행

이제 데모를 실행한다.

putty로 실행하더라도 X11 forwarding이 설정 되었다면 image가 정상적으로 표시된다.

./tools/demo.py --net zf

Demo for data/demo/000456.jpg
Detection took 0.038s for 300 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/000542.jpg
Detection took 0.031s for 135 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/001150.jpg
Detection took 0.033s for 231 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/001763.jpg
Detection took 0.033s for 200 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/004545.jpg
Detection took 0.037s for 300 object proposals

참고사이트

https://github.com/rbgirshick/py-faster-rcnn
http://lastone9182.github.io/2016/09/16/aws-caffe.html#index-table


  1. HJMOON 2017.03.21 13:28 신고

    안녕하세요- 두가지 여쭙니다 ^^
    1) 현재는 윈도우 노트북에서 작업중인데, 연구를 계속하려면 일찌감치 우분투를 이용하는게 좋을까요? 딥러닝 관련해서 우분투 장점이 궁금합니다.
    2) 이글은 py caffe 인데 텐서플로와 비교해서 써보신 소감이 어떠신지요

    * 또 연구실에서 하나의 PC에 여러대의 GPU를 꼽아 놓고 연구실 사람들이 필요할때마다 접속해서 사용하는게 가능할까요? 이런 환경을 구축하려면 어떤 것을 참조하면 좋을지 혹시 아시면 도움말씀 부탁드립니다.

    좋은글들 항상 도움되고 정말 감사합니다.

    • JAYNUX 2017.03.22 10:04 신고

      각각에 대해서 제가 아는 수준에서 말씀드리도록 하겠습니다.

      1) 일단 저는 VMware를 이용해서 가상환경에서 ubuntu를 쓰다가 아무래도 vGPU 같은걸 CUDA가 허용하지 않아서 Deep Learning 전용 PC를 구매해서 거기에 native로 ubuntu를 설치 했습니다. 아무래도 caffe나 등등 오픈소스 딥러닝 프레임워크들이 리눅스 기반이고 각종 툴체인들이 리눅스 데비안 지원을 많이해서요. 이래저래 작업의 유연성을 위해서 우분투를 쓰고 있습니다. 구글링 할경우 자료도 우분투가 가장 많아서 시간 절약을 위해서 그냥 이것을 쓰고 있습니다. 멀티 부팅으로 native 설치하시는것도 좋은 방법 같습니다.

      2) py-caffe를 쓴 이유는 faster-r cnn을 구현한 저자가 matlab caffe와 python caffe 두가지로 뿐이 제공을 안해서 그냥 어쩔 수 없이 썻습니다. 아무래도 caffe가 나온지 3년이 조금 안되서 1년 약간넘은 tensorflow보다는 오래된 논문일 경우 구현 자료들이 대부분 caffe로 되어 있긴 합니다.
      그래서 그냥 시간 절약상 caffe로 했습니다. 그리고 최근에 faster rcnn을 최적화해서 임베디드 보드 odroid-xu4에 돌아가는 대회를 참가 했는데 거기서 기본이 caffe여서 쓴것이지 사실 제가 caffe를 좋아 하진 않습니다.
      최근 reddit에서 투표한결과 caffe는 좀 쇠락 하는것 같고 tensorflow나 py-torch가 부상하는것 같습니다.

      3) 저는 그냥 1대의 PC에 GPU1개만 있는 환경이라 아무래도 GPU를 여러명이 쓰지는 못하는것 같습니다. 1명이 쓸때 다른 사람이 tensorflow를 load하면 에러가 발생하는것 같습니다.
      방법은 docker를 이용해서 컨테이너기반 가상환경을 구성해주면 될것 같습니다. 만약 SLI로 GPU를 여러개 설치한 상황이라면 각자 gpu번호를 입력해서 코딩해도 될것 같긴한데 가장 좋은 방법은 역시 docker로 각각 분리해서 쓰는게 여러명이 사용한다면 그게 좋은것 같습니다.

      두서 없이 적었지만.. 도움이 되셨으면 좋겠습니다.

  2. HJMOON 2017.03.22 20:17 신고

    이렇게 자세히 설명해주시니 정말 감사드립니다.
    공부하다가 종종 문의드리겠습니다-

    하시는 연구에 큰 성취가 있으시길 바랄게요 ^^

    감사합니다.

  3. 신촌꾸레 2017.06.27 16:09 신고

    덕분에 잘 설치했습니다.

    git merge -X theirs caffe/master

    하는 과정에서 막혔는데, 무리없이 메일 주소 git 에 입력하고 merge 했더니 문제없더군요

    감사합니다.

+ Recent posts