RSS

Category Archives: Projects

Link

Advertisements
 
Leave a comment

Posted by on June 16, 2014 in Computer Vision, Smart Glasses

 
Link

 
Leave a comment

Posted by on June 16, 2014 in Computer Vision, Smart Glasses

 

[review] Inverse Depth Parametrization for Monocular SLAM

발표 : Transactions on Robotics, 2008

제목 : Inverse Depth Parametrization for Monocular SLAM

저자 : Javier Civera, Andrew J. Davison, and J. M. Mart´ınez Montiel

소속 : Universidad de Zaragoza, Spain. (A. Davison은 imperial college).

페이퍼 : http://webdiis.unizar.es/~jcivera/papers/civera_etal_tro08.pdf

동영상 : http://webdiis.unizar.es/~jcivera/videos/civera_tro08_indoors.avi

http://webdiis.unizar.es/~jcivera/videos/civera_tro08_outdoors.avi

http://webdiis.unizar.es/~jcivera/videos/civera_tro08_loop_closing.avi

http://webdiis.unizar.es/~jcivera/videos/civera_tro08_loop_closing_id2xyz_conversion.avi

소스코드 : http://webdiis.unizar.es/~jcivera/code/EKF_monoSLAM_1pRANSAC_1.01.zip

https://svn.openslam.org/data/svn/ekfmonoslam/

이전에 review 했던 논문 “1-Point RANSAC for EKF Filtering. Application to Real-Time Structure from Motion and Visual Odometry” 에 보면 SLAM에서 map point를 inverse depth로 표현했었다.  그래서 덩달아 이 논문도 보게 됬다.

제목 그대로 이 논문의 핵심은 inverse depth이다.  inverse depth를 쓰는 이유를 두 가지들 들어 설명하고 있다.

하나는 SLAM이 주로 실시간 application인 만큼, 새로운 3D point의 기존 map으로의 투입이 빨리 진행되야 한다는 것이다.  기존의 연구들은 3D point의 X, Y, Z 좌표가 어느 정도 확실해 질 때까지 기존 map에 넣지 않고 따로 처리했다고 한다.  그러니까, 그러한 new 3D point들의 카메라 포즈 estimation에 기여하는데 걸리는 시간이 오래 걸리고, 심지어는 영원히 기존 map으로 편입되지 못했다고 한다.

다른 하나는 (결국 비슷한 얘기인데), point at infinity(PAI)는 homogeneous coordinate 형태로 컴퓨터 비젼, 즉 offline Structure from Motion 에서도 아주 중요한 역할을 하는 단서인데, online SLAM에서는 아무런 역할을 못하고 있다는 것이다.  따라서 PAI를 제대로 표현할 방법이 필요하다는 것이다.

일반적인 3D 좌표 표현법을 XYZ 표현(3-vector)이라고 하면, inverse depth representation은 6-vector로서 XYZ representation과 아래와 같은 호환 관계가 있다.

Clipboard04

여기서 x_i, y_i, z_i, \rho_i는 아래 그림에 나타나 있고, \theta_i, \phi_i 는 단위 방향 vector \bf{m}을 결정하는 azimuth와 elevation이다.

Clipboard05

Inverse depth representation를 써야하는 이유에 대해서는 chapter IV의 시작에서 아래와 같은 문장으로 설명하고 있다.  맞는 말이긴 한데 아직 와닿지는 않는다.

The more linear the measurement equation is, the better a Kalman filter performs. This section is devoted to presenting an analysis of measurement equation linearity for both XYZ and inverse depth codings. These linearity analyses theoretically support the superiority of the inverse depth coding.

이에 대한 설명으로 아래 그림을 기준으로 얘기하고 있다.

Clipboard06

 

