2014년 9월 16일 화요일

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년 9월 11일 목요일

Dyson360eye

Dyson360eye

다이슨 로봇청소기


 세계적인 진공청소기 업체인 다이슨에서 360도 카메라를 장착한 청소기를 출시했다고 합니다. 9월 4일이 일본에서 제품 발표회를 한 것 같은데 벌써 며칠 지났습니다. 16년간 2800만 파운드를 들여서 개발했다고 하는데, 정말 성능이 궁금하네요.

 집에서 청소 로봇을 하나 들여 쓰고 있는데, 엔지니어 입장에서 봐도 답답한 구석이 있었습니다. 일반 가정주부의 눈에는 매일 같은 곳에 처박혀 있는 모습을 보면 한심해 보일만도 합니다. 데모 동영상에서 가구의 코너를 검출하고 추적하는 모습이 나오는데, 실제로 visual slam을 적용한 것으로는 첫 번째 상용화 제품이라고 할 수 있을 것 같습니다. 기존에 삼성, LG에서도 천정 카메라를 이용해서 위치 인식을 하는 제품이 있었지만, 사용해본 결과로는 정말 위치 인식을 하고 있는 것이 맞는지 의심스러운 적이 많았습니다. 실제 가정에서 사용하려면 다양한 가구에 따라 끼임이나 바퀴의 들림처럼 오도메트리가 매우 부정확해질 수 있는 경우에 대처가 있어야 할 것인데 기존의 제품은 그런 정도의 성능이 보장되지는 않는 것 같아 보였습니다.

 Dyson360eye를 가지게 된다면 kidnap으로 부터 복귀하는지 테스트해봐야겠습니다. 재미있을 것 같습니다. 몇 달 간 청소한 집을 오늘 다시 하는데, 잠시 다른 방으로 옮겨 놓는다고 헤매고 있으면 16년 동안 개발한 것 치고는 조금 부족할지도 모르겠다는 생각이 듭니다.

The Image of the Absolute Conic


The Image of the Absolute Conic

절대 원뿔 곡선의 사영

 한글로 써보지 않은 용어들은 항상 어색합니다. '절대 원추 곡선의 사영' 역시 마음에 들지 않네요. IAC(Image of Absolute Conic)은 Geometry에서 무척 중요한 영역을 차지합니다. 한글로 쉽게 접근할 수 있는 문서는 없는 것 같아서 글을 적어봅니다. 개인적인 재 해석을 통해서 쓴 글들이니 감안하여 참고해 주시기 바랍니다.


1.     Conic section(원추 곡선)
Geometry에는 conic section이라는 것이 있습니다. 그림처럼 두 개의 원뿔을 마주보게 놓은 형태인데, 이것의 단면을 어떻게 자르는가에 따라 2차 곡선이 만들어집니다. Parabola, Circle, ellipse, Hyperbola가 그것입니다.
Conic sections with plane.svg
"Conic sections with plane" by Pbroks13 - Own work. Licensed under CC BY 3.0 via Wikimedia Commons.
 Projective geometry에서는 Conic section은 다음과 같이 정의됩니다.

\(ax^2+bxy+cy^2+dx+ey+f=0\) - ①

 Projective space, \(\mathbf{P}^2\)에서는 마지막 행에 비율에 관한 하나의 차원이 추가 되므로, \(x, y\)를 각각 \(x_1/x_3, x_2/x_3\)로 표현할 수 있습니다. 영상이라는 센서가 3차원 공간을 2차원 영상 평면에 투영 시키는 과정을 상기해보면 자연스럽습니다.

 하나의 카메라로 바라본 영상은 내부 변수를 알기 전까지는 작은 물체가 바로 앞에 있는 것인지, 커다란 물체가 저 멀리 있는 것인지 판단할 수 없습니다. 그러한 모호성을 해결해주는 항이 \(x_3\)이라고 보시면 될 것 같습니다.

 식 ①을 다시 써보면,

\(ax_1^2+bx_1x_2+cx_2^2+dx_1x_3+ex_2x_3+fx_3^2=0\) - ②

 식 ②와 같이 되고, Matrix form으로 만들어 보면

