레이블이 기계학습인 게시물을 표시합니다. 모든 게시물 표시
레이블이 기계학습인 게시물을 표시합니다. 모든 게시물 표시

2014년 9월 18일 목요일

R-CNN 설치와 실행

R-CNN 설치와 실행


 이제 Ubuntu 14.04LTS, MATLAB 2013b, caffe, cuda 6.0을 모두 설치하셔다면 R-CNN까지도 접해보시기를 추천합니다. 서두에 말씀드렸던 것처럼 CNN을 prototxt 파일을 수정함으로써 원하는 형태로 구성하고 학습할 수 있습니다.

 github rcnn 페이지에서도 영문으로 가이드를 보실 수 있습니다.

 특별히 설정을 바꾸거나 하지 않아도 readme.md에 설명된 대로만 따라가면 rcnn_demo를 실행할 수 있습니다.

 다만, NVIDIA cuda가 장착되지 않은 그래픽 카드이거나 사양이 낮다면 다음 글을 참고하여 실행해보시기 바랍니다.

 R-CNN: Regions with Convolutional Neural Network Features. 저사양의 그래픽 카드에서 GPU mode로 실행하기

 실행된 화면은 다음과 같습니다.

 재미있는 사진을 데모에 제시했습니다. 사람과 물고기 모양 자전거를 보여주면 어떻게 인식이 되는지.볼 수 있습니다. 가장 높은 스코어 순서로 사람, 자전거, 선글라스가 검출되었습니다.




2014년 9월 16일 화요일

R-CNN: Regions with Convolutional Neural Network Features. 저사양의 그래픽 카드에서 GPU mode로 실행하기

R-CNN: Regions with Convolutional Neural Network Features. 저사양의 그래픽 카드에서 GPU mode로 실행하기

 rcnn_demo()를 실행하는 경우 cuda memory가 충분하지 않은 사양의 그래픽 카드에서는 (<=1GB) 기본 설정으로 동작이 되지 않고 아래와 같은 에러 메시지를 출력할 수 있다.

Check failed: error == cudaSuccess (2 vs. 0) out of memory

 Selective search를 통해서 얻어낸 후보군들에 대한 CNN을 통과하는 이미지의 갯수를 한 번에 256개로 설정해두었기 때문에 이것을 적절히 조절하면 저사양의 그래픽 카드에서도 실행할 수 있다.


$RCNN_ROOT/data/rcnn_models/ilsvrc2013/rcnn_model.mat

을 열어 CNN 멤버에 batch_size를 적절히 조절하고 같은 숫자를


$RCNN_ROOT/model-defs/rcnn_batch_256_output_fc7.prototxt


에서 input_dim: 256 으로 설정되어 있는 기본값을 바꾸어 주면 된다.

caffe 를 이용해 MNIST 필기체 인식 해보기

caffe 를 이용해 MNIST 필기체 인식 해보기

Handwritten digit recognition using caffe

$CAFFE_ROOT/examples/mnist에는 mnist dataset에 대한 learning과 test에 대한 데모가 준비 되어 있습니다.

cd $CAFFE_ROOT/data/mnist ./get_mnist.sh
cd $CAFFE_ROOT/examples/mnist ./create_mnist.sh

명령으로 mnist dataset을 받고

cd $CAFFE_ROOT/examples/mnist ./train_lenet.sh

을 수행하면 그림과 같이 학습이 진행되는 것을 확인할 수 있습니다.
lr은 learning rate이고 loss는 각 단계에서 발생된 loss function의 값입니다.


CNN에 대한 학습과정은 다음 링크에서 보다 시각화된 형태로 관찰할 수 있습니다.


마지막 output layer에서 activation되는 neuron을 관찰하면 입력된 숫자와 일치하는 것을 볼 수 있습니다.

 놀라운 것은 이 모든 행동이 처음 네트워크를 구성해주는 것 말고는 모두 자동으로 이루어 진다는 것입니다. 컴퓨터 비전에서 특징점을 추출하거나 에지를 검출하는 필터를 디자인 하고자 할 때 gradient를 볼 수 있도록 하는 필터를 설계하게 되는데, CNN을 학습함으로 인해서 입력값들은 보다 잘 구분할 수 있도록 하는 필터의 값들은 스스로 학습하게 되는 것입니다.

