2014년 9월 24일 수요일

베니스와 비첸차 여행 #1

물의 도시 베니스

 베니스로 들어가는 관문 마르코 폴로 공항은 별로 복잡하지 않으나 깔끔한 느낌이다.


 베니스는 영어식 발음이고 이탈리아어로는 베네치아 (베니찌이아~ 정도로 발음)다. 베니스 여행을 위한 숙박은 베니스 본섬을 이용해도 되지만 베니스만 관광할 것이 아니라면 섬 밖의 메스트레 정도에서도 훨씬 저렴한 가격에 이용할 수 있다. 근교의 지역인 파도바와 비첸차에도 더 가까우니 추천한다.

 베니스에 도착하면 처음에 보이는 것이 전부 물이라서 적잖이 당황하게 된다. 베니스의 상인과 베니스 영화제로 우리에게 친숙한 이곳은 본래 이탈리아에 속하기 전에 독립국가로 오랫동안 존재했고 지중해 항로를 바탕으로한 상업과 유리세공, 레이스 가공 장인들이 살던 섬들로 이루어져 있다.




 베니스 본 섬의 한가운데 자리하고 있는 산마르코 스퀘어를 일단 보고 본격적인 이야기를 시작하는 것이 좋을 것 같다. 그 만큼 산마르코 광장은 베네치아 사람들에게 의미있는 곳이다.



EKF vs. UKF 비선형 상태 변환 성능 비교

 필터에서 상태 천이 함수가 선형인 경우엔 Kalman filter를 사용합니다. 상태 천이 함수가 비선형인 경우에는 EKF, UKF, PF를 사용하게 되는데, 이 때 간단한 비선형 천이 함수를 이용하여 EKF와 UKF의 성능이 어떤 차이가 발생하는지를 확인해보고자 합니다.

 다음에 제시한 예제는 \(x, y\) domain에서 \( \rho, \theta \)로 변환하는 기본적인 비선형 천이 함수를 이용해 EKF와 UKF가 예측한 \(2\sigma\)를 표현한 타원을 보면 직관적으로 그 차이를 이해할 수 있습니다.

 http://refopen.blogspot.com/2014/09/ekf-vs-ukf.html

 Magnus Nørgaard는 derivative-free filter인 UKF가 taylor series의 2차까지 근사화하므로 비선형 함수에서 더욱 정확한 성능을 보장한다고 주장했습니다.


EKF vs. UKF 비선형 상태 변환 성능 비교 예제

filterComparison

Contents

% EKF vs. UKF
% 2014. 9. 24
% refopen.blogspot.com
% This example intuitively shows that the difference between EKF and UKF
% when state transition is non-linear function.

function filterComparison()

Create real data

Create some real data points(1000points)
$$\sigma_x = 5, \sigma_y = 3$$
sigmax = 5;
sigmay = 3;
rx = randn(1000, 1)*sigmax;
ry = randn(1000, 1)*sigmay;

% real data points and MLE parameter estimation
figure(001);
plot(rx, ry, 'r.');
xlabel('x');
ylabel('y');
axis([-15 15 -15 15]);
[x, P] = MLEnPlot(rx, ry);
$$r = \sqrt{x^2+y^2}$$
$$\theta = tan^{-1}\frac{y}{x}$$
figure(002);
rho = sqrt(rx.^2 + ry.^2);
theta = atan2(ry, rx);
plot(rho, theta, 'r.');
xlabel('\rho');
ylabel('\theta');
MLEnPlot(rho, theta);
fprintf('press any key to continue...\n');
pause;
press any key to continue...

Extended Kalman Filter

Find out jacobian matrix when it transformed by non-linear state transition matrix.
$$J = \left[\begin{array}{cc} \frac{\partial r}{\partial x} & \frac{\partial r}
{\partial y} \\ \frac{\partial \theta}{\partial x} & \frac{\partial
\theta}{\partial y} \end{array}\right]$$
Now, prediction of covariance matrix at the pridiction step $P_{r\theta}=JP_{xy}J^T$
q = x(1).^2 + x(2).^2;
J = [x(1)/sqrt(q) x(2)/sqrt(q); -x(2)/q x(1)/q];

xekf = [sqrt(x(1).^2 + x(2).^2) atan2(x(2), x(1))];
Pekf = J*P*J';

% draw ellipse
e = make_covariance_ellipses(xekf, Pekf);
hold on; plot(e(1, :), e(2, :), 'g-' , 'LineWidth', 3); hold off;
fprintf('press any key to continue...\n');
pause;
press any key to continue...

Unscented Kalman Filter

Set up some values
D = length(x);  % dimension
N = D*2 + 1;
$$ 2n+1 $$ samples are should be generated.
scale = 3;
kappa = scale-D;

% Create unscented sample points
Ps = chol(P)' * sqrt(scale);
ss = [x', repvec(x',D)+Ps, repvec(x',D)-Ps];
$$(x, y) \rightarrow (\rho, \theta)$$
rho = sqrt(ss(1, :).^2 + ss(2, :).^2);
theta = atan2(ss(2, :), ss(1, :));
x = [rho; theta];

idx = 2:N;
xukf = (2*kappa*x(:,1) + sum(x(:,idx),2)) / (2*scale);
diff = x - repvec(xukf,N);  % weighted sample cov.
Pukf  = (2*kappa*diff(:,1)*diff(:,1)' + diff(:,idx)*diff(:,idx)') / (2*scale);

% draw ellipse
e = make_covariance_ellipses(xukf, Pukf);
hold on; plot(e(1, :), e(2, :), 'k-' , 'LineWidth', 3); hold off;
end

function [x, P] = MLEnPlot(x, y)
phatx = mle(x);
phaty = mle(y);
x = [phatx(1) phaty(1)];
P = [phatx(2) 0; 0 phaty(2)];
e = make_covariance_ellipses(x, P);
hold on; plot(e(1, :), e(2, :), 'b-' , 'LineWidth', 3); hold off;
end

from timbailey's matlab utility

function p= make_covariance_ellipses(x,P)
% compute ellipses for plotting state covariances
N= 60;
inc= 2*pi/N;
phi= 0:inc:2*pi;

lenx= length(x);
lenf= (lenx-3)/2;
p= zeros (2,(lenf+1)*(N+2));

ii=1:N+2;
p(:,ii)= make_ellipse(x(1:2), P(1:2,1:2), 2, phi);

ctr= N+3;
for i=1:lenf
    ii= ctr:(ctr+N+1);
    jj= 2+2*i; jj= jj:jj+1;

    p(:,ii)= make_ellipse(x(jj), P(jj,jj), 2, phi);
    ctr= ctr+N+2;
end
end
%
%

function p= make_ellipse(x,P,s, phi)
% make a single 2-D ellipse of s-sigmas over phi angle intervals
r= sqrtm(P);
a= s*r*[cos(phi); sin(phi)];
p(2,:)= [a(2,:)+x(2) NaN];
p(1,:)= [a(1,:)+x(1) NaN];
end

function x = repvec(x,N)
x = x(:, ones(1,N));
end

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에 대해서만 다룹니다.