\(\mathbf{x^TCx} = 0, \mathbf{C} = \left[\begin{array}{ccc}a & \frac{b}{2} & \frac{d}{2} \\ \frac{b}{2} & c &\frac{e}{2} \\ \frac{d}{2} & \frac{e}{2} & f \end{array}\right]\) - ③

 식 ③과 같이 정리할 수 있습니다.

 이제 본론으로 들어갈 준비가 다 되었습니다.

2.     IAC(Image of Absolute Conic)
이제 AC(Absolute Conic)를 만날 시간입니다. AC는 무한대의 평면에 있는 conic입니다.
무한대의 평면에서 영상 좌표계로 투영된 AC와 IAC
우리 주변에서 찾을 수 있는 예를 들어보겠습니다. 자동차를 타고 달리면서 보름달을 보면 달의 위치는 변하지 않는 것처럼 보입니다. 차의 이동 거리(translation)보다 달의 위치가 절대적으로 멀리 있기 때문입니다. AC는 이보다 더 일반화된 개념입니다.

 이런 불변 특성은 아주 중요한 역할을 합니다. 무한대의 점(vanishing points) 2개를 알고 있으면 무한대의 직선(vanishing line)을 얻을 수 있고 무한대의 직선 2개가 이루는 평면이 무한대의 평면(plane at infinity)이기 때문에 영상에서 변하지 않는 특성을 가지는 무언가를 얻어낼 수 있다는 것을 암시하기 때문입니다. 잘 아시는 것처럼 무한대의 점은 평행한 두 직선이 만나는 점에서 얻을 수 있습니다.

 projective geometry에서 어떻게 활용되는지 보겠습니다. 직관적으로 움직임에 영향을 받지 않는 요소가 무엇인지 생각해보면 카메라 내부 변수(카메라 캘리브레이션)인 것을 떠올려 볼 수 있습니다.

 무한대의 평면은 projective geometry에서 다음과 같이 정의됩니다.

\(\mathbf{\pi}_{\infty} = {(0, 0, 0, 1)}^T\)

 그러면 무한대의 평면의 점 \(\mathbf{X_{\infty}}\)을 이미지 평면에 투영된 점, \(\mathbf{x}\)로 변환하는 projection matrix \(\mathbf{P}\)와 다음의 관계가 성립됩니다.

\( \mathbf{x} = \mathbf{PX_{\infty}} \)

 여기서 카메라 projection matrix는 카메라 외부 변수 \(\mathbf{R, t}\)와 내부 변수 \(\mathbf{K}\)로 나누어 쓸 수 있으므로 다음과 같이 쓸 수 있습니다.

\( \mathbf{PX_{\infty}} = \mathbf{KR[I|-\tilde{C}]}\left[\begin{array}{c}\mathbf{d} \\ 0 \end{array}\right] = \mathbf{KRd} \)

 여기까지 도출하고 나면 무한대의 평면과 이미지 평면의 관계는 homography인데 \(\mathbf{KR}\)과만 관계 있다는 것을 알 수 있습니다. 그런데 duality property로 부터 dual conic과의 관계를 이용하면 무한대 평면의 AC의 투영인 IAC는 \(\mathbf{K}\)하고만 관계가 있다는 것을 얻어낼 수 있습니다. 결국 IAC는 다음과 같이 정리됩니다.

\( \omega = \mathbf{(KR)^{-T}}\mathbf{I}\mathbf{(KR)}^{-1}=\mathbf{K^{-T}}\mathbf{RR}^{-1}\mathbf{K}^{-1}=(\mathbf{KK^T})^{-1} \).

 AC와 IAC의 실제 형상을 자꾸 떠올리는 것은 별로 의미가 없습니다. circular points와 같이 실제 하지 않는 가상의 것이기 때문입니다.

2014년 9월 2일 화요일

해시계의 원리와 컴퓨터 비전 응용 #2

해시계의 원리와 컴퓨터 비전 응용 #2