R-CNN: Regions with Convolutional Neural Network Features. 설치와 실행

R-CNN: Regions with Convolutional Neural Network Features. 설치와 실행

CVPR2014에 Rich feature hierarchies for accurate object detection and semantic segmentation이라는 제목으로 게재된 논문에 사용된 소스를 설치하고 실행한 결과에 대해서 게재하고자 합니다.
 R-CNN은 Berkeley Vision and Learning Center(BVLC)에서 만든 caffe(An Open Source Convolutional Architecture for Fast Feature Embedding)를 기반으로 방대한 양의 영상 데이터 베이스로부터 학습한 CNN(Convolutional Neural Network)을 이용해서 물체에 대한 사진을 분류하고 인식하는 방법입니다.

 IMAGENET 2014에서 ILSVRC14 Task 1b: Object detection with additional training data 부문에서 5번째에 랭크 되었습니다(ILSVRC14 결과). 올해 5월에만해도 다른 모든 방법들보다 우수할 것으로 자체적으로 판단하였습니다.

  상위 몇개의 방법들은 CNN을 기본으로 하는 것이 유사하고 각 레이어의 크기와 형태를 정하는 방법들에 의해 성능이 결정되는 경우가 많아서 R-CNN을 분석해보는 것이 물체 인식을 위한 기계 학습에 적절하다고 생각됩니다. MATLAB과 python에 대한 매우 편리한 인터페이스를 지원하기 때문에 text파일로 정의되는 레이어의 크기와 형태를 수정하는 것만으로도 완전히 새로운 CNN을 구성할 수 있기 때문입니다.

 다음 순서로 진행됩니다.
  1. 우분투 14.04 설치
  2. MATLAB 2013b 설치
  3. 우분투 14.04LTS에서 cuda 6.0 설치
  4. caffe 설치 및 실행
  5. R-CNN 설치 및 실행
 여기에서는 3, 4, 5에 대해서만 다룹니다.

caffe 설치와 실행

caffe 설치와 실행

An Open Source Convolutional Architecture for Fast Feature Embedding

 영어, git project, CUDA, Ubuntu에 대해서 익숙하시다면 곧 바로 caffe git hub페이지로 가셔도 좋습니다.


 버전관리 툴을 사용하고 계신다면 git에 대해서 생소하지 않으실 겁니다. open source기반의 VCS는 CVS, Subversion을 거쳐 현재는 git이 대세로 굳어지는 것처럼 느껴집니다.

 git에 대한 한국어 입문을 위한 페이지는 다음을 참조하시기 바랍니다.


 여기에서는 우분투 14.04LTS에 Matlab 2013b가 설치된 환경을 가정합니다.

 사전 설치가 필요한 것들
  • BLAS(ATLAS)
    • sudo apt-get install libatlas-base-dev
  • OpenCV
  • glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb
    • sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
  1. git clone 생성

    명령으로 로컬 저장소에 복제본을 생성합니다.
    export CAFFE_ROOT=$pwd
  1. MATLAB wrapper 설정

    CAFFE_ROOTMakefile.config에서 MATLAB_DIR을 현재 설치된 경로로 수정
  1. compile

    make all
    make test
    make runtest
정상적으로 cuda가 설치 되었다면 nvcc로 컴파일된 모듈에 대한 정상적인 테스트가 완료됩니다.

  1. MATLAB wrapper 정상 동작 확인

MATLAB을 실행시키고 $CAFFE_ROOT/matlab/caffe 로 이동
matcaffe_init.m을 실행시키면 modelprototxt파일이 없다고 나옵니다.
model은 학습을 통해서 얻은 가중치와 CNN필터의 값입니다. prototxtCNN이 어떻게 구성되어 있는지 description해주는 파일입니다.
$CAFFE_ROOT/examples/imagenet 으로 이동
get_caffe_reference_imagenet_model.sh 파일을 실행시켜 model 파일을 받아옵니다.
$CAFFE_ROOT/matlab/caffe/matcaffe_initmatcaffe_demo를 실행시켜봅니다.
matcaffe_demoILSVRC1000개의 물체에 대한 object classification demo 입니다.


