
출처: PointNet 설명(Standford)
공부 참고 출처
공부 참고 출처2
Point Cloud: 3차원 공간에서 있는 점들의 집합
Point Cloud 예시
Voxel: Voxel Grid에서 표현한 3D 모델
Voxel 예시
Mesh: 2D 삼각형으로 구성된 3D 모델
Mesh 예시(출처: MeshLab)
Open3D를 이용한 Voxelization(출처: Open3D)하지만, 이것은 공간 낭비로 비효율적이며 정보의 소실이 발생한다.

=> 어떤 아키텍처가 필요한가?

Classification Network 부터 보자.
1) nx3이 입력된다. n: 점의 개수. / 3: (x,y,z) 값
2) 처음 input transform에서 3x3 행렬과 곱해진다. => nx3 행렬이 된다.
3) mlp(64, 64): fully connected layer를 거친다.
4) feature transform: 64x64 행렬이 곱해짐 -> nx64 행렬이 된다.
5) mlp(64,128,1024): fully connected layer를 거친다.
6) 다음으로 max pooling을 수행한다. => 1024개의 global feature를 추출한다.
7) mlp(512,256,k): fully connected layer를 거친다.
여기서 k는 모델이 예측할 수 있는 label의 개수이다.
=> output scores: 최종 score
Segmentation Network
결과: nxm (n: 데이터의 개수, m: 각 데이터가 수확할 수 있는 label의 개수)
여기서 중요하게 볼 것은 Classification Network에서 max pooling(1번)과, Segmentation Network에서 nx1088 행렬(2번), 그리고 Classification Network에서 input transform(3x3 transform),feature transform(64x64 transform)(3번)이다.
정리
Point Cloud를 계산하기 위해서는, symmetry Function이 필요하다.
(Symmetry Function for Unordered Input: 순서가 없는 입력을 위한 대칭 함수)
PointNet은 순서가 없기 때문에, N개의 벡터를 입력받았을 때, 입력 순서와 상관없이 항상 동일한 결과를 출력해야 한다.
=> 대칭 함수를 사용한다.
f(x1,x2) = f(x2,x1)
h: Hidden Layer
g: Max Pooling(대표값 추출)
f({x1, ... ,xn}) ≈ g(h(x1), ... ,h(xn))
(g와 h를 사용해서 f를 근사한다.)