Computer vision applications and the principle of the sundial #2

  1. 해시계(Sundial) - 해시계의 원리와 컴퓨터 비전 응용 #1
  2. 컴퓨터 비전 응용
 해시계는 태양의 위치(혹은 태양의 위치로부터 얻어진 그림자)를 통해 시간을 측정하는 장치 입니다. 그러면 거꾸로 시간으로부터 태양의 위치를 혹은 지구상의 위치를 결정할 수 있지 않을까요?

 해시계의 원리를 분석해 보면 답이 보입니다. 시간을 알기 위해서는 지구상의 위치를 알아야만 합니다. 적도에서 태양의 위치와 극지방에서 태양의 위치는 같은 시간에도 완전히 다르기 때문입니다. 시간을 알기 위해서 알아야 하는 요소는

  • 위도, 경도
  • 진북 방향
입니다.

 '앙부일구'로 시간을 측정할 때 진북 방향으로 향하게 두고, 그림자의 방향과 길이를 보면 절기와 시간을 알 수 있습니다. 우리나라의 서울은 자북과 진북의 차이, 자편각이 서쪽으로 약 7.57도 발생하니 이것을 보정해주고, 동경(도쿄)과 같은 시간대를 사용하는 GMT+9이므로 실제 서울의 동경 127도 보다 빠른 시간대를 사용하기 때문에 이것까지 보정해주면 태양시를 우리가 현재 사용하는 시간으로 구할 수 있습니다.

 그러면 거꾸로 시간이 주어지면 어떨까요?
  • 날짜, 시간
  • 진북 방향
이 주어지면 위도, 경도를 알 수 있지 않을까요? 세상은 참 넓고 사람은 많습니다. 그런 생각을 한 사람이 있었습니다.
Junejo, Imran N., and Hassan Foroosh. "GPS coordinates estimation and camera calibration from solar shadows." Computer Vision and Image Understanding 114.9 (2010): 991-1003.
 인기 있는 연구 분야는 아니어서 인용은 많이 되지 않았지만 생각을 실제로 구현한 것은 충분히 훌륭한 일이라고 생각합니다.

 두 개의 지면에서 수직한 물체기 있는 경우 두 물체가 그리는 포물선의 중심을 연장한 지점이 만나는 곳이 정남향이 됩니다. 현재 그림자의 위치와 물체의 끝점을 연장한 곳에는 태양이 있을 겁니다. 기존의 방대한 데이터로부터 우리는 어떤 시점에 태양이 위치해야 하는 곳을 알고 있기 때문에 그것에서 위치를 결정할 수 있습니다. 년중 단 두 번의 모호함이 있는데 춘분과 추분입니다. 태양의 8자 궤도가 만나는 점입니다.

2014년 9월 1일 월요일

해시계의 원리와 컴퓨터 비전 응용 #1

해시계의 원리와 컴퓨터 비전 응용 #1

Computer vision applications and the principle of the sundial #1

  1. 해시계(Sundial)

 잘 알고 계시는 것처럼 태양의 위치를 통해서 시간을 알기 위한 장치입니다. 과학 시간에 배우던 내용들이 기억이 잘 나지 않지만 자세히 알고 보면 천체의 운동을 오랜 옛날 어떻게 그렇게 정확하게 알고 있었는지 신기하기만 합니다.

Louxor obelisk Paris dsc00780.jpg
"Louxor obelisk Paris dsc00780". Licensed under CC BY-SA 3.0 via Wikimedia Commons.
 해시계의 기원은 고고학의 기록으로 기원전 3500년경 오벨리스크(obelisks)로 알려져 있습니다. 태양신을 숭배하던 기원전을 생각하면 하나의 커다란 돌기둥으로 만들어 놓은 오벨리스크는 권위를 상징하는 것이었을 거라고 추측됩니다. 오랜 시간의 역사처럼 해시계의 종류와 형태는 변화무쌍합니다. 지면에 수직인 형태뿐 만 아니라 반지 형태, 목동의 시계로 불리는 원기둥 형태, 최근엔 디지털 해시계도 등장했습니다. 지금은 세슘 원자 시계처럼 엄청난 정확도를 가진 것이 출현했지만 17세기만 해도 기계식 시계보다 해시계가 정확했다고 합니다.