Kalman filter 특성 상, 모든 관계가 linear하다고 보는데, 첫 번째 view에서 3차원 점의 depth가 Gaussian 분포를 띄면, XYZ representation의 경우 그 분포가 두 번째 view에서 image에 맺힐 때 Gaussian 분포가 되지 않는다.  즉, Gaussian의 mean을 기준으로 perspective에 의해 카메라로 부터 멀리 있는 분포가 두 번째 카메라 view에서 좁은 영역에 맺히고, 가까이 있는 분포가 넓은 영역에 맺힌다.  따라서 (a)처럼 비대칭의 covariance가 나오게 되며, 이는 실제 Kalman filter에서 covariance matrix로 나타낼 수 있는 Gaussian distribution의 표현 역량을 넘어선다.  극단적으로 두 카메라가 서로 수직으로 바라보고 있다면(즉, wide baseline) 이러한 비 대칭성은 사라질 것이다.  하지만 inverse depth representation을 쓰면 Gaussian 분포를 띄는 것은 inverse depth인 \rho이고, depth에 대해서는 그림 (b)와 같이 비대칭 분포를 띈다.  이것이 두 번째 카메라 view의 measurement uncertainty로 전파될 때는 어느정도 대칭인 분포로 전파 된다는 것이다.  암튼 linearity는 있으면 좋은 것이여.

그 measurement uncertainty의 linearity를 수치화 보면, 아래와 같다.

Clipboard07

Clipboard08

 

L_d는 XYZ representation일 때, L_\rho는 inverse depth representation 일 때의 linearity이다.  L은 0 이상의 값이며, 0 일 때 완전히 linear, 값이 커지면 그 만큼 non-linear 해 짐을 나타낸다.  다른 변수들은 일단 제쳐 두고, 두 view 사이의 각도 \alpha만 보더라도 L_d의 경우 \alpha가 작아지면 값이 커지지만, L_\rho의 경우 \alpha가 작아짐에 따라 값이 작아진다.  즉, 아주 smooth하고 천천히 움직이는 camera motion의 경우 inverse depth representation을 쓰는게 해당 3D point의 measurement equation linearity 측면에서 이득을 본다.

하지만 inverse depth representation은 6차원 vector, XYZ representation은 3차원의 vector, 즉 2배 차이가 나고 covariance나 Jacobian matrix에서도 그 만큼 덩치가 커질 테니, 해당 점에 대해서, 어느 정도 wide baseline을 확보하게 되면 XYZ representation으로 바꾸는게 났다고 한다.  이것은 논문 나머지 부분에 나오나, 귀찮아서 오늘은 여기까지…

 

[review] 1-Point RANSAC for EKF Filtering. Application to Real-Time Structure from Motion and Visual Odometry

발표 : Journal of Field Robotics, 2010

제목 : 1-Point RANSAC for EKF Filtering. Application to Real-Time Structure from Motion and Visual Odometry

저자 : Javier Civera, Oscar G. Grasa, Andrew J. Davison and J. M. M. Montiel

소속 : Universidad de Zaragoza, Spain. (A. Davison은 imperial college).

페이퍼 : http://webdiis.unizar.es/~jcivera/papers/civera_etal_jfr10.pdf

동영상 : http://webdiis.unizar.es/~jcivera/videos/jfr10_monocular_plus_odometry.avi

소스코드 : http://webdiis.unizar.es/~jcivera/code/EKF_monoSLAM_1pRANSAC_1.01.zip
https://svn.openslam.org/data/svn/ekfmonoslam/

이 논문의 핵심은, 아니 정확히 말해서 다른 논문과의 차이점은 1-point RANSAC에 있다.  1-point RANSAC을 쓰면 수행시간이 짧아지고, (그 짧아진 수행시간에 random hypothesis를 더 만들어 낼 수 있어서인지) 정확도도 향상된다고 한다.  근데, 정확히 1-point RANSAC의 실체가 무엇인지 애매하게 써 놓고 있다.  SLAM을 업으로 살아온 애들은 이해할 수 있을 지 몰라도, 나처럼 초심자가 그 애매한 말을 머리속에서 컴퓨터 알고리듬으로 구체화하긴 힘들다.

그 애매한 말이 뭔고하니,

As the first key di erence, the starting point is a data set and its underlying model, but also a prior probability distribution over the model parameters. RANSAC random hypotheses are then generated based on this prior information and data points, di erently from standard RANSAC hypothesis solely based on data points.

여기서 말하는 “hypotheses are then generated based on this prior information and data points” 가 문제다.  이게 말이 좋지, 뭘 어떻게 prior info랑 data를 가지고 model instance를 만들라는 거냐?

