2014년 9월 25일 목요일

베니스와 비첸차 여행 #2

물의 도시 베니스

 메스트레에서 기차를 타고 바다를 건너면 베니스 산타루치아 역에 도착한다. 베니스역의 광장에는 관광객들로 항상 북적인다. 여기엔 관광객을 상대로 호객행위를 하는 경우도 있으므로 주의가 필요하다.





 당연한 이야기겠지만 베니스에는 차가 없다. 그래서 차도도 없고 차도 대신 모두 배로 다닌다. 택시도 배고 버스도 배다. 그간 수위가 높아졌다는 것을 증명하는 듯 출입구가 물에 잠긴 무시무시한 집도 있다.


 이탈리아에는 베니스 말고도 로마, 밀라노, 피렌체와 같은 유명한 관광지가 너무나도 많다. 그럼에도 불구하고 베니스를 꼭 거쳐가야하는 관광지로 생각하는 이유는 무엇일까? 그건 아마도 베니스가 가지고 있는 수난의 역사에서 비롯되지 않았을까? 베니스는 베네치아 공화국이라는 독립국이었다가 이탈리아에 귀속되기까지 주변 강대국들의 많은 침략을 받았다. 꼭 우리나라처럼 말이다. 문화, 상업의 지정학적 요충지라는 것도 비슷하다.

구글지도에서 본 베니스 본섬
 지금부터 베니스에서 매우 유명한 것들중에 몇 가지만 소개합니다.

리알토 다리(Ponte di Rialto)

 리알토 다리(Ponte di Rialto)가 처음 건축되었던 때는 12세기 후반이었던 것 같다. 처음엔 그냥 물위에 떠 있는 형태였다가 나무로 덮개를 덮은 것에서 현재의 모습으로 변했다. 현재 모습을 디자인 한 것은 안토니오 다 폰테(Antonio da Ponte)이다. 우리에게 유명한 미켈란젤로와 안드레아 팔라디오도 건축을 제안하였으나 결국 안토니오의 제안으로 현재의 모습을 갖추게 되었다.

 베니스하면 떠올려지는 것이 화려한 가면이다. 가면 축제(Carnevale di Venezia)는 사순설 10일 전까지 벌어지는 카니발의 마지막 중에 열리며 신분에 상관없이 즐겁게 즐기던 풍습에서 유래한다. 무척 화려한 가면들이 기념품 점에 전시되어 있다.

리알토 다리

리알토 다리위에 기념품 점

리알토 역
 밤에 본 리알토 다리는 사뭇 다른 느낌이다.



탄식의 다리(Ponte dei Sospiri)

 재판에서 유죄를 선고받은 죄수가 탄식의 다리를 건너면 수용소로 들어가기 전에 마지막으로 세상을 볼 수 있는 돌로 만들어진 창살이 있다. 그나마 죄수를 위한 마지막 배려라고 해야할까? 죄수들이 이 다리를 건너면서 탄식을 하여 이름이 붙여진 다리.

탄식의 다리
 탄식의 다리 밑에서 종이 울릴때 곤돌라를 타고 연인들이 키스를 하면 영원한 사랑을 이루어 진다고 믿는다.

수용소의 모습

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을 학습함으로 인해서 입력값들은 보다 잘 구분할 수 있도록 하는 필터의 값들은 스스로 학습하게 되는 것입니다.