기본 콘텐츠로 건너뛰기

공부: Multiple View Geometry (3)

Multiple View Geometry Study Note 2. Projective Geometry and Transformations of 2D (Cont.2) 첫번째로 맡게된 발표에서 다룬 내용은 Projective transformation 된 영상에서, 원영상의 Affine properties와 Meric properties를 회복시켜서 원영상의 모양을 복원하는 주제입니다.  이전의 개념들을 사용하여 실질적인 목적을 수행하는 내용으로 중요한 내용입니다. 발표준비를 하면서 몇일 밤을 새면서 공부했는데, 공부하면 할 수록 너무 재밌는 내용입니다.  이전에 머릿 속에 대강 있던 이차원 공간상의 여러 기하학적 개념을 구체화 하고,  수학이란 툴을 사용해서 실제 영상에 적용하는 이론을 배웠습니다.  여태 살아오면서 가장 열심히 공부했던 것 같습니다.  그럼, 내가 준비한 발표자료와 간단한 설명을 정리해보겠습니다.  따끈따근한 오늘 발표의 포스팅입니다. 이 발표에서는 Projective Transform된 이차원 영상의 특성과 그것을 복원하는 복원할 때 어떤 접근 방법들이 있는지 알아보겠습니다. Projective Transform은 카메라, 극단적으로 우리 시각에서도 항상 일어나는 개념으로 모두가 잘 알고 있을 것으로 생각됩니다.  이제 시작할 이야기를 이해 하시려면 지난번 MVG(2)의 개념들을 알고 있어야합니다.  영상의 기하학적인 성질은 크게 두가지로 나눌 수 있습니다. 첫번째로 Affine properties는 선의 평행성, 평행선 끼리의 길이 비율 입니다. Affine properties는 line at infinity와 밀접하게 연관하여 결정되는 것으로, line at infinity를 실선으로 매핑시키는 Projective transform 성분중 Hp으로 특성이 왜곡됩니다. 두번째로 Metirc properties는 선과 선 사이의 각도와 선 끼리의 길이비율 입니다.
최근 글

Bayes theorem

베이즈 이론은 조건부확률에 대한 수학적 정리이다. 곱씹으면 곱씹을수록 재미있고 신기하게 느껴진다. 이게 깨달음의 즐거움일까? 베이즈가 목사였다는 것, 그리고 수학속에서 그의 철학도 유추해 볼 수 있다는 것 도 참 흥미롭다. 대학교에 다시 가고 싶은 마음이 든다.(?) A가 일어났을 때, B가 일어날 조건부 확률을 알고 싶다. 그러나 우리가 가진 정보는 A가 일어날 확률, B가 일어날 확률, 그리고 B가 일어났을 때, A가 일어날 조건부 확률 뿐 이다. 이 때 아래 그림과 같은 방법으로 A가 일어났을 때, B가 일어날 조건부 확률을 계산 할 수 있다. 위 그림을 참고해서 보면, Prior probability(사전확률): 관찰자가 이미 알고있는 사건의 확률 Likelihood(우도): 이미 알고 있는 사건이 발생한 조건으로 다른 사건이 발생할 조건부 확률 Posterior probability(사후확률): 다른 사건이 발생한 조건으로 이미 알고 있는 사건이 발생한 조건부 확률로서, 사전확률과 사후 확률로 부터 알 수 있는 알고자 하는 확률 Marginal probability(주변확률): 다른 사건이 발생할 확률 흥미로운 실제 사례 병원에서의 질병 A에 대한 진단장비의 정확도 90%, 그리고 질병 A에 걸릴 확률 1%... 진단장비 사용결과 A질병 양성반응일 때의 진짜 질병A에 걸렸을 확률은?  8.3% SLAM Course - WS13/14 (Cyrill Stachniss @Freiburg) 위 강의는 내가 대학생때 많은 도움이 되었던 강의로 강의 주제 중 3강에서 Recursive bayes filter를 사용해서 로봇의 현재위치를 예측하는 방법을 다루고 있다. (Observation 'z' 와 Control 'u', 현시점 위치 x t ) 

Gaussian distribution(Normal distribution)

