아래 글에서 이 블로그에서 리뷰한 논문들의 흐름과 분야별 분류를 한 눈에 볼 수 있다.
읽은 논문들 정리
[목차]지속적으로 업데이트 중, 번호는 모델발전 순서가 아닌 읽은 순서에 따라 정렬.1. Computer Vision 분야 논문Classification 모델들의 발전Detection 모델들의 발전Segmentation3D 처리2. Natural Language Process
april2901.tistory.com
이번 논문은 SplatAD라고 부르는 논문이다.
새로운 시점에서의 이미지만 만들던 이전 논문들과 달리 이 논문은 라이다 데이터도 만든다.
이전 연구들을 보면 NeRF기반 모델에서는 라이다 데이터까지 만드는 것들이 있었다.
대표적으로 이 블로그의 글로도 썼던 UniSim이 있다.
더 단순화된 네트워크와 개선된 센서 모델링을 통해 뛰어난 성능을 보여준 NeuRAD도 있다.
하지만 이 NeRF기반 모델들은 렌더링이 느리다.
그리고 3DGS관련 연구를 보면
블로그에서 여러 개의 글로 다뤘던 Street Gaussian 등이 있다.
3DGS관련 모델들은 라이다 데이터를 생성하지는 않았다.
그냥 초기화를 할 때만 사용했다.
라이다 데이터를 만들어도, depth를 먼저 렌더링하고 그 값을 가져오는 식이었다.
Scene Representation
기본적으로 장면 표현에는 3DGS를 사용한다.
그러나 바뀌는 점은 기존 SH함수 대신 $f^{rgb},f$라는 두 개의 벡터를 속성으로 가진다는 것이다.
$f^{rgb}$는 3차원 벡터로 색을 저장한다.
$f$는 특징 벡터로 $D_f$차원이다.
$f$에는 SH함수처럼 시점에 따른 효과도 반영되어있고, 라이다의 특성도 담고 있다.
또 가우시안 말고 각 센서에 대해 학습가능한 백터를 설정했다.
이건 프레임에 상관없는 센서 고유의 벡터이다.
자율주행 환경을 배경 + 객체로 나눈다.
여기서는 객체를 actor라고 하는데,
이 actor들은 3D BB와 시간 $t$에 따른 pose로 정의된다.
여기서 pose는 SE(3)형식을 따른다.
그냥 원래 알던 R, T로 모습을 나타내는 방법이다.
각 가우시안은 고유 ID를 가져서 배경인지 어떤 actor인지를 알고 있다.
가우시안이 actor라면 그 actor의 BB 로컬 좌표계 기준으로 표현된다.
따라서 이는 actor의 pose정보를 사용해 먼저 월드 좌표계로 변환한다.
그 이후 학습 가능한 pose 오프셋(회전 오프셋, 위치 오프셋)을 사용해 위치를 미세 조정한다.
또 actor는 프레임 간의 간격을 통해 기본적인 속도를 계산하고, 추가로 오차를 보정하기 위한 학습가능한 속도 오프셋도 가지고 있다.
Camera Rendering
롤링 셔터 보정
자동차의 카메라는 위에서 아래로 천천히 사진을 찍는다.
따라서 차가 빠르게 이동하면 하나의 사진 안에서도 왜곡이 보이게 될 수 있다.
그래서 속도를 근사하는 방법을 사용한다.
어떤 가우시안의 속도를 계산하는 법을 알아보자.
$v^I$은 2D카메라 평면에서의 가우시안이 움직이는 속도 이다.
$J$는 자코비안으로 3D의 속도를 2D로 변환해준다.
$\omega_C, v_C$는 카메라 자체의 회전 및 직선 속도이다.
$\mu^C$는 카메라 기준의 가우시안 중심좌표이다.
$v_{dyn}$은 다른 차량이 움직이는 속도이다.
$\omega_{act}, v_{act}$는 다른 차량의 회전 속도와 직진 속도이다.
$\mu^{act}$다른 차량 기준 좌표계에서 가우시안의 상대적 위치이다.
$T^{act \rightarrow C}$는 다른 차량의 좌표계를 내 카메라 좌표계로 변환하는 행렬이다.
아래 식은 카메라에서의 해당 가우시안의 픽셀 상대 속도를 계산한다.
여기서 당연히 계산하려는 가우시안이 배경일 경우 v_dyn은 0이 된다.
여기 식에 마이너스가 붙는 이유는 상대 속도이기 때문에 (객체속도)-(카메라속도)로 계산해야하기 때문이다.