RANSAC을 설명할 때, 단골 example인 line fitting을 가지고 쉽게 설명한다고 했는데, 역시 그 핵심부분, 즉 하나의 data point와 prior model parameter distribution을 가지고 하나의 line hypothesis를 만들어 내는지는 설명안하고 있다.  ㅅㅂㄴㅁ.

Clipboard01

위 그림은 일반적인 RANSAC을 이용한 line fitting이다.

Clipboard02

위 그림은 1-point RANSAC을 이용한 line fitting으로 왼쪽 처음 그림에 갈색 line이랑 점선으로 된 standard deviation 부분이 prior information을 나타내주고 있다.  이 prior line이랑 점 하나를 이용해서 (원래는 두 점으로 하는 건데) line hypothesis를 만들어 낸다고 한다.

이 부분에 해당하는 pseudo code는 아래 순서도의 line 13에 해당한다.

Clipboard03

논문에서도 역시 line 13에 해당하는 자세한 설명이 없다.  그래서 할 수 없이 소스코드를 보기로 했다.  EKF_monoSLAM_1pRANSAC_1.01.zip 에 들어 있는 matlab code를 보니,  ransac_hypothesis.m 파일에

% select random match
[zi,position,num_IC_matches] = select_random_match(features_info);

% 1-match EKF state update
x_k_km1 = get_x_k_km1(filter);
p_k_km1 = get_p_k_km1(filter);
hi = features_info(position).h’;
Hi = sparse(features_info(position).H);
S = full(Hi*p_k_km1*Hi’ + features_info(position).R);
K = p_k_km1*Hi’*inv(S);
xi = x_k_km1 + K*( zi – hi );

라는 부분이 있다.

코드에서 상황을 보면,

  • camera pose(여기서는 camera-centered라고 해서 world coordinate pose란다. 암튼) : 7차원(position 3차원, quaternion 4차원)
  • camera pose 속도 : 6차원 (position 3차원, orientation 3차원)
  • map point 1개당 : 6차원 (inverse depth representation으로 6차원, 나중에 계산해 줄 때는 Euclidean coordinate로 3차원으로 바꿈)

따라서 map point가 4개이면, 37(= 7 + 6 + 4 * 6) 개의 차원을 갖는 state vector가 형성 된다.

select_random_match()에서 random하게 index하나(여기서는 position)를 고르고, 그 index에 해당하는 measurement 2D point zi(2 by 1)를 구한다.

get_x_k_km1()에서 구한 predicted state vector, x_k_km1 는 37 by 1 vector이고, get_p_k_km1()에서 구한 predicted covariance matrix p_k_km1 은 37 by 37 matrix이다.  hi 는 2 by 1 짜리 predicted measurement point이고, Hi 는 random index에 해당하는 measurement의 Jacobian matrix로 사이즈는 2 by 37이다.  또한 R은 각 점의 measurement에 있어서의 Gaussian noise의 covariance matrix로 2 by 2이다.

따라서, 해당 index, 즉 position에 해당하는 점의 predicted covariance S는 matrix 계산을 통해 [(2 by 37) * (37 by 37) * (37 by 2) + (2 by 2)], 2 by 2 짜리 matrix가 된다.

Gain인 K는 [(37 by 37)  * (37 by 2) * (2 by 2)] matrix 곱을 통해 37 by 2 짜리 matrix가 된다.

최종적으로 prior information x_k_km1과 p_k_km1 그리고 1-point data zi를 가지고 만든 hypothesis 모델 xi는 [(37 by 1) + (37 by 2) * (2 by 1)] 을 통해 x_k_km1 와 같은 사이즈의 37 by 1 짜리 vector가 된다.

음…  옛날에 극좌표계에서 line fitting을 통해서 Kalman filter로 차선 추적하던게 생각난다.  그 때도 RANSAC을 썼었는데, 이 1-point RANSAC을 썼으면 어땠을까 하는 생각이 든다.  그럼 어떻게 될까?  모델 파라미터는 theta와 rho가 될 테고, state vector는 (theta, rho, theta_velocity, rho_velocity)의 4 by 1 vector가 될 것이다.