http://www.qwerty.co.za/sundials/types/poledial.html
 고대의 사람들은 아마도 그림자의 길이로 시간을 측정했을 것으로 생각됩니다. 그러나 조금만 생각해보면 지면에 수직으로 세워진 해시계는 정확한 시간을 측정할 수가 없습니다. 계절에 따라서 그림자의 길이와 방향이 달라지기 때문입니다. 거기에 우리의 지구는 정확한 구도 아니고 타원체도 아닌 형태를 띄고 있고, 지구의 공전 궤도 또한 타원 운동이기 때문에 년 중 태양을 기준으로 한 하루의 길이는 모두 다릅니다. 아래 그래프에서 보는 것처럼 하루가 24시간에서 몇 분 정도 긴 날도 있고 짧은 날도 있습니다.


Equation of time.svg
"Equation of time" by Equation_of_time.pngUser:Drini derivative work: Zazou (talk) - Equation_of_time.png. Licensed under CC BY-SA 3.0 via Wikimedia Commons.
 이러한 차이는 'Analemma'라고 하는 아름다운 8자형 고리를 만듭니다. 일 년 동안 같은 자리에서 같은 시간에 찍은 태양의 위치를 연결하면 아래 그림처럼 형성됩니다.

"Analemma fishburn" by Jfishburn - photo taken in 1998-1999 of analemma from office window of Bell Labs, Murray Hill, NJ.. Via Wikipedia.
"Qzss-45-0.09" by Tubas - {Systems Tool Kit (STK) - Analytical Graphics Inc www.agi.com}. Licensed under CC BY-SA 3.0 via Wikimedia Commons.

 이 8자형 고리를 이용한 지면에 수직으로 세워진 형태의 해시계를 'Analemmatic sundial'이라고 부릅니다. 따로 정확한 시침(Gnomon)이 필요 없이 사람이 서서 재는 형태의 것들도 있습니다.
"Zonnewijzerherkenrode" by Willy Leenders - Own work. Licensed under Public domain via Wikimedia Commons.
 우리나라의 솥모양의 해시계 '앙부일구'는 이러한 천체 운동의 원리가 정확히 반영되어 있습니다. '앙부일구'에서 시침은 우리나라의 위도만큼 지면과 각을 이루고 있습니다. 그렇기 때문에 그림자의 길이가 계절과 관계없이 같은 방향을 가리킵니다. 반원구에 단면이 포물선 모양이라는 것은 태양의 그림자가 바닥에 그리는 궤적을 관찰하여 얻은 것이라고 생각해보면 선조들의 지혜를 엿볼 수 있습니다.
"Qzss-45-0.09" by Tubas - {Systems Tool Kit (STK) - Analytical Graphics Inc www.agi.com}. Licensed under CC BY-SA 3.0 via Wikimedia Commons.
 앙부일구에는 24절기가 표기 되어 있어 계절에 따른 태양 위치 변화에 관계 없이 시간을 읽을 수 있도록 되어 있습니다.

해시계의 원리와 컴퓨터 비전 응용 #2

2014년 8월 29일 금요일

협업 필터링과 추천 시스템으로 내일 뭐 먹을지 결정해보기

협업 필터링과 추천 시스템으로 내일 뭐 먹을지 결정해보기

