아래 글에서 이 블로그에서 리뷰한 논문들의 흐름과 분야별 분류를 한 눈에 볼 수 있다.
읽은 논문들 정리
[목차]지속적으로 업데이트 중, 번호는 모델발전 순서가 아닌 읽은 순서에 따라 정렬.1. Computer Vision 분야 논문Classification 모델들의 발전Detection 모델들의 발전Segmentation3D 처리2. Natural Language Process
april2901.tistory.com
논문을 간단히 요약하면 3DGS에서 객체를 분류하는 방법을 소개하는 논문이다.
당연히 기본적으로 3DGS는 알고 있어야 한다.
[CV 논문] 3D Gaussian Splatting for Real-Time Radiance Field Rendering
아래 글에서 이 블로그에서 리뷰한 논문들의 흐름과 분야별 분류를 한 눈에 볼 수 있다.읽은 논문들 정리 3D 가우시안이라는 새로운 아이디어로 기존의 여러 문제들을 해결하고 실시간성을 확보
april2901.tistory.com
방법
기본적으로 이미 학습된 3DGS에 대해 segmentation을 하는 것이므로
가우시안들의 기본 정보(색, 크기, 위치 등)를 수정하지는 않는다.
Gaussian Affinity Feature
가우시안의 속성에 $D$차원의 특징 벡터 $f_g$를 추가한다.
간단히 얘기해서 이 가우시안이 어떤 그룹에 속하는지를 나타낸다고 생각하면 된다.
예를 들어 어떤 가우시안이 사람의 손가락을 표현하는 가우시안들 중 하나인 것이다.
이 손가락 가우시안은 작은 범위에서 손가락이라고 분류될 수도 있고,
좀 더 큰 범위에서 사람의 팔이라고 분류될 수도 있으며, 사람의 일부라고도 분류될 수 있다.
이렇게 한 가우시안이 여러 분류에 속할 수 있는데 이 정보가 복합적으로 $f_g$에 담기는 것이다.
하지만 문제도 있다.
2D이미지에서 어떤 점을 찍고 이 점이 포함된 객체를 추출해줘. 라고 한다면,
위 예시에서 손가락, 팔, 사람 중 어떻게 그룹을 지어서 객체라고 결과를 보여줘야할까?
soft scale gate
위 문제를 해결하기 위해 soft scale gate라는 매커니즘이 나오게 되었다.
먼저 scale이라고 부르는 [0,1]범위의 스칼라 값 $s$가 필요하다.
이 $s$가 scale gate를 통과해 $D$차원의 값 $S(s)$으로 확장된다.
gate는 아주 단순하게 linear layer 하나와 sigmoid로 이루어져있다.
이를 위에서 얘기한 $f_g$와 원소곱을 한다.
$$f_g^s = \mathcal{S}(s) \odot f_g$$
이렇게 얻어진 결과는 scale-gated affinity feature라고 한다.
이 gate는 모든 가우시안이 공유한다.
즉 가우시안 마다 다른 gate를 사용하는 것이 아니기 때문에 연산의 효율을 위해 아래의 방법을 사용할 수 있다.
$$F(p) = \sum_{i=1}^{|\mathcal{G}_p|} f_{g_i^p} \alpha_{g_i^p} \prod_{j=1}^{i-1} (1 - \alpha_{g_j^p})$$
기존 가우시안에서 alpha blending하는 것과 같은 방식을 사용하고 그 대상만 feature 벡터로 바뀐것이다.
카메라에서 쏜 광선이 가우시안들을 통과하며 각 가우시안의 특징 벡터를 조금씩 합쳐 2D평면에 그린다.
즉 2D이미지에서 특정 픽셀에 렌더링된 특징 벡터를 구할 수 있다.
이 2D이미지에 $S(s)$를 원소별 곱을 하는 것이 각 가우시안에 일일히 곱해서 블렌딩하는 것보다 빠르게 계산이 된다.
$F^s (p) = S(s) \odot F(p)$
이렇게 계산하면 주어지는 scale에 맞는 feature 벡터 위주로 남게 된다.
Local Feature Smoothing
한가지 가정이 들어간다.
가까이 있는 가우시안들은 같은 물체일 확률이 높기 때문에 feature도 비슷해야한다는 것이다.
따라서 각 가우시안에 대해 $K$개의 이웃 가우시안을 찾는다.
자기 자신 + 이웃 가우시안들의 특징 벡터를 모두 더해 $K$로 나눈 평균을 자신의 특징으로 삼는다.
이 평균 특징 값은 train중에 사용되고,
학습이 끝났을 때 한번 더 평균값으로 계산되어 최종적으로 저장된다.
이렇게 하므로써 노이즈를 줄일 수 있다.
Scale-Aware Contrastive Learning
$f_g$를 학습시키는 방법이 대한 내용이다.
2D이미지에서 segmentation을 하는 SAM이라는 기법을 사용한다.
2D이미지를 SAM에 넣으면 마스크 세트가 나온다.
마스크는 한 물체를 이루는 픽셀들을 표시해놓은 테두리 쯤으로 생각하면 된다.
이 마스크 안의 2D픽셀들을 카메라의 정보를 이용해 3D공간의 점으로 이동시킬 수 있다.
아래처럼 이 점들의 각 x,y,z좌표값에 대해 분산을 구해 더해 루트를 씌워 3D차원에서의 scale을 구할 수 있다.
$s_M = 2\sqrt{std(\mathcal{X}(\mathcal{P}))^2 + std(\mathcal{Y}(\mathcal{P}))^2 + std(\mathcal{Z}(\mathcal{P}))^2}$
이미지의 각 픽셀은 True/False (0/1)을 원소로 갖는 마스크 개수 길이의 벡터를 가진다.
같은 픽셀이라도 scale의 값에 따라 벡터의 0/1값이 바뀐다.
이 벡터는 $V(s, p) $로 표기 하며, $p$는 픽셀을 $s$는 scale을 나타낸다.
scale과 픽셀, 즉 $s.p$가 주어졌을 때 이 $V$벡터를 구하는 법은 아래와 같다.
1. SAM이 뽑은 마스크 세트를 3D공간에서의 마스크의 물리적 크기($s_M$)가 큰 순서대로 내림차순 정렬한다.
2. 주어진 scale $s$ > $s_M$라면, 그냥 원래 값(해당 마스크에 포함되는지 여부)을 저장한다.
예를 들면 팔 크기의 규모($s$)를 볼 때 손가락인지 여부는 그대로 가져다 쓰면 된다는 것이다.
3. 주어진 scale $s$ < $s_M$라면, 이 두 scale사이의 크기를 가지는 모든 마스크가 픽셀 p를 포함하지 않아야 해당 값을 1로 표시할 수 있다.
이 과정들은 아래 자료의 예시를 통해 확인할 수 있다.