x_k_km1 는 역시 4 by 1 vector가 될 것이고, p_k_km1 은 4 by 4 matrix가 될 것이다.  이 둘을 가지고 (예를 들어, 95% 신뢰구간에서) line fitting에 쓸 점들을 추리고, 그 점들 중에서 random하게 zi (2D point, 2 by 1 vector)를 선택하면 hi는 2 by 1, Hi 는 2 by 4, S는 2 by 2, 그리고 K는 4 by 2 matrix가 된다.  마지막으로 xi는 4 by 1 짜리 vector로 앞의 두 element인 theta_i, rho_i 를 가지고 직선을 만들면 x_k_km1과 p_k_km1과 하나의 점 zi를 가지고 line hypothesis를 만드는 셈이 된다.  생각해 보니까 상태 x에 point 좌표 정보가 없으니, x랑 measurement h를 연결하는 함수를 만들기가 까다로워 보이긴하다.

 

[review] Towards Semantic SLAM using a Monocular Camera

발표 : IROS 2011

제목 : Towards Semantic SLAM using a Monocular Camera

저자 : Javier Civera, Dorian G´alvez-L´opez, L. Riazuelo, Juan D. Tard´os and J. M. M. Montiel

소속 : Universidad de Zaragoza, Spain.

이 논문은 ‘sematic’에 ‘SLAM’이 붙은 논문이다.  결과 동영상[1]도 있고, 전체적인 방식도 기존의 AR이나 SLAM과 많이 비슷해서, 뭐랄까 가장 선택하고 싶은 논문이다.
한가지 걸리는 것은 저자들이 이 논문 발표하고, 후속 연구가 없이 다른 쪽 연구를 한다는 것이다.  그들을 회의적으로 만든 무엇인가 있나?

아래 그림은 이 논문에서 주장하는 시스템의 전체적인 개요이다.

Clipboard07

PTAM이 크게 camera pose estimation(localization)과 map maintenance의 두 thread로 병렬처리 되었다면, 이 SSLAM은 크게 SLAM thread와 recognition thread로 나뉘어서 돌아간다.  아무래도 인식하는데 시간이 많이 걸릴 테니까…  근데 사실상 그러면 PTAM도 map maintenance가 시간이 오래 걸려서 병렬로 돌렸으니까, 이 거를 3개를 병렬로 돌리면 어떨까?

3차원 물체를 인식하기 위해 물체 모델을 만드는데 있어, face라는 tuple을 도입한다.  Face는 한 마디로 view이다.  즉, face의 구성요소는 3D 물체와 카메라와의 상대적인 pose로 인해 생기는 특징점들의 물체 좌표계내에서의 3차원 좌표들, 그 특징점들의 local feature descriptor들 (such as SURF), 물체 좌표계를 기준으로 한 카메라의 포즈이다.  물론 각 face에서의 특징점들이 planar하진 않지만, 결국 일반적인 planar AR은 물체에 대한 face가 한 개이고, 이거는 입체니까 여러개의 face들로 하는 느낌이다.  이렇게 한 물체에 대해 여러개의 face들을 만들고, 이런 작업을 여러 물체에 대해 해 주어 하나의 물체 DB를 생성한다.

인식 thread는 다음과 같이 돌아간다.  위의 그림에서 곰인형을 인식하는 예를 들자면, 현재 프레임이 k번째 프레임이라고 하고, 현재 프레임에서 곰인형을 인식했다고 판단하고 그 곰인형의 pose를 구해서 제시 하려면, 그 훨씬 이전 프레임에서 부터 작업이 들어간다.  만약 그 작업에 m개의 프레임이 소요된다고 하면, k – m번째 프레임에서 부터 작업이 시작된거다.  k – m번째 프레임에서 SURF 피처 점들을 뽑는다. 이걸 물체 DB의 각 물체에 대해, 물체의 각 face에 대해 비교를 한다.  RANSAC을 쓰는 건 마찬가지 인데 planar object때는 homography를 쓰니가 4개의 점이 필요하고, 여기서는 non-planar니까 5개의 점을 써서 PnP 방식으로 해당 물체좌표계와 카메라 좌표계 사이의 relative pose를 구한다.  만약 DB내의 어떤 물체가 planar라고 미리 알려져 있으면 그냥 homography를 쓰면 된다.  시간을 줄이기 위해서 한 물체의 face가 RANSAC을 통과하면 그 물체의 다른 face들은 skip하고, 다른 물체로 넘어간다.  어쨌거나 DB를 뒤져서 일정 기준(relative pose를 적용했을 때의 reprojection error가 충분히 작은) 가장 적합한 face를 가지는 물체가 발견이 되면, 걔의 DB내에서의 3D 특징점들은 아래와 같이 월드좌표계 상의 좌표 값드들로 변환 되어, 현재 SLAM 시스템의 3D map속으로 투입된다.