여기서 객체 속도라는 것은 현재 내 카메라 기준의 객체 속도를 얘기하는데 이걸 구하는 법은 아래와 같다.

아까 위에서 설명했듯이 사진을 위에서 아래로 찍는다.
즉 아래 있는 픽셀이 찍힌 시간이 더 늦다.
따라서 이미지 가운데를 기준(0.5)으로 현재 픽셀이 이 기준보다 얼마나 늦게/빠르게 찍혔는지$t_{pix}$를 계산해야 한다.
$H$는 이미지 전체의 세로 해상도이다.
$p_v$는 현재 연산 중인 픽셀의 세로 좌표, 즉 위에서 몇번째 픽셀인지 이다.
$t_{rs}$는 카메라가 맨 위부터 맨 아래까지 찍는데 걸린 시간이다.

학습 시에는 카메라에 찍힌 (찌그러진)이미지와 똑같이 되도록 셔터 타이밍을 고려해 일부러 픽셀을 변화시킨 후 비교해야한다.
$$\Delta_i = p - (\mu_i^I + v_i^I t_{pix})$$
$\mu_i^I$는 이상적인 위치를 얘기한다.
이 일부러 변화를 준 결과들에 대해 알파 블렌딩을 한다.
알파 블렌딩의 대상은 $f^{rgb} , f$이다.
블렌딩을 해서 얻은 맵($F$)와 카메라가 바라보는 광선의 방향 $d$, 카메라 센서의 임베딩을 concat해서 작은 CNN에 통과시킨다.
이 CNN의 결과는 $M,b$이다.
이 두 값은 모두 이미지 전체에 적용될 색상 조정값이다.
$$M, b = \text{CNN}(\text{concat}(F, d, e))$$
$$I = (1 + M) \odot F^{rgb} + b$$
이를 통해 자동 노출이 되어 찍힌 프레임 간의 밝기 차이를 잡아낼 수 있다.
Lidar Rendering
구면 좌표계
카메라는 3D를 2D로 투영하지만, 라이다는 시간과 각도를 측정하기 때문에 구면좌표계가 필요하다.
먼저 가우시안의 중심점들을 월드 좌표계 → 라이다 좌표계로 변환한다.
라이다 기준 좌표계에서의 점 좌표를 $\mu^L = [x, y, z]^T$라고 하면 아래 식을 통해 구면좌표계에서의 좌표$\mu^S$로 바꿀 수 있다.
$$\mu^S = \begin{bmatrix} \phi \\ \omega \\ r \end{bmatrix} = \begin{bmatrix} \arctan2(y,x) \\ \arcsin(z/r) \\ \sqrt{x^2+y^2+z^2} \end{bmatrix}$$
$\phi$ 방위각: 라이다가 가로로 몇 도 회전했는지.
$\omega$ 고도: 세로로 위아래 몇 도를 향하는지.
$r$ 거리: 라이다 센서에서 가우시안 중심까지의 직선 거리.
기존의 공분산($\Sigma^L$)을 구면 좌표계 상에서의 공분산($\Sigma^S$)으로 바꾸기 위해 위의 식을 편미분한 아래의 식(자코비안)을 사용한다.
$$J^S = \begin{bmatrix} -\frac{y}{x^2 + y^2} & \frac{x}{x^2 + y^2} & 0 \\ - \frac{xz}{r^2 \sqrt{x^2 + y^2}} & - \frac{yz}{r^2 \sqrt{x^2+y^2}} & \frac{\sqrt{x^2+y^2}}{r^2} \\ \frac{x}{r} & \frac{y}{r} & \frac{z}{r} \end{bmatrix}$$
이 변환을 사용해 $Sigma^S$를 얻을 수 있다.
$\Sigma^S = J^S\Sigma^L(J^S)^T$
롤링 셔터 보정
위에서 얘기한 일반 카메라와 마찬가지로 라이다도 스캔을 하는 과정에서 시간차가 있다.
따라서 똑같이 보정을 해준다.
$$v^S = J^S (-\omega_L \times \mu^L - v_L + v_{dyn}) \in \mathbb{R}^3$$
조금 다른 것은 $v^I$는 2차원이었지만 여기의 $v^S$는 3차원이라는 것이다.
가까워지는지 멀어지는지를 나타내기 위해 차원이 하나 더 추가되었다.
Tiling
여기서 얘기하는 타일은 3DGS에서 얘기한 타일 래스터라이제이션의 타일 개념과 동일하다.
기존에는 16X16픽셀로 이미지를 잘라 계산을 했었다.
그런데 라이다는 가로 회전은 일정한 간격으로 돌지만, 세로 방향의 센서들은 간격이 일정하지 않기 때문에 그냥 정해진 크기로 타일을 자르면 라이다 데이터가 아예 없는 부분이 생길 수도 있다.
따라서 세로방향으로는 일정 수의 다이오드(센서)가 포함되도록 유동적으로 자른다.
Rasterization
앞에서 얘기했던 $f$는 알파블렌딩으로 계산되었다.
이걸 MLP에 넣어 라이다의 반사율과 광선 누락 확률을 예측한다.
라이다 광선을 쏘는 짧은 시간$t_l$에 가우시안 중심이 속도에 의해 얼마나 이동했는지 반영해 진짜 거리를 구한다.
$$r_{i,rs} = r_i + v_r^S t_l$$
거리는 학습 때와 추론 때 다르게 계산되는데,
학습 시에는 여러 가우시안의 거리를 알파 블렌딩한 기대 거리를 사용한다.
추론 시에는 누적 불투명도가 처음으로 0.5를 넘는 지점의 거리를 사용한다.
최적화와 구현
$$\mathcal {L} = \lambda _r\mathcal {L}_1 + (1-\lambda _r)\mathcal {L}_\text {SSIM} + \lambda _\text {depth} \mathcal {L}_\text {depth} + \lambda _\text {los} \mathcal {L}_\text {los} + \lambda _\text {intens} \mathcal {L}_\text {inten} + \lambda _\text {raydrop}\mathcal {L}_\text {BCE} + \lambda _\text {MCMC}\mathcal {L}_\text {MCMC}$$
$\mathcal{L}_1, \mathcal{L}_{SSIM}$을 통해 렌더링된 이미지와 실제 사진의 차이를 구한다.
$\mathcal{L}_{depth}, \mathcal{L}_{inten}$을 통해 라이다 값이 실제와 얼마나 다른지 계산한다.
$\mathcal{L}_{los}$를 통해 라이다 측정 지점보다 앞에 불필요한 물체가 생겨셔 시야를 가리는 걸 방지한다.
$\mathcal{L}_{BCE}$는 라이다 빛이 돌아오지 않을 확률을 BCE로 학습한다.
$\mathcal{L}_{MCMC}$는 가우시안의 투명도, 크기를 조절해 너무 복잡해지지 않게 관리한다.
가우시안 초기화
실제 라이다 데이터를 기반으로 가우시안을 배치한다.
이때 이 점이 객체 BB안에 있다면 그 객체로 귀속시킨다.
라이다가 닿지 않는 곳은 랜덤하게 가우시안을 좀 뿌려놓는다.
밀도제어
이전 3DGS를 학습시키다 보면 학습 중 가우시안이 너무 많아져 VRAM이 넘쳐 학습이 멈출 때가 있다.
이 SplatAD는 splitting and Densification방식을 사용하지는 않고 MCMC라는 방법을 사용한다.
객체에 속한 가우시안도 동일하게 괸리되고 가우시안의 최대 개수를 미리 정할 수 있어서 메모리 사용량 예측이 쉽다.

결과
데이터셋은 PandaSet, Argoverse2, nuScenes를 사용했다.
평가는 홀수프레임으로 학습, 짝수프레임으로 복원 능력 평가 하는 방식과
전체 데이터를 통해 다 학습시킨 후 학습한 장면을 얼마나 잘 재구성하는지 평가하는 방식을 사용한다.
이미지 렌더링 결과 : SplatAD는 기존 최고였던 NeuRAD를 넘었다.
라이다 렌더링 : 기존 모델들(street GS)은 잘 렌더링 하지 못했고, NeuRAD와도 비슷하거나 더 좋은 성능을 보여줬다.
조작 : 본인 차량을 움직이거나 주변 차들을 회전시킬 때 더 사실적인 이미지를 생성했다.
한계점
모든 객체를 한 덩이의 박스처럼 취급하기 때문에 관절 움직임 등이 없다.
아예 찍힌 적 없는 방향에서의 렌더링 퀄리티 문제가 있다.