2014년 9월 15일 월요일

ILSVRC(Large Scale Visual Recognition Challenge)

ILSVRC(Large Scale Visual Recognition Challenge)

 PASCAL VOC와 함께 물체 인식 분야에서 양대 산맥을 이루다가 PASCAL VOC가 막을 내리면서, 독보적인 국제대회로 자리 매김 했습니다.

 물체 인식을 위한 DB를 공개하는 역할을 하는 IMAGENET의 영상을 이용해서 학습한 검출기, 분류기를 겨루는 국제대회입니다. 처음에는 물체 분류에 대해서만 국한되어서 진행되다가 최근에는 물체 분류, 검출, 검출 위치 추정까지 점점 난이도가 높아지고 있고 제출되는 결과도 우수해지고 있습니다.

 물체 인식을 위한 DB는 Caltech 101, Caltech 256과 같이 적은 클래에 대한 것이 아니라 IMAGENET은 기본적으로 WordNet의 단어 분류에 따른 명사에 대한 물체 영상 DB구축을 목표로 하므로 매우 방대합니다. 현재 구축되어 있는 DB는 21841개의 물체 종류에 대해서 14,197,122(2014.9.16 기준)개의 영상을 보유하고 있습니다. 조회하는 것은 누구나 가능하지만 다운로드 하려면 협약된 비영리 단체에 한하여 가능합니다. (300GB이상입니다.)



2014년 8월 28일 목요일

동차 선형 방정식을 SVD로 풀 수 있는 이유


동차 선형 방정식을 SVD로 풀 수 있는 이유

Solving homogeneous linear equation using SVD

 최소 자승법을 이야기 하면서 의사 역행렬을 이용해 over-constrained eq.을 푸는 방법을 소개 했는데 정작 왜 그것이 정답이 되는지는 얼버무리고 넘어간 것 같아서 이 글을 게시합니다.

 SVD(Singular Value Decomposition)은 선형 대수학에서 매우 중요한 의미를 가집니다. eigenvalue, eigenvector가 중요한 것처럼 singular value들은 eigenvalue와 관계가 있기 때문입니다. 컴퓨터 비전이나 기계 학습에서 선형 대수학이 빠질 수 없는 이유는 바로 선형 변환에 불변하는 특성을 가지는 eigenspace 해석을 통해서 중요한 성질을 구할 수 있기 때문입니다. PCA(Principal Component Analysis)도 결국 SVD를 이용해서 주요 성분을 얻어내는 것이고, 기계 학습에서 sparse coding으로 중요한 정보 만을 이용해서 영상을 분류하는 방법에도 적용될 수 있습니다.

 행렬 \(\mathbf{A}\)의 singular value를 \(\sigma\)라고 하면, \(\mathbf{A^*A}\)와 \(\mathbf{AA^*}\)의 0이 아닌 eigenvalue, \(\lambda\)와 \(\sigma\) = \(\sqrt{\lambda}\)의 관계를 가집니다. 여기서 \(\mathbf{A^*}\)는 \(\mathbf{A}\)의 켤레전치행렬(conjugate transpose) 입니다. 간단하게 상수라고 생각하면 제곱 한 것을 분해한 것과 그냥 분해한 것의 차이 정도로 대략 감을 잡으시면 될 것 같습니다.

 그럼 SVD로 어떻게 동차 방정식의 해를 구할 수 있는지 보겠습니다.

 \(\mathbf{Ax} = 0\)

와 같은 동차 방정식이 주어지는 경우, 자명하지 않은 해(non trivial solution)을 구한는 것이 목적입니다. (\(\mathbf{x}=0\)이면 항상 참이 되니 자명한 해이므로 관심이 없습니다.)

 그래서 자명한 해가 아닌 해를 구하기 위해서 제약 조건을 줍니다. 보통은 \(||\mathbf{x}||=1\) 과 같이 벡터의 크기를 정해줍니다. 우변이 0이기 때문에 벡터의 크기는 아무래도 관계 없기 때문입니다.

 이제 행렬 \(\mathbf{A=UDV^T}\)로 분해하면,