SLAM thread는 기본적으로 1-point RANSAC EKF 방식의 SLAM을 쓴다(저자의 이전 논문[2]에서 나온건데, 뭐 소스코드도 있으니까 약간 안심).  Kalman filtering에서의 state vector는 (카메라_포즈, 카메라_포즈_속도, 3D_Point_1, 3D_Point_2, …, 3D_Point_n)이다.

인식 thread가 시작되는 시점이랑 끝나서 물체를 증강하는 시점이랑 차이가 있으니까, 시작되는 시점 k – m번째 프레임에서 state vector에 카메라 포즈를 추가해서 인식 thread가 끝나는 시점까지 끌고 간다고 한다.  그러니까 k – 1번째 프레임에서는 (카메라_포즈, 카메라_포즈_속도, 3D_Point_1, 3D_Point_2, …, 3D_Point_n, 카메라_포즈_k_-_m)이 되는 것이다.  왜 이렇게 까지 하는지 모르겠다.  암튼 중요한 거는 물체가 현재 3D map상에서 움직이지 않는다고 하면, k – m번째 프레임에서의 (월드좌표계 기준) 물체의 포즈나 현재 k번째 프레임에서의 물체 포즈나 같다는 거.  따라서 물체 좌표계 기준의 3차원 점을 월드좌표계 기준의 좌표로 변환시키려면 다음과 같은 순서를 밟으면 된다.
물체 좌표계 기준 3차원 점
—(인식 결과로 얻은 k – m번째 프레임의 카메라와 몰체 좌표계 사이의 relative pose)—> k – m번째 프레임의 카메라 좌표계 상의 3차원 점
—(카메라 좌표계와 월드 좌표계 사이의 relative pose, 즉 카메라 포즈)—> 월드 좌표계 기준 3차원 점.

여기서 “인식 결과로 얻은 k – m번째 프레임의 카메라와 몰체 좌표계 사이의 relative pose”는 다시 다음과 같은 transform들의 연결로 볼 수 있다.

인식 결과로 얻은 k – m번째 프레임의 카메라와 물체 좌표계 사이의 relative pose = (face를 찍을 때의 카메라와 k – m번째 프레임의 카메라 사이의 relative pose) (물체 자체 좌표계 기준 face를 찍을 때의 카메라 포즈)

이렇게 물체 점 하나가 추가 되면, 현재 k번째 프레임에서의 상태 벡터는 (카메라_포즈, 카메라_포즈_속도, 3D_Point_1, 3D_Point_2, …, 3D_Point_n, 3D_point_W_F) 가 되고, 다시 다른 물체를 인식하기 위한 thread가 시작 된다.

근데 내 생각에는 일반적인 3D_Point_n과 인식된 물체 상의 3D_point_W_F 들을 똑같이 취급하는 거는 문제가 있어 보인다.  3D_point_W_F 들은 한 번 학습을 한 거기 때문에 비교적 믿을 만 하지 않나 한다.  즉  3D_point_W_F 끼리의 서로 간의 상대적인 위치는 프레임이 진행 되는 동안 변화되지 않는다고 보는게 맞지 않나 싶다.  그러한 constraint를 주면 3D_point_W_F 들의 상태가 개별적으로 변하는게 아니라 단체로 움직이게 할 수 있지 않을까?  그냥 내 생각…

동영상에서 보면 추적 잃어버렸을 때 relocalization 하는 것도 나온다.  이 논문의 저자들은 relocaization은 [3]의 방법을 썼다고 한다.

[1] http://webdiis.unizar.es/~jcivera/videos/civera_etal_iros11_desktop.avi
http://webdiis.unizar.es/~jcivera/videos/civera_etal_iros11_hospital_room.avi