이해하기 쉽게 얘기하면,
특정 scale에 대해 이 값보다 큰 것 중 가장 작은 마스크 까지의 결과는 가져다 쓴다는 것이다.
더 큰 마스크의 경우 scale이 맞지 않다고 생각이 되어 취급을 안한다.
(scale=2, p1에서 사람에 속하는 점이어도 사람이 아니라고 하는 것)
다시 돌아가서 이 $V$가 필요한 이유는 학습의 정답 데이터를 만드는데 필요하기 때문이다.
특정 scale에서 두 점(p1,p2)가 같은 물체인지 아닌지 알려주는 정답지이다.
먼저 $V(s,p1), V(s,p2)$이 두 벡터를 내적한다.
어떤 마스크에서도 두 점이 동시에 소속되지 않았다면 내적은 0이 나올 것이다.
하나의 마스크에서라도 두 점이 같이 들어가 있다면 내적 > 0일 것이다.
이 경우 corr이라는 값을 1로 설정하기로 하자.
$Corr_m(s, p1, p2) = \mathbf{1}(V(s, p1) \cdot V(s, p2) > 0)$
위에서 2D이미지에 $S(s)$를 적용했던 값 $F^s (p)$를 기억할 것이다.
각 픽셀별로 32차원의 값이 있을 것인데 우리가 궁금한 p1, p2의 32차원 벡터에 대해 코사인 유사도를 구한다.
이 두 픽셀의 특징이 얼마나 닮았는지를 계산하게 된다.
이 값은 아래와 같이 식으로 표현하자.
$Corr_f(s,p_1, p_2) = <F^s (p_1) , F^s (p_2)>$
이 값들을 이용해 두 픽셀간의 손실함수는 아래와 같이 정의되었다.
$$\mathcal{L}_{corr}(s, p_1, p_2) = (1 - 2 \cdot Corr_m(s, p_1, p_2)) \cdot \max(Corr_f(s, p_1, p_2), 0)$$
약간 복잡해 보이지만, 경우를 나눠보면 간단하다.
1) 만약 두 픽셀이 한 마스크에서라도 겹칠 때 :
$Corr_m=1$이 되므로 $L = -Corr_f$이다.
해석해보면, 위 값을 줄이는 것이므로 $Corr_f$자체를 키우려고 할 것이고, 이 값은 두 픽셀의 특징의 코사인 유사도이므로 같은 마스크 안의 두 픽셀이 닮아갈 것이다.
2) 두 픽셀이 하나라도 겹치지 않을 때 :
이때는 결과적으로 $Corr_f$를 줄여야한다.
따라서 서로 다른 마스크에 속한 두 픽셀이 멀어질 것이다.
max를 쓰는 이유는 코사인 유사도는 기본적으로 -1~1의 값을 가지는데 이 저자들은 0을 하한값으로 설정해도 충분하다고 생각했기 때문이다.
Feature Norm Regularization
3DGS는 블렌딩하여 렌더링 하기 때문에 실제 각 가우시안의 특징벡터는 이상한데 합산된 결과만 잘 나올 가능성도 있다.
따라서 렌더링 전 각 3D 가우시안의 $f_g$를 단위벡터로 만든다.
$$\frac{f_{g_i}}{\|f_{g_i}\|_2}$$
이를 통해 위 우려를 막을 수 있다.
$$\mathcal{L}_{norm}(p) = 1 - \|F(p)\|_2$$
또 단위벡터들을 더해 만든 최종 2D에서의 특징벡터의 길이를 측정한다.
방향이 다른 단위벡터를 더하면 1보다는 작다.
위 손실을 줄이려면 이 길이가 1에 가깝게 커져야한다.
모두 통합된 최종 손실함수는 아래와 같다.
$$\mathcal{L} = \sum \mathcal{L}_{corr} + \sum \mathcal{L}_{norm}$$
Additional Training Strategy
학습시 몇가지 문제가 있다.
1. 대부분의 픽셀 쌍은 스케일이 바뀌어도 관계가 바뀌지 않는다.
즉 연관없는 픽셀들은 스케일이 바뀌어도 계속 연관없는 경우가 많다는 것이다.
2. 두 픽셀을 무작위로 찍으면 관련없을 확률이 너무 높다.
3. 무작위로 뽑으면 벽과 같이 큰 물체의 픽셀이 뽑힐 확률이 높아 작은 물체의 픽셀은 선택이 잘 되지않아 학습의 기회도 없다.
따라서 아래의 방법들을 사용한다.
1. 연관 관계인 두 픽셀을 고의적으로 더 뽑는다.
2. 물체의 경계근처나 스케일에 따라 관계가 바뀌는 픽셀들을 더 뽑는다.
3. 작은 물체에서 발생한 loss는 더 높은 가중치를 준다.
최종 흐름도는 아래와 같다.

결과
거의 모든 데이터셋에서 SA3D라는 모델보다 높은 정확도를 기록했다.
학습 시 기존 수십분에서 10분 미만으로 시간을 줄이고 추론 속도는 4ms로 매우 빠르다.
아래는 예시이다.
오른쪽의 그림들은 왼쪽에서 오른쪽으로 갈수록 scale이 커지는 방향이다.