PDF & CDF를 훑으면서 정규분포(가우스 분포)에 대해서 간략히 보았다.  정규분포(normal distribution) 많은 통계적 분석에서는 오차가 정규분포를 따름을 가정하고 있다. 그리고 다양한 자연법칙 및 측정할 수 있는 대상들 (몸무게, 혈압, 키 등...)도 정규분포를 따른다고 한다. 정규분포의 모양은 평균을 중심(line of symmetry)으로 좌우가 대칭이다. 데칼코마니를 생각나게 하는 모양으로 접힌 선을 중심으로 좌우에 50%씩 분포하고 있는 모양이다.  중간으로 부터 양쪽 1시그마(표준편차)의 경우 68%, 2시그마는 95%...  이걸 68-95-99.7 Rule이라고 부르기도 한다고 한다네 Francis Galton : ball machine 같은 분포를 가진 여러 확률변수들의 평균의 분포는 가우시안 분포는로 근사할 수 있으며(중심극한값 정리, Central limit theorem), 다양한 경우의 모집단의 샘플이 많으면 가우스 분포로 근사할 수 있다.  ( 정규분포 on 네이버 지식백과 , Normal distribution on Wiki ) 정의는 네이버 지식백과나 위키피디아를 참고하면 전공서를 보는 듯이 자세하게 잘 설명되어있다. 가우시안 분포의 확률변수는 아래와 같다. 연관된 툴들을 조사해보면 먼저 가우시안 필터가 떠오른다. 필터의 중심에 가중치를 두고 사방으로 가우시안 분포로 가중치를 둔 필터이다.  행렬 값을 보면 유추할 수 있듯이 중심을 도드라지게 하고 나머지를 블러시켜주는 효과를 주게 된다. 아래와 같은 예시가 있겠다.  추가적으로, SLAM 공부를 할때 베이즈 추론에서 정규분포의 어떤 특성이 부각되었던 기억이 있는데 희미하게 남아있다. 

Probability density function(PDF)와 Cumulative distribution function(CDF)

1. PDF '확률밀도함수(PDF)란 정규화(Normalize)된 연속변수에 대한 히스토그램이다.' 확률 밀도란 연속 확률 변수가 일정 구간에 포함될 확률을 확률밀도라고 한다. 이를 함수로 나타내는 PDF는 위의 성질을 만족해야한다. Histogram란, 도수 분포의 상태를 기둥 모양의 그래프로 나타낸 것. 즉 각 데이터들의 갯수를 세어 본 것이다. 여러 예시가 있겠지만, 나는 사진을 좋아해서 위 사진을 참고하면, 포토샵에서 볼 수 있는 히스토그램이다. 이미지의 각 색상, 또는 밝기의 데이터의 범위는 0부터 255까지라고 하면 값이 0인 것, 1인 것, ... , 254인 것, 255인 것의 갯수를 세어서 막대 바 모양으로 그래프를 그린다.(정수만 생각해보자) Normalize란, 다 더했을때 1이 되게 맞춰주는 것 이다. 사진의 해상도가 256x256이라면 각 바의 값을 픽셀 수만큼 나누어 주면 되겠다. 값이 200인 Red의 개수가 100개였다면, 100/65536가 될 것이고 각각의 바를 다 더하면 1이 된다. 이 PDF를 f(value)라고 명명하고, 픽셀의 값이 이산적인 경우(1,2,3, ... ,254,255)에는 이 사진의 어떤 픽셀의 Red값이 200일 확률은? 이라는 질문에  f(200)가 답이라고 할 수 있을 것이다(bar의 가로 길이가 1임). 이렇게 셀수 있고 유한한 변수의 경우에는 확률 질량 함수(probability mass function) 이라고 부르며 아래를 만족해야한다.. ①  f(x) ≥0, ② ∑ f ( x )=1, ③  하지만, 데이터가 연속적이거나 레졸루션( δ ) 을 고려해야한다면 질문자체가 Red값이 200  + δ 일 확률은? 이라고 물어야하고 그 의미를 포함하는 바의 면적을 확률로 답해야 할 것이다.   2. CDF 'PDF를 누적하면 CDF(누적 분포함수)' CDF는 PDF를 누적한 것이다. 즉 PDF를