[2] J. Civera, O. G. Grasa, A. J. Davison, and J. M. M. Montiel. “1-point ransac for EKF filtering: Application to real-time structure from motion and visual odometry”. Journal of Field Robotics, 27(5):609–631, October 2010.

[3] B. Williams, G. Klein, and I. Reid. “Real-time SLAM relocalisation”. In IEEE 11th International Conference on Computer Vision, page 1:8, 2007.

 

[reiview] Semantic Structure From Motion

발표 : CVPR 2011

제목 : Semantic Structure From Motion

저자 : Sid Yingze Bao and Silvio Savarese

소속 : University of Michigan at Ann Arbor

이 논문은 Bao 의 CVPR 2012 논문의 전신에 해당한다.  일단 소스코드[1]가 있어서 땡긴다.  근데 한 image pair 당 수행시간이 대략 20분이란다.  아무래도 버려야 할 카드인거 같은 느낌… 전체적으로는 아래의 조건부 확률을 최대화하는 \{ \bf{Q}, \bf{O}, \bf{C} \}를 구하는 작업이다. 여기서 \bf{Q}는 scene에 등장하는 3차원 점들의 위치, \bf{O}는 3차원 물체들의 포즈, \bf{C}는 내부인자는 안다고 했을 때의 카메라의 포즈들이다.

\begin{aligned} \{ \bf{Q}, \bf{O}, \bf{C} \} &= \displaystyle \arg \max_{Q, O, C} Pr(\mathbf{q}, \mathbf{u}, \mathbf{o} | \mathbf{Q}, \mathbf{O}, \mathbf{C}) \\ &= \displaystyle \arg \max_{Q, O, C} Pr(\mathbf{q}, \mathbf{u}| \mathbf{Q}, \mathbf{C}) Pr(\mathbf{o} | \mathbf{O}, \mathbf{C}) \end{aligned}

여기서 \mathbf{q}는 3차원 점의 시퀀스에서의 이미지 좌표이고, \mathbf{u}는 각 이미지 포인트들과 3차원 점과의 대응 관계이다.  그리고 \mathbf{o}는 물체의 시퀀스에서의 좌표, 크기, 포즈이다.  그러니까 3차원 점들의 위치, 물체들의 포즈, 카메라 포즈가 주어지면 reprojetion 에러와 함께, 물체의 projection되는 shape의 error를 따져 봐서 주어진 3차원 점들의 위치, 물체들의 포즈, 카메라 포즈가 얼마나 괜찮은지를 판단할 수 있고, 이러한 모든 조합 중에서 가장 에러가 적은 것을 주어진 시퀀스의 물체의 포즈와 카메라 포즈로 정한다는 것이다. 그리고 3차원 점의 projection과 물체의 projection과는 독립으로 보면, 이 likelihood 함수는 두 부분으로 쪼개질 수 있어서, \mathbf{q}, \mathbf{u} 가 들어간 factor는 다시 \mathbf{O}가 빠지고, \mathbf{o}가 들어가 factor는 다시 \mathbf{Q}가 빠진다.  카메라는 projection에 결정적인 요소이므로, \mathbf{C}가 양 쪽 factor에 다 들어간다. Clipboard02   두 번째 factor는 다시 각 물체사이는 독립적이라고 보고 위 식처럼 product 형태로 바뀌고, 역시 각 프레임 사이도 독립적으로 보고 이중 product를 구성한다.  근데 왜 “1 – ” 이런 식으로 하는지 모르겠다.  비례관계는 맞는거 같은데, 1에서 뺀다는 건 여사건을 다룰 때나 쓰는 건데 왜 이런건지… Clipboard03 첫 번째 factor는 3차원 점들의 projection 에러에 관한 거니까, 역시 각 3차원 점들은 독립이라고 보고, 하나의 3차원 점에 대해서도 각 프레임에서의 projection이 독립이라고 보변 이중 product를 만들 수 있고 각 projection의 pixel distance error를 적당한 \sigma_{q}에 대해 Gaussian으로 본다.

첫 번째 factor에 대해 epipolar line을 이용하여 아래와 같은 alternative estimator를 제시하였는데, 이것도 좀 애매하다.

Clipboard04

여기서 N_s 도 대충 짐작은 가지만 확실히 밝히지 않았고, \alpha도 애매하다.