Collaborative Filtering and Recommendation System

 한글로 적어 놓고 나니 왠지 어색합니다. 협업 필터링(Collaborative Filtering)과 추천 시스템(Recommendation System)은 밀접한 관련이 있고, 우리가 모르는 사이에 매일 이것을 이용하고 있습니다. 실제로 Amazon에서 구매하는 물건의 약 35%가 추천으로부터 발생하고, Netflix의 영화 대여도 2/3 정도가 추천에 의해서 발생한다고 알려져 있습니다. 한국에서도 ‘와챠’라는 모바일 앱이 개인화된 추천 서비스를 제공함으로써 기존의 영화 리뷰 시장을 뒤흔들었습니다. 이 글에서는 추천 시스템 중에서 협업 필터링의 개념을 이용해서 ‘내일 뭐 먹을까?’를 결정해보는 간단한 예시를 통해 접근하고자 합니다.

 여기에서도 SVD를 적용합니다. SVD는 singular value가 큰 순서로 정렬되는 형태이므로, 중요한 정보를 압축할 수 있는 특성을 가진다는 것을 알고 있다면, Low-rank approximation으로 분류를 하는데 활용할 수 있다는 것도 생각해 볼 수 있습니다. 다시 말하면 eigenvalue가 큰 것들은 어떤 자료에서 중요한 의미를 지니는데, 그에 해당되는 eigenvector들은 모두 orthogonal합니다. orthogonal하다는 말은 직교한다는 말하고 비슷한데, 그릴 수 없는 3차원을 넘어가는 다차원에 대해서도 일반화된 개념입니다. 내적이 ‘0’이므로 서로 겹치는 부분이 없습니다. 어떤 자료를 SVD한다는 말은 결국 중요한 의미를 지니는 eigenvector공간으로 재 투영한 값들로 재구성한다는 의미로 해석하면 될 것 같습니다.

 예를 들자면, 어느 학교의 학생에 대한 정보가 몸무게, 손가락 길이, 키로 각각 주어진다고 가정해보겠습니다. 그러면 3차원 공간에 데이터를 그려볼 수 있습니다. (1,0,0)(0,1,0)(0,0,1)-x, y, z-몸무게, 손가락 길이, 키를 기저 벡터로 하는 공간에 그리는 겁니다. 그런데, 만약에 키가 모두 비슷한 학생들만 다니는 학교라고 하면 z축은 별로 의미가 없어 집니다. x-y평면에 투영해서 봐도 3차원 공간의 데이터와 별로 손실이 없을 수 있다는 의미입니다.

 추천 시스템에 활용하는 간단한 예시를 들어보겠습니다.

 어떤 모임에 4명의 사람이 있었는데, 새로운 사람이 들어온 경우에 그 사람이 어떤 성향을 가지는 사람인지 판단하고 메뉴를 추천해주는 것을 생각해 볼 수 있습니다. 아래 표와 같은 정보가 주어진다고 가정해보겠습니다.


Korean Cuisine
Pizza
Hamburger
Chinese Cuisine
A
9
2
1
8
B
8
5
6
10
C
7
9
8
9
D
2
3
4
8

 데이터를 직관적으로 관찰해보면 중국 요리는 대부분의 사람이 좋아하고 피자를 좋아하는 사람은 대체로 햄버거도 좋아한다는 특성을 관찰할 수 있습니다.

 새로운 멤버 E와 식사를 하러 가야 하는데, 그날 마침 한국음식과 햄버거 중에 결정해야 하는 상황이라면 E는 어떤 음식을 더 좋아할까요?


Korean Cuisine
Pizza
Hamburger
Chinese Cuisine
A
9
2
1
8
B
8
5
6
10
C
7
9
8
9
D
2
3
4
8
E
?
9
?
7








 SVD를 이용한 Low-rank approximation으로 추정해볼 수 있습니다. Rank 3으로 줄이면 아마도 한국음식, 피자, 햄버거와 비슷한 방향을 가지는 기저 벡터 공간에 재 투영될 것을 예측할 수 있습니다. 다음 예시를 참고하여 주시기 바랍니다. 

 협업 필터링 예제

E가 평가를 하지 않은 빈 곳에 대해서 평균으로 채우고 Low-rank approximation을 수행해보면 이 사람은 아마도 햄버거를 더 좋아하는 사람인 것 같습니다.

 실제 시스템에서는 고려해야 할 사항이 훨씬 더 많을 것입니다. 왜냐하면 SVD의 연산 복잡도는 선형으로 증가하지 않기 때문에 100만명의 회원이 있을 경우에 간단한 방법으로 해결할 수 없을 것입니다. 의도적으로 데이터에 손상을 가하려는 사람들(평점을 일부로 높게 주거나 낮게 주는 사람들)이 있을 수도 있고 개인적인 성향에 따라 평점이 후한 사람도 있고 그렇지 않은 사람도 있을 것입니다.