안녕하세요. 오늘은 NeuRAD라는 논문에 대해 리뷰하겠습니다.
최근 NeRF를 이용한 AD(autonomous driving)분야에 많은 발전을 이끈 논문들이 많이 나오고 있습니다. 보통 NeRF를 사용하여 training augmentation을 수행하거나 test dataset으로 활용을 많이하고 있습니다.
그러나 기존의 방법들은 몇 가지 문제가 존재하는데, 긴 training 시간, 힘든 generalization, dense semantic정보가 필요하다는 것 이였습니다. 논문에서는 이러는 문제점들을 해결하기 위해 여러 방법론을 제시하였는데 자세한건 아래에 살펴보겠습니다.
Relative works
synthetic data는 AD에서 매우 유용합니다. harsh breaking상황(corner eage case)에 대한 dataset을 실제로 얻기에는 매우 힘들기 때문입니다.
최초로 Neural Scene Graph에서 static object와 dynamic object를 분리하여 nerf를 적용하는 시도를 하고 mip-nerf에서 scale의 확장을 이뤄냈지만 training 시간에 있어서 여전히 많은 문제를 앉고 있었습니다. 이 와중에 Instant NGP모델이 발표되었고 positional embedding 과정을 learnable hash grid타입으로 바꾸면서 traning time에 혁신적인 감소를 이뤄냈습니다. 하지만 anti-aliasing이 없어 large scale을 렌더링하게 되면 성능에 많은 제약을 두게 됩니다.
zipnerf의 경우 mip-nerf와 INGP의 장점을 활용합니다. mip-nerf의 anti-aliasing방법과 INGP의 multi-resolution hash grid방법을 모두 사용합니다.
snerf는 mip-nerf를 발전시킨 모델로 각각의 actor를 각각의 mlp에 태우게됩니다. 그렇기 때문에 training시간이 매우길고 application에 downstream하기 어렵습니다.
MARS는 본 논문과 가장 비슷한 알고리즘으로 nerf-studio기반의 client도 존재하지만 lidar points생성은 제공하지 않고 semantic segmentation이 옵션인데 적용하지 않으면 Performance가 매우 안좋습니다.
*zip-nerf
해당 논문의 컨셉이 zip-nerf와 매우 유사하여 추후 포스팅할 수도 있지만 간략하게 좀 더 살펴보겠습니다. (하단의 multi-scale representation전략의 zip-nerf와 거의 같습니다.)
zip-nerf는 언급한대로 speed top인 INGP와 퀄리티 탑인 Mip-NeRF360의 장점을 둘 다 활용하겠다는 컨셉입니다.
Grid-base인 INGP는 long-range영역에서 aliasing이 자주 발생하지고 anti-aliasing 연구인 Mip-NeRF360는 렌더링 퀄리티는 좋지만 속도가 느립니다. Mip-NeRF360는 sampled point 사이를 gaussian 형태로 encoding하여 mlp입력으로 사용합니다. INGP는 인접한 grid의 8개 3D point들을 encoding하여 mlp입력으로 사용하고 결과값을 interpolation합니다. positional encoding값을 비교해보면 바닐라 nerf는 말그대로 sin,cos으로 이루어진 positional encoding을 사용합니다.
INGP는 주어진 좌표에 grid level별로 주변 4개의 좌표를 선택하고 hashtable을 통해 encoding해서 embedding값을 추출합니다. 이를 interpolation해서 각각 concat해서 vectorize합니다.
Mip-NeRF는 multi-scale을 고려하기 위해 positional encoding대신 conical frustum을 approximation 하는 Gaussian 확률 밀도 함수로 encoding합니다.
zip-nerf 에서는 multi-sampling과 downweighting기법을 사용합니다. mip-nerf360의 conical frustum(anistropic)을 isotropic Gaussian으로 바꾸는 방법으로 aliasing을 해결합니다. 풀어쓰면 scene내부에 존재하는 anistropic sub-volume들을 sub-volume shape로 근사하는 point set으로 바꾸면 point set들은 특정 scale을 가진 isotropic Gaussian으로 가정할 수 있고 이는 sub-volume에 걸쳐있는 feature grid의 적분값을 근사할 수 있으며 이를 down-weighting하여 평균화하면 INGP grid에서도 scale-aware한 feature를 얻을 수 있다고 합니다.
multi-sampling방법은 직선의 lay(검은)위에서 sampling을 하고 인접한 conical frustum 내부의 6개의 점을 선택합니다. 6 point hexagon pattern이라고 표현하며 아래의 공식에 의해 선택되어 집니다. 각 6개의 점은 0.5의 표준편차를 가지고 해당 점의 위치를 평균값으로한 isotropic Gaussian으로 사용됩니다.
이렇게 선택된 6개의 점은 isotropic Gaussian의 평균값으로 사용됩니다. 이 후 6개의 점은 INGP처럼 multi-grid hash encoding 과정을 거쳐서 feature가 나오는데 6개의 feature를 단순 평균과하지 않고 각각의 점들이 의미하는 isotropic gaussian이 grid cell에 얼마나 fit한지에 따라서 downweighting합니다.
Downweighting은 각 multi-sample의 isotropic Gaussian의 크키가 grid cell에 fit한지 살펴보고 feature를 re-weight합니다. 크기가 interpolation되는 cell보다 크다면 신뢰할 수 없기에 downweight됩니다.
참고 : https://xoft.tistory.com/43
이제 mehod로 넘어가겠습니다.
Neural Scene Rendering
NeRF와 유사한 NFF(neural feature field)를 이용합니다. 차이는 position, view direction이 input으로 들어오면 NeRF는 density와 RGB값이 출력되지만 논문의 모델에서는 implicit geometry(SDF)와 feature vector를 출력합니다. (뒤쪽에 언급하지만 t도 input으로 사용됩니다.)
alpha_i는 불투명도를 나타내는데 w_i는 불투명도와 ray가 해당 포인트까지 도달하는 동안의 누적 투과율을 곱한값인데 이를 SDF를 사용해서 근사합니다. s_i는 x_i에서의 SDF값이며 베타는 learnable parameter입니다.
도식으로 정리하면 이와같습니다. (s,f) = NFF(x,t,d) ; s : sdf, f : feature vector
sdf는 3D 공간에서 해당 point에서 가장 가까운 표면까지의 거리이고 음수면 내부, 양수면 외부를 뜻합니다.Neuralangelo와 비슷한 방법론을 따릅니다.
camera modeling
카메라 이미지를 rendering하기 위해서 volume rendering을 수행하는데 우선 low resolution으로 volume rendering을 수행하고 이를 CNN을 이용해 upsampling하여 최종 고화질 이미지를 렌더링합니다. computation resource에 이점이 있고 더 고품질의 이미지를 렌더할 수 있다고 합니다.
lidar modeling
해당 논문에서는 앞서 언급했듯이 lidar 데이터도 generation합니다. modeling하는 과정은 ray(o+ad)를 쏩니다. o는 lidar의 중점을 뜻하고 d는 direction을 의미합니다. 이 후에는 depth를 추정해야하는데 아래의 equation을 이용합니다.
N은 ray r에 의해 sampling된 point의 개수입니다. w를 구하는 방법은 앞서 neural scene rendering의 수식과 동일합니다. 다른 점은 intensity와 unreturn ray를 구하기 위해서는 rendering을 통해 나온 output에 mlp를 태워 최종값을 구합니다. (이 부분은 약간 저자의 intuition이 가미되었다고 보는게 좋을 것 같습니다.)
이전의 방법론과 차이는 논문에서는 return되지 않는 ray들도 포함한다는 점입니다. 이는 ray dropping현상으로 return된 ray의 세기가 너무 약할때 나타날 수 있는데 (실제로) sim-to-real gap을 줄이기위한 중요한 요소입니다. mirror, glass or wet road furface에서 종종 발생하는 현상입니다. redered ray feature(위의 식을 거쳐나온)를 MLP을 통해 ray drop을 표현할 수 있다고 언급하고 있습니다. intensity를 구하는 layer와 unreturn ray를 구하는 mlp는 별도의 layer라고 추측됩니다. 자세한건 코드를 봐야하겠습니다.
Extending NFF
전체 network는 위의 설명한 modeling 전부이지만 extending NFF에서는 dynamic, multi-scale을 처리하기 위한 추가적인 테크닉이 활용됩니다.
위에서 언급한 NFF에 대해서 step-by-step으로 살펴보겠습니다.
1. (x, t)이 input으로 주어지면 INGP와 같은 hash grid encoding으로 임베딩화합니다. 이 과정에서 GT label을 참고하여 dynamic object 3d bbox에 해당되는 point는 로컬좌표를 사용하여 4D multi hash grid 쿼리방법을 이용하고 static이면 global좌표를 사용하여 multi grid hash encoding방법을 사용합니다. 기존의 다른 방법들처럼 unbounded scene에 대해서 따로 encoding한다던가 하지않고 dynamic actor와 static actor로만 나눠서 encoding작업을 진행합니다.
* 4D hash grid방법은 공간좌표(x,y,z)하고 actor index(i)을 포함합니다.
2. 1에서 나온 결과를 MLP를 태워서 SDF(s)값과 중간 feature map(g)를 얻습니다.
3. direction(d)을 INGP에서 처럼 구면조화 함수로 인코딩하고 두번째 MLP layer에 d와 g를 입력으로하여 최종 feature map를 생성합니다.
이 NFF은 dynamic, static모두 동일하고 두개의 차이점은 encoding과정만 차이나게 됩니다. lidar model, camera model 렌더링도 이 공통의 NFF를 통해 나온 결과를 가지고 각각 진행하게 됩니다.
Multiscale scenes
가장 challenge한 것 중하나는 multiscale문제입니다. 가까운 물체부터 수백 미터 떨어진 물체까지 다양한 스케일의 객체를 rendering하는 것은 쉬운일이 아닙니다. 기존의 INGP방법들은 멀리떨어진 물체의 렌더링 품질이 매우 좋지 못하는 단점이 있어 NeuRAD는 zip-NeRF의 approach를 참고하여 anti-aliasing 기법을 도입하였습니다.
INGP는 positional encoding방법으로 hash grid를 사용하는데 멀리있는 이미지에 대해서는 hash grid의 해상도가 충분하지 않을 수 있습니다. ray equation에 따르는 먼 물체는 적은 수의 sample만을 가지게 되는 단점 또한 가지고 있습니다. 이에 해상도가 낮거나 sampling 간격이 큰 경우 나타나는 aliasing형산이 나타날 확률이 높습니다. 이를 위해 Downweighting방법과 Multisampling방법을 사용합니다.
downweighting방법은 해당 point가 차지하는 cone의 부피에 반비례하도록 downweighting하는 방법입니다. 이를 통해서 멀리있는 물체들의 rendering 품질을 개선합니다. 멀리 있는 물체는 더 큰 cone을 차지하므로 낮은 가중치를 받도록하는대신 cone으로 설정하여 많은 샘플을 가질 수 있도록합니다. multi-sampling은 평균을 사용하기에 anti-aliasing효과를 사타낼 수 있고 down-weighting을 통해 멀리있는 물체의 detail정보가 지나치게 표현되는것을 방지하면서 많은 샘플링을 통해 세부정보를 풍부하게 가질 수 있도록 합니다.
Efficient Sampling
low resolution hash grid를 사용하는 mini-MLP로 구성됩니다. 해당 네트워크는 각 ray에 대해서 중요한 영역을 식별하는 역할을 합니다. 우선 uniform sampling으로 sampling을 진행하고 앞서 언급한 mini-MLP를 통해 sample points의 중요도를 평가합니다. 이 후 중요도에 따라 re-arrange합니다. 이 과정을 두 번 반복하여 최종 sample set을 생성합니다. 이 과정을 통해 empty space를 빠르게 건너뛸 수 있고 object근처에서 더 많은 sample points를 선택할 수 있습니다. implement details를 보면 ray당 32개의 uniform sample로 시작하여 network output으로 최종 64개의 weighted sample을 생성하고 quantization해서 memory efficient하게 사용합니다.
rolling shutter modeling
논문에서는 다른 곳에서는 제안하지 않았던 rolling shutter modeling을 제공합니다. 많은 자율주행 dataset이 rolling shutter sensor를 사용합니다. 그렇기에 NeuRAD 또한 motion에 의한 이미지 왜곡이 발생하지 않도록 모델링 방법을 제안합니다.
각 pixel의 시간을 개별적으로 계산합니다.
t = t_frame + (y/H)*t_readout
t_frame : frame의 시작 시간, y는 픽셀의 수직 위치(0부터해서), H는 image height, t_readout은 전체 이미지를 읽는데 걸리는 시간
각 픽셀에 계산된 시간 t를 NFF의 입력 t로 활용됩니다.
Differing camera settings
AD dataset은 보통 여러개의 카메라를 설정하기에 카메라의 특징들이 다를수있습니다. 따라서 센서 특성을 모델링하기 위한 모듈을 만듭니다. rendering단계로 가기전에 sensor embedding단계를 만들어서 각 센서마다 learnable embedding을 만들어서 최종 volume rendering 된 결과와 결합됩니다.(concat)
Noisy actor poses
public dataset에서 실제 object의 위치와 크기는 noise가 포함되어 있습니다. 이를 해결하기위해 actor(object)의 위치와 크기에 대해 learnable parameter를 넣어 파인튠을 실시합니다.
Loss
image와 lidar loss로 나눠집니다.
첫번째 term은 일반적인 RGB loss term입니다. N개로 patch화하여 렌더링을 진행하고(UniSim처럼 CNN을 통해 최종 upsampling되기 때문) GT pixel과 predicted pixel간의 L2(squared error)를 사용합니다.
두번째 Term은 pretrained VGG model을 사용하여 GT image하고 prediction image의 feature map을 추출하여 두 맵의 dis-similarity를 봅니다.
이제 lidar loss를 봅시다. 크게 4개의 term으로 되어있습니다.
N은 lidar에서 shoot된 ray의 총수를 의미합니다.
첫번째 term은 depth loss로 L1 loss를 사용합니다. 두번째 term은 intensity로 L2 loss를 사용합니다. 세번째 term은 ray drop loss로 binary cross entropy loss를 활용합니다. 네번째 term은 생성된 point의 모음 즉 pointcloud의 loss로 chamfer distance를 loss로 사용합니다. 4번째 수식이 약간 헷갈릴 수도 있는데 ray i부터 N까지의 point마다 chamfer distnace를 구한다는 것이 아니고 i부터 N까지의 ray의 point모음 즉 pointcloud에서의 chamfer distance를 의미합니다. 논문에는 명시되어 있지 않은데 이 외의 loss를 구할 때는 GT point와 매칭되는 predicted point를 찾아 loss를 구할때 predict point는 GT point와 가장 가까운 점을 찾아 matching하지 않을까 예상합니다.
Recap
recap입니다. 이번에는 실제 training sequence대로 진행해보겠습니다. image가 들어오면 NFF에 input으로 들어가기 전에 픽셀마다 rolling shutter modeling을 통해 time을 구합니다. 해당 image의 3D space에서의 위치(x,y,z)와 pixel time(t)이 NFF 모듈의 input으로 사용이 됩니다. ray에서 efficient samplin 통해 object 근처의 point들이 샘플링되고 sampling된 point들은 NFF모듈로 들어가게 됩니다. 해당 point가 dynamic bound인지 static bound인지에 따라 다른 multi-resolution hash grid에 input으로 들어가게되고(해당 sampled point 위치, t) embedding vector가 나오게 됩니다. scale-dependent downweighting전략에 따라서 해당 sampled point의 동일한 cone영역의 sampled point들을 hash encoding을 태워 나온 embedding값들과 평균화합니다. 단순평균화는 아니고 isotropic Gaussian을 적용해서 weighting합니다. frustum크기에 따라 가중치를 조절해서 multi-scale 문제를 해결합니다. output embedding vector를 mlp 에 넣어 1번째 layer에서는 SDF(s)를 구하고 2번째 layer에서는 direction을 input에 추가하여 최종 feature map을 추출합니다. 이후 sensor embedding에서 나온 embedding 값과 concat하고 (센서마다 다름) lidar의 경우 mlp를 한번더 태우고 image의 경우 CNN을 통해 upsamling하여 최종 image를 렌더합니다.
Experiments
비슷한 논문인 emernerf와의 비교가 없는것은 아쉽지만 nuScenes, waymo, kitti, argo2, ZOD 데이터셋에서 실험을 진행하였고 대부분 제일 좋은 성능을 보이고 있습니다.
simulation gap
해당 논문의 장점으로는 client가 nerf-studio랑 잘 연동되어 있어서 쓰기 쉬워 보입니다. 또한 lidar data도 생성하고 shared FNN으로 다른 비슷한 모델에 비해 빠흡니다.
limitation으로는 여전히 Deformable dynamic actor에 대한 한계가 있습니다.