\(\mathbf{||UDV^Tx||=||DV^Tx||}\) - ①
\(\mathbf{||x||=||V^Tx||}\) - ②

로 둘 수 있습니다. 왜냐하면, SVD로 구한 \(\mathbf{U, V^T}\)행렬은 각 열이 모두 orthogonal 하기 때문입니다. 이 특성은 회전 행렬과 같습니다. 벡터 공간에서 임의의 벡터를 아무리 회전 시켜도 그 크기가 변하지 않는다는 것을 생각해보면 식 ①, ②가 성립하는 것을 알 수 있습니다.

\(\mathbf{y=V^Tx}\) - ③

을 도입해 보면, 최초의 문제는 결국 '\(\mathbf{||Dy||}\)를 최소화하되 \(\mathbf{||y||}=1\)을 만족 시켜라.'는 문제로 바뀌게 됩니다.

 여기서 SVD의 특성을 다시 한 번 생각해보면, 분해된 행렬 \(\mathbf{UDV^T}\)에서 \(\mathbf{D}\)는 대각 행렬이고 원소들은 singular value가 큰 순서대로 정렬되기 때문에 \(\mathbf{||Dy||}\)를 가장 작게 만들면서 \(\mathbf{||y||}=1\)을 만족 시킬 수 있는 방법은 \(\mathbf{y}=(0, 0, ..., 0, 1)^T\)로 두는 것입니다.

 그러므로, \(\mathbf{x=V^Ty}\)는 결국 \(\mathbf{V^T}\)의 마지막 열이 됩니다.

2014년 8월 27일 수요일

기계 학습 - 서론

기계 학습 - 서론

Machine learning - preliminary


 기계 학습을 한 마디로 정의하기는 어려울지도 모르겠습니다. 그러나 학습, 추론, 결정을 요구하는 시스템을 수학적 기반으로 연구하는 분야라는 데에는 이견이 없을 듯 합니다. 최근에 하드웨어 성능의 향상(특히 GPGPU-General-purpose computing on graphics processing units), 빅 데이터의 경향에 따라 산업계, 학계의 지대한 관심을 받고 있는 분야입니다. 그에 따라 연구 그룹도 우후죽순 생겨나고 있습니다. 본 블로그에서는 이 서론을 시작으로 몇 가지 활용에 대해서 기술하고자 합니다.

 기계 학습을 연구하는 사람들의 공통적 철학은 '오컴의 면도날(Occam’s Razor)'이라는 철학자의 말을 빌어보는 것이 좋을 것 같습니다. 사실 오컴은 사람 이름이 아닌 지명입니다. 레오나르도 다 빈치 라는 이름이 빈치에서 태어난 레오나르도라는 의미인 것과 마찬가지로 '윌리엄'은 영국 오컴 지방의 프란체스코회 수사였습니다.

 오컴의 면도날의 의미는 문제를 풀 수 있는 방법이 여러 가지가 있을 경우에 가장 간단한 방법이 최선의 답이라는 철학적 원리를 바탕으로 합니다. 경제성의 원리라고도 불립니다. 기계 학습을 전공하는 사람들 중에서 최근 각광 받는 Deep learning 분야를 연구 하는 사람들은 아마도 복잡한 수식이나 모델링을 통한 해법보다는 자극(Stimulation)에 의해서 활성화(Activation)되는 인간의 뉴런과 시냅스를 모사하고 학습하는 것이 오컴의 면도날을 충족하는 가장 바람직한 정답이라고 생각했을 수 있습니다.

원본 이미지: http://vashonsd.org/teacherweb/floyd/index.php/floydtemp/pages/C1191/P90
뉴런과 시냅스를 모사한 Nueral Network
 신경망 회로(Nueral network)의 개념이 최초로 도입되던 시절에는 지금에 비해서 컴퓨터의 성능이 보잘 것 없어서 실용화 하기에는 불가능할 것처럼 보였습니다. 그러나 최근에 제시되는 결과는 간단한 분류에서 문자 인식, 음성 인식, 얼굴 인식처럼 점점 고도화 되고 상용화 가능성을 보이고 있습니다.

  신경망 회로(Neural network)에 관해 생소하다면 역전파(Back-propagation)을 통해 작은 수의 레이어가 있는 경우에 한해 접근해 보는 것이 좋을 것 같습니다.