최종적으로 이러한 최적의 configuration을 찾기 위한 최적화 방법으로 아래와 같이 MCMC(Metropolis)를 쓰고 있다.

Clipboard05

저자의 CVPR 2012 version에서 쓴 simulated annealing이랑 비슷한 거 같다. 다른 점은 r이 몇 개인지는 모르겠지만, 이렇게 sequential하게 돌려서 r개의 configuration이 나오면, 그것들을 가지고 대충의 probability density function을 근사화하고 여기다 mean shift를 돌려서 clustering을 하고, 가장 많은 sample들을 포함하는 cluster의 중심을 최적의 configuration으로 삼는단다.  Step 2,3,4에서 볼 수 있 듯이 실제로 sampling을 해주는 건 카메라 포즈이다.  Sampling된 camera pose가 주어지면 거기에 맞게 확률을 최대화하는 물체들과 3차원점들이 정해지는 것이다.

[1] http://www.eecs.umich.edu/vision/projects/ssfm/codes/SSFM_01.zip

 

[reiview] Semantic Structure From Motion with Points, Regions, and Objects

발표 : CVPR 2012

제목 : Semantic Structure From Motion with Points, Regions, and Objects

저자 : Sid Yingze Bao, Mohit Bagra, Yu-Wei Chao and Silvio Savarese

소속 : University of Michigan at Ann Arbor

‘semantic’ 자가 들어가는 논문은 3종류가 있다.  하나는 이 전에 리뷰한 ‘semantic bundle adjustment’, 또 하나는 이 논문 ‘semantic SfM’, 마지막 하나는 ‘semantic SLAM’ 이다. 사실 bundle adjustment와 SfM과의 차이를 잘 모르겠다.  BA는 대부분 SfM에서 쓰이니까 그게 그건가 하고 있다.  그렇다면 이 SSfM은 SBA랑 비슷할 것인가?

이 논문은 Bao 의 CVPR 2011년 논문의 확장판이다.  고려 대상을 region까지 넓힌 걸로 봐서는 2011 버전이 별로 신통치 않아서 그런건 아닐까?  일단 이 논문은 최적화 문제를 풀기위해 simulated annealing(SA)를 쓰고 있다.  아 아무래도 실시간은 가망없어 보이는데… SA의 에너지함수로 아래와 같은 걸 쓰고 있다.  에너지 최대화니까 결국 확률 형태로 바꿔서 최대 확률로 끌고 가겠구만…Clipboard01길기도 길다. 여기서 \mathbb{Q}는 3차원 점들과 시퀀스에서 2차원 점들의 대응관계, \mathbb{O}는 3차원 물체와 시퀀스에서의 2차원 물체와의 대응관계, \mathbb{B}는 3차원 region과 시퀀스에서의 2차원 region과의 대응관계, 마지막으로 \bf{C} 는 카메라 포즈 시퀸스이다.  즉, 가장 최적의 카메라 포즈 시퀀스, 3차원 점들의 위치와 그 들의 2차원 projection 점들의 시퀀스, 3차원 물체들의 위치와 그 들의 2차원 projection 시퀀스, 3차원 region의 위치와 그 들의 2차원 projection 시퀀스는

  • CVPR 2011 버전에서와 같이 각 3차원 점들에 대해 reprojection 에러를 최소화하거나 epipolar line과의 거리를 최소화하는 카메라 포즈들과 3차원 점들의 위치
  • CVPR 2011 버전에서와 같이 각 물체에 대해 projection 에러를 최소화하는 카메라 포즈들과 물체들의 포즈
  • 이건 도저히 모르겠음
    Clipboard06

SA의 과정은 아래 슈도코드와 같고, 각 initial guesses들에 대해서  \{ \bf{C}_{M}, \mathbb{O}^{M}, \mathbb{Q}^{M}, \mathbb{B}^{M} \}이 나오면 이 중에서 가장 maximum energy를 나타내는 것을 최종 solution으로 삼는다.

Clipboard01

여기서 for문 안에서 보면 실제로 sampling하는 대상은 카메라 포즈들이고 나머지는 주어진 카메라에 대해 최대화를 하는 과정에서 구해진다.

암튼 저자가 온갖 비싼 기법들을 다 썼는데, 과연 실제로 그게 가능했을까가 의문이 든다.