중심 경향(Central Tendency)그리고 중간 값의 종류

통계학에서의 중심경향이란 확률분포에서의 중심을 의미하는데 평균, 중심, 중간, 최대빈도 값 등등 어떤 것으로 규정할지 헷갈린다. 가장 익숙한 것이 Mean(평균), Median(가운데), Mode(최빈값)이다. 유추할 수 있겠지만, 아래 예시로 다시 한번 확인해보자. data:      1-1-2-3-4-5-6-6-6-10-10 counter: 1-2-3-4-5-6-7-8-9-10-11 Counter는 어디가 가운데인지 측정하기 위한 '자'라고 생각하면 된다. 각각을 계산해보면,                                   Mean: (1+1+2+3+4+5+6+6+6+10+10) / 11 = 4.9                                    Median: date_6 = 5                                    Mode: 6 참고로 정규분포(normal distribution)의 경우에는 아래와 같은 모양일 것이다.

2015.08: 3D Printed Rototic Hand and Its Remote Control - (리눅스/윈도우즈 소켓 프로그래밍)

립모션을 사용한 로봇손 제어 프로젝트에서 활용하기 위해 소켓 프로그래밍을 구현하게 되었다. 사용자 손 값을 받는 쪽은 윈도우즈 상에 구현되어있고, 로봇 손 하드웨어 제어 부분은 리눅스에 구현되어 있다. 소켓프로그래밍도 기억이 잘 안나고 윈도우즈와 리눅스 사이 통신이 어떻게 되는지 막막했지만, 여러 샘플들이 많이 나와있어서 정리해봤다. 리눅스 서버 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> void error( char *msg ) {   perror(  msg );   exit(1); } int main(int argc, char *argv[]) {      int sockfd, newsockfd, portno = 27015, clilen;        ///socket      char buffer[512];      struct sockaddr_in serv_addr, cli_addr;           int n;      int iter=0;      int data;      int rBuffer[512];      int sBuffer[512];      int *temp;      int length;      printf( "using port #%d\n", portno );        sockfd = socket(AF_INET, SOCK_STREAM, 0);            ///socket      if (sockfd < 0)          error( cons

2015.08: 3D Printed Robotic Hand and Its Remote Control - (립모션, 벡터의 내적과 외적)

Processing.org 3년전, 핀란드에서 연구교환 프로그램을 할때, 3D 휴머노이드 로본 손 개발 프로젝트에 참여했다. 즐거운 여름이였다. 나는 비전 기반의 제스쳐 인식 및 액츄에이터 제어부로 값을 전달해주는 기능을 구현했다. 먼저 프로세싱으로 테스트를 해보았다. LeapMotion SDK와 onformative에서 배포하는 LeapmotionP5 라이브러리를 사용했다. 3D 좌표 그리고 내 손 웹캠 -> 키넥트 -> 립모션으로 신기하게 나의 분야가 연결되어가는 맛이 아주 재밌다. 2년만에 다시 해봐서 더 재미있는 것 같다. 립모션 라이브러리는 당시 크게 LeapmotionP5와 LeapmotionforProcessing이 오픈되어 있었던 것으로 아는데, 기본적으로 제공하는, 접근할 수 있는 가능성을 후자가 더 많이 주는 것 같다. 나는 LeapmotionP5로 시작했다. 손목과 팔 사이의 각도를 구하는 도중, 벡터의 내적만 사용하면 부호 없는 각도값만 얻는다.  이때 벡터의 외적과 다른 벡터의 y-basis를 내적하면 부호를 알 수 있다. 외적에는 순서(오른손 법칙)가 있어서, 각도가 양에서 음으로 또는 음에서 양으로 바뀌는 순간 외적벡터의 방향이 바뀌기 때문이다. 그림을 그려보면서 해보면 이해가 쉽다. Leap::Vector xBasisArm = basis.xBasis;           const Vector armV = arm.direction();         const Vector handV = hand.direction();         float wristAngle2 = handV.angleTo(armV) * RAD_TO_DEG;         Vector crossWrist2 = armV.cross(handV);         int sign2 = (crossWrist2.dot(xBasisArm) >= 0) ? -1 : 1; 계산을 위해 간