신경망 회로에서 역전파를 통한 학습


신경망 회로에서 역전파를 통한 학습

Learning through back-propagation in 3-layers neural network

 layer가 3개인 신경망 회로(이하 NN)는 input, hidden, output layer로 구성됩니다. 학습 단계는 output layer에서 원하는 출력을 얻기 위해 hidden layer가 활성화 되도록 학습하는 것이 목적입니다.

 예를 들면, 어떤 물체가 연필인지 아닌지를 구분하는 NN을 만들고자 할 경우에 loss function은

\(loss = 연필 - output\)

이 되어야 합니다.

 convex optimization 문제로 만들기 위해 \(loss = (연필 - output)^2\)으로 놓고 미분하면 \(\frac{\delta loss}{\delta output} = 2(연필 - output)\)이 됩니다.

 그러면 NN이 원하는 출력 값과 얼마나 다른 값을 출력 하는지를 알 수 있습니다. 출력값의 차이가 크다면 input->hidden->output layer로 이르는 뉴런들이 올바르게 활성화될 수 있도록, 오차만큼 역전파(Back-propagation)을 통해서 weight값을 고쳐줍니다. 이 과정의 반복을 학습이라 부릅니다. 그림을 보면 이해가 쉽습니다.

  • Feed-forward 과정입니다. 입력 뉴런과 weight의 값들의 합이 다음 layer의 입력으로 들어가고 activation function의 임계치에 따라서 활성화되는지 그렇지 않은지가 결정됩니다. activation function은 과거에는 모두 sigmoid function을 사용하였으나 최근에는 경향이 좀 바뀌었습니다. 추후에 언급할 기회가 있을 거라고 생각합니다.
  • Backward propagation의 과정입니다. loss function의 값은 곧바로 weight를 학습하는데 사용할 수가 없기 때문에, 다시 말하면 출력값이 원하는 값과 다르게 나오는데 영향을 미친 뉴런이 어떤 것이고 얼마 만큼의 가중치를 가졌는지 알 수 없기 때문에 미분치를 역으로 전파시킵니다. 그림에서 \(\delta\)는 이 미분치를 의미하고 chain rule로 입력 layer까지 전파됩니다. 이제 weight를 갱신하고 다시 이 과정을 반복합니다. 이때, \(\eta\)는 learning rate으로 부르는데 학습의 시간을 결정합니다. 크게 설정하면 빠르게 학습되지만 over-shoot이 생겨서 오차 범위에 정착하기가 힘들기 때문에 수렴하는 속도를 보고 변경하는 것이 일반적입니다.











원본 이미지: http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html

 신경망의 기본 개념은 인간의 뉴런과 시냅스를 모사한다는 거창한 말에 비해서 이론적으로 어렵거나 구현이 까다롭지 않습니다.(물론 layer의 수가 적을 때의 이야기 입니다. 영상에 적용하는 convolutional neural network은 이보다 엄청나게 많은 수의 뉴런과 weight가 존재하기 때문에 구현 자체가 어려운 경우가 많습니다.)

 학습은 방법보다는 어떤 응응 분야에 적용할 것 인지를 염두에 두어야 합니다. 왜냐하면 학습 데이터에 너무나 잘 들어맞는(over-fitting) NN을 가지고 일반적인 데이터에 적용하면 분류 혹은 검출률이 낮을 수 있기 때문입니다. 반대로 적당히 학습되어있는 경우(under-fitting)엔 반대의 경향이 나타날 수 있습니다. 그래서 학습할 목적에 따라 오검출율(FAR-False Alarm Rate)이 얼만큼 허용 되는지 판단해야 할 수 있습니다.

 C# 예제를 게시한 MSDN Magazine이 있어서 이 곳을 소개합니다. 참고하시면 좋을 것 같습니다.

 http://msdn.microsoft.com/en-us/magazine/jj658979.aspx