March 07, 2022
Different type of maps
각 카메라들은 과정을 통해 각 픽셀의 거리를 알 수 있음
Monocular Camera
: 카메라 모션을 통해 triangulation으로 깊이를 추정Stereo Camera
: 양안의 disparity를 통해 깊이를 추정RGB-D Camera
: depth센서를 통한 깊이 추정
monocular camera에서 depth 추정 방법
다른 각도의 observations를 통해 triangulation 수행
→ 목표: 다음 frame에서 지점은 epipolar line라인에서 어느 지점()일까?
Question: epipolar line에 과 비슷한 점이 많을 경우 어떤 점을 로 결정할 것인가?
Solution: Block Matching
블록과 블록의 차이 계산 방법들 (블럭 유사도 측정)
→ : 주변의 블록 / : epipolar line상의 개의 작은 블록
→ 이미지가 유사하면 0, 다르면 1에 가까워짐
SAD (Sum of Absolute Difference)
SSD (Sum of Squared Distance), not solid state drive
NCC (Normalized Cross Correlation)
epipolar line에서 와 사이의 유사성 척도 계산 (NCC를 사용한다고 가정)
depth
는 단일 값이 아니라 확률분포를 따라야하며, 다른 이미지의 epipolar line들을 찾으면서 depth distribution을 업데이트해야 함
(⇒ depth filter)
Matching score along with the epipolar line
픽셀 깊이의 추정 문제 solution
대안1: 비선형 최적화
→ 이미 frontend에서 많은 계산량을 차지하고 있으므로 pass
대안2: 필터
→ 계산량이 상대적으로 적음
유도 과정
픽셀의 깊이 를 아래와 같이 가우시안 분포를 따른다고 가정
새로운 데이터를 관측(obs)하였을 때의 깊이 도 마찬가지로 정의하면,
두 분포에 대한 결합을 정의하면
→ 가우시안 분포의 곱도 가우시안 분포
→ 새로운 관측을 바탕으로 기존 의 분포를 갱신
⇒ 그렇다면 는 어떻게 구할 것인가?
epipolar line 탐색과 블록 매칭을 통해, 현재 프레임에서 참조 프레임의 픽셀의 투영 위치를 결정한다고 가정하면 아래 그림과 같이 표현 가능
→ 기하학적 관계로 인한 불확실성만 고려
위 그림에 대한 기하학적 관계를 수식으로 표현하면,
block matching을 수행하기 위해, 를 이동시키는 것은 의 변화를 유발하게 되고, 그에 따라 는
sin 법칙을 통해 단일 픽셀로부터 오는 불확실성 depth 를 구하면,
epipolar line상의 block matching에 픽셀 오류가 하나만 있다고 가정하면,
픽셀의 depth 추정과정 정리
Pixel Gradients
depth의 정확성은 block matching의 결과에 직결됨
아래 오른쪽 그림의 프린터처럼 균일한 흰색의 경우, 왼쪽 결과처럼 부정확한 depth 추정
pixel gradients와 epipolar line 사이의 각도가 클 때, epipolar line 일치의 불확실성이 큼
극단적인 예 2가지
pixel gradients가 epipolar line과 평행한 경우
→ matching point를 정확하게 결정할 수 있음
pixel gradients가 epipolar line과 수직인 경우
→ 명백한 gradients를 가지고 있다고 하더라도, 두 매칭각도가 완전히 동일하므로 효과적인 매칭이 되지 않음
Inverse Depth Filter
depth의 추정 값이 가우시안 분포를 따른다고 가정했을 때의 문제점
측정 가능한 최소 depth 보다 가까운 거리를 측정할 경우
→ 가우시안 분포의 대칭 모양을 따르지 않게 됨
야외의 경우 매우 멀리 떨어져있거나 심지어는 무한대인 지점이 있음
→ 초기 값에서 이런 points들을 다루는 것은 힘듦
solution: inverse depth
Pre-transform the Image
block matching을 수행하기전, image와 image사이에 transform을 수행하는 전처리 과정을 의미
참조 frame과 현재 frame의 모션을 고려해야 함
참조 frame의 한 점 은 실제 3차원 world 포인트 좌표 와 아래와 같은 관계를 갖음
현재 frame의 한 점 도 와 아래와 같은 관계를 갖음
를 제거하기 위해 대입하면 아래와 같은 관계식이 나옴
→ 을 알고 있으면, 를 계산 할 수 있음
의 증분 이 주어졌을 때, 그에 따른 의 를 구할 수 있고, 선형 관계를 affine 변환 꼴로 표현하면,
Parallel Computing
solution
Other Improvements
각 픽셀은 독립적으로 계산되므로, 한 픽셀의 depth가 작고 인접한 다음 픽셀의 depth는 매우 클 때 depth map이 smooth하지 않음
⇒ Solution: 인접한 픽셀의 depth 값 차가 클 경우, regularization term을 추가
occlusion, lighting, motion blur등으로 발생하는 outlier로 인한 mismatch
⇒ Solution1: NCC가 특정 값 보다 크면 일치로 판단하고, 작으면 불일치로 판단
⇒ Solution2: uniform-Gaussian mixture model 적용
포인트 클라우드들의 효율적인 처리
voxel filter: 중첩 영역에는 많은 수의 밀집된 점을 다운샘플링
3차원 공간의 데이터 표현 방식
어떤 객체의 정보를 나타내기 위해서는 객체의 존재 여부와 객체가 어디에 존재하는지를 알아야 함
→ 기준 좌표계(or 공간)에 대한 정의가 필요한 이유
그렇다면 3차원 박스에는 몇 개의 Point가 존재할 수 있을까?
정답은 무수히 많다
어떤 3차원 공간을 Voxel 기준으로 표현할 수 있음
Voxel을 활용하면 데이터의 공간을 절약할 수 있음
정리
Octree: Voxel의 개념을 이용하여 3차원 공간에 데이터를 표현하는 방법
⇒ 예
Octree의 확률적 데이터 표현 방식
사람의 눈(센서)는 100% 정확하지 않음
또한, 사람마다 객체(데이터)를 판단하는 기준이 다름
→ 객체의 정보를 취득하는 센서는, 불확실한 데이터를 취득할 가능성이 있음
이러한 센서의 불확실성을 확률적 모델링하여 객체의 존재 여부를 표현하면
데이터표현 방식
가정
→ 센서로부터 데이터를 지속적으로 취득하고, octree의 노드는 점유 여부에 대한 정보를 저장
목표
→ 이전까지 취득한 데이터를 활용하여, 객체(장애물 등) 정보를 동적으로 모델링
간단한 솔루션
객체가 해당 cell에 존재하면 의 값을 증가
→ 단순증가: 예)
반대로, 객체가 해당 cell에 존재하지 않으면 의 값을 감소
→ 단순감소: 예) 문제점
해결책: 에 를 취해 문제를 해결
→ logit transform 사용
→ 역함수의 경우
→ 가 에서 로 변하면, 는 0에서 1로 변함 (가 0이면, 는 0.5)
Truncation Signed Distance Function (TSDF)
각 복셀에는 물체 표면과의 거리를 나타내는 TSDF값과 그 값의 신뢰도를 나타 내는 가중치(weight) 를 함께 저장하는 방식
frame
: 이미지의 단위feature
: 2D pixel 상의 특징landmark
: 삼각측량 법으로 얻어진 3D position
frontend
“initialization” state
→ optical flow matching에 따라 triangulation 수행
→ 성공 시 초기 map 생성
“normal tracking” state
→ 이전~현재 프레임까지의 optical flow를 계산하고, 결과를 바탕으로 영상 포즈를 추정
→ optical flow 계산 리소스를 절약하기 위해, stereo에서는 한 쪽 이미지에만 사용
“tracking lost” state
→ tracked feature가 threshold 보다 작을 경우 발생
backend