[논문리뷰] PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

2D 이미지를 탐지하는 것처럼, 3D 객체도 탐지할 수 있는 기술이 있습니다. 이 분야를 3D Object Detection이라고 합니다. 저도 2D 이미지 객체 탐지는 해보았는데, 3D 객체 탐지도 해보고 싶어서 관련 논문을 통해 공부를 시작하게 되었습니다. 그래서 오늘은 3D detection 발전의 시작이라고 할 수 있는 "PointNet" 논문에 대해 리뷰해보도록 하겠습니다!

 

3D Object Detection

먼저, 3D Object Detection 논문의 발전에 대해 살펴보겠습니다. 3D Object Detection은 데이터셋에 따라서 크게 Multi-modality(Lidar Sensor + 2D RGB Image), Lidar-Only(3D point cloud)로 분류할 수 있습니다.

LiDAR(라이다)?
라이다란 레이저(빛)을 쏴서 앞에 있는 물체에 부딪힌 후 돌아오는 시간을 정확히 잰 후, 그 시간을 통해 물체 간의 거리를 계산하는 센서입니다. 빛을 쏴서 받는 이 과정을 수십만 번 반복하면 주변 환경의 정확한 3차원(3D) 입체 지도를 만들 수 있습니다.

 

2017년 전후로, 3D 데이터를 처리하는 초기 기반이 확립되었습니다. 먼저 PointNet은 3D 포인트 클라우드 데이터를 딥러닝 모델이 직접 처리하는 방식을 발표했습니다. 이후 VoxelNet, SECOND 등은 포인트 클라우드를 Voxel(3D 격자)로 변환해서 3D CNN을 적용하는 방식을 확립했지요. 2018년이 되자 MV3D, Frustum PointNet 등은 정확도를 높이기 위해 LiDAR와 카메라 데이터의 부분적 결합을 시도했습니다.

 

2019-2020년에는 단일 모달리티(위에서 말했지요? 오직 LiDAR 포인터 클라우드만 사용해서 3D 객체를 감지하는 시스템입니다.)의 한계를 극복하고, 실시간성을 확보하면서 정확도를 높이기 위한 모델들이 등장했습니다. 먼저, PointPillars 같은 모델은 포인트 클라우드를 수직 기둥(Pillars)으로 변환해서 빠른 속도로 처리하여 실시간 감지가 가능하도록 했습니다. 또한 PointPainting은 2D 이미지의 의미론적 정보를 3D 포인트 클라우드에 색칠하는 방식으로 센서를 효율적으로 융합했지요. PV-RCNN은 Voxel 기반 특징과 Point 기반 특징을 결합하는 Point-Voxel 융합(Two-Stage)을 통해 감지 성능을 극대화했습니다.

 

2021-2023년에는 자연어 처리 분야에서 혁신적이었던 트랜스포머(Attention-Based) 구조가 3D 비전에 도입되면서 모델의 표현력과 융합 능력이 크게 향상 되었습니다. Attention 매커니즘을 사용한 TransFusion, UVTR 등은 여러 센서의 특징이나 공간적 특징 간의 복잡한 관계를 학습하기 시작했습니다. LiDAR, 카메라가 주요 센서로 사용되는 자율주행시스템을 위해, BEVDet++BEVFusion은 카메라, LiDAR 등 여러 센서의 특징을 BEV(Bird's Eye View)라는 공통된 2D 공간을 변환해 물체를 감지하는 방식을 제시했습니다.

 

그렇다면 2024년 이후 최신 연구는 어떨까요? 최근에는 Diffusion Model, Vision-Language Model 등 더 광범위한 AI 기술을 3D 감지에 통합하면서 성능과 일반화 능력을 높이고 있습니다. 3D 데이터 생성/감지에 새로운 가능성을 연 Diffusion-Based 모델인 3DDetection 등이 등장했으며, Uni3D 같은 연구는 다양한 데이터셋에서 모델의 일반화 능력이 향상되도록 했습니다. 더해서 단안 카메라 모델(하나의 일반적인 2D 이미지)의 성능을 높이기 위한 지식 증류(KD, e. MonoTAKD) 연구와 효율적인 구조 설계(e. SparseVoxelFormer)를 통해 실제로 적용할 수 있도록 그 가능성을 높이고 있습니다.

 

Point Cloud란?

3D Object Detection의 역사를 살펴보았으니, 이제 Point Cloud가 무엇인지 정확히 알아봅시다.

3D 데이터는 크게 3가지 방식으로 표현할 수 있습니다. 바로 Point cloud, Voxel, Mesh입니다. 하나하나 살펴봅시다.

 

Point Cloud

3차원 공간에 있는 점들의 집합을 의미합니다. 하나의 점은 x, y, z 값으로 표현됩니다.

 

Voxel

Voxel이란 Volumetric Pixel의 줄임말입니다. 즉, Voxel이란 Voxel Grid에서 표현한 3D 모델을 의미합니다. 이미지를 보면 네모네모한게 마치 마인크래프트 같지요? 그와 비슷하구나~ 라고 이해하면 됩니다.

 

Mesh

2D 삼각형으로 구성된 3D 모델입니다.

 

PointNet이란?

PointNet 개발 배경

Point Cloud로 3D 객체를 표현하면 문제점이 있습니다. 바로 점들의 밀집도가 균일하지 않다는 겁니다. 아래 이미지를 볼까요?

Point Cloud로 표현한 토끼입니다. 각 점은 x, y, z 좌표값을 가지고 있지요. 그런데 어느 부분에는 점이 많이 찍히고, 어느 부분은 점이 비교적 적습니다. 이처럼 고르지 못한 밀도 때문에 이전의 대부분 연구에서는 Point Cloud를 3D voxel이나 2D 이미지로 변환해서 사용했습니다. 

그걸로 충분했냐구요? 당연히! 이런 연구들은 명백히 한계가 존재합니다. 아래 그림을 보면, 토끼 한 마리를 voxel로 표현하기 위해 3차원 행렬을 사용했습니다. 그러면 토끼가 없는 공간은 어떻게 될까요? 그 공간은 그냥 빈 공간입니다. 따라서 공간이 낭비되기 때문에, 쓸데없이 데이터의 크기가 커져서 비효율적이지요. 나무 사진을 봅시다. 나무를 voxel로 표시하게 되면, 원본과 차이가 발생하게 됩니다. 아날로그 신호를 디지털 신호로 변환할 때 데이터 소실이 발생하는 것과 비슷하지요. 즉, point cloud는 voxel에 비해 물체를 더 구체적으로 표시하므로 정보의 손실이 발생합니다.

 

그렇다면 이 문제를 어떻게 해결할 수 있을까요? 바로 입력으로 Point Cloud를 그대로 넣는 것입니다. 이를 발명한 모델이 바로 PointNet입니다. 즉, PointNetPoint Cloud를 그대로 입력받는 네트워크입니다.

 

PointNet이 하는 일

PointNet은 Classification, Part Segmentation, Semantic Segmentation 작업을 수행할 수 있는 하나의 통합된 네트워크 구조로 이루어져 있습니다. 

Classification

물체가 컵인지, 테이블인지, 차인지 등 하나의 레이블로 분류하는 작업입니다. 

 

Part Segmentation

비행기를 보면 날개가 있고, 몸통이 있고, 엔진도 있습니다. 이처럼 하나의 객체를 그 객체를 이루는 부분으로 나누는 작업입니다.

 

Semantic Segmentation

하나의 장면(Scene), 즉 배경이 주어질 때 그 안에 있는 객체에 대해 Segmentation 작업을 해줍니다.

 

PointNet Architecture

위와 같은 작업을 하기 위해서 어떤 아키텍처가 필요한지 살펴보겠습니다.

 

먼저 파란색 윗부분을 봅시다. 이는 Classification Network로, 분류를 해주는 네트워크이며 입력된 point cloud와 추출된 feature를 표준화하는 모델입니다. 

자세히 살펴볼까요? 먼저 n개의 점이 있다고 생각해봅시다. 이 점은 x축, y축, z축 - 이렇게 3차원으로 이루어져 있습니다. 따라서 input points는 n x 3이 됩니다. 

이러한 input data는 input transform을 거치게 됩니다. 이때 3x3 행렬과 곱해집니다. 그러면 여전히 n x 3 행렬이겠지요. 이후 mlp(64, 64)의 Fully Connected를 거치며 n x 64 행렬이 됩니다.

이제 이 행렬은 feature transform을 거치게 되는데, 64 x 64 행렬과 곱해진 후 여전히 n x 64 행렬이 됩니다. 그러고 난 뒤 fully connected를 한번 더 거치고, n x 1024가 되어 max pooling이 수행됩니다. 그렇게 총 1024개의 global feature를 추출하고, 마지막으로 fully connected layer를 거친 다음에 최종 score를 계산하게 됩니다. 여기서 k는 모델이 예측할 수 있는 레이블의 개수가 되겠지요. 이렇게 분류 작업이 완료됩니다.

 

두번째로 노란색 부분Segmentation Network를 설명해보겠습니다. Classification Network가 진행되면서 feature transform을 거친 n x 64 데이터(= local data)와 max pooling을 거친 global feature(1024) 데이터(= global data)가 만들어졌습니다. 이 두 데이터가 합쳐져서 하나의 데이터(64 + 1024 = 1088)가 만들어지게 되고, 이 네트워크에 들어가서 fully conntected를 거치고 n x 128로 축소된 point features를 생성합니다. 이후 한 번 더 fully conncted를 거치며 n x m 이라는 점수가 계산됩니다. 여기서 n은 데이터의 개수를 의미하고, m은 각 데이터가 속할 수 있는 레이블의 개수를 의미합니다. 

 

이 구조에서 중요한 부분은 총 3가지입니다. 

 

1. max pooling: 입력된 n개의 데이터로부터 중요한 정보를 추출합니다.

2. Local and Global Information Aggregation: Local Feature와 Global Feature를 통합합니다.

3. Two Joint Alignment Networks(= T-Net): 입력된 point cloud와 추출된 feature를 표준화하는 모듈입니다.

 

각각의 부분을 좀 더 자세히 살펴보겠습니다.

 

Details of PointNet

Symmetry Function for Unorderd Input

위에서 1.max pooling 이라고 언급한 부분에 대해 설명해보겠습니다.

 

먼저, Point Cloud를 처리하기 위해 고려해야할 점이 있습니다. 바로 , N개의 점들의 입력 순서와 상관없이 항상 같은 결과를 출력해야 한다는 점입니다. 위에서 보았던 토끼를 떠올려봅시다. 토끼를 만들기 위해 3차원 공간에 점을 많이 찍었습니다. 이 점들은 과연 순서가 있을까요? 머리의 점부터 찍든, 발가락의 점부터 찍든, 아니면 이리저리 왔다갔다 하면서 찍든 결괏값은 똑같습니다. 그렇기 때문에 point cloud를 처리하기 위해서는 N개의 점들이 입력되었다하더라도 순서와 관계없이 항상 동일한 결과가 출력되어야 합니다. (점들은 순서가 없으니까요!)

입력된 데이터의 순서에 관계없이 동일한 결과를 출력하는 방법은 총 3가지가 있습니다.  첫번째는 n개의 데이터를 정렬하는 방법입니다. 그러나 이미 말했듯, 점들은 순서를 부여하기 어렵습니다. 따라서 이는 사실상 불가능하므로 기각입니다! 두번째는 RNN을 사용하는 방법입니다. RNN은 입력 순서가 짧으면 강하지만, point cloud같이 방대한 데이터에는 학습하는데 한계가 있으므로 이도 기각입니다. 그렇다면 마지막 방법은? 바로 간단하게 대칭함수를 사용하는 것입니다!

대칭함수가 무엇이냐구요? 정의역의 순서를 바꿔도 동일한 결과를 얻는 함수를 의미합니다. 따라서 대칭함수를 이용하면 N개의 입력을 받았을 때 벡터(N)의 입력 순서와 상관없이 항상 동일한 결과를 출력할 수 있습니다. 아래는 대칭함수의 예시입니다.

 

다시 논문으로 돌아오겠습니다. PointNet의 전체 네트워크는 N개의 점에 대해 어떠한 결과를 출력해야 합니다. 예를 들어, Object Classification 작업을 수행하기로 했다면 하나의 클래스를 예측해야 하지요. N개의 점에 대한 PointNet의 결괏값이 $f(\{ x_1, x_2, \dots x_n \} )$라면, 이 결괏값은 hidden layer(h)와 max pooling(g)를 사용해서 근사하게 만들어야 합니다. 이때 사용되는 것이 symmetric function, 즉 대칭함수입니다. 

 

이게 어떻게 가능한지 더 자세히 살펴볼까요? 위의 그림을 보면 (1,2,3), (1,1,1) 등 총 4개의 점 데이터가 입력된다고 가정합니다. 이때 fully connected layer(=h)를 거치면 총 4개의 데이터(파란 박스)가 생기게 됩니다. 이제 max pooling을 거치게 되면 하나의 데이터가 나오게 됩니다. 이때 max pooling은 대칭함수가 될 수 있습니다. 따라서 4개의 데이터가 순서가 바뀌더라도 항상 같은 결과가 출력되게 됩니다. 따라서 만약 PointNet에 N개의 점이 입력된다면, 네트워크는 데이터셋이 들어갈 수 있는 순서인 N!개의 순열에 대해 항상 동일한 결과를 출력하게 되는 것이지요. (물론 실제 PointNet 구조는 위 이미지보다 훨씬 복잡합니다)

따라서 max pooling을 거치게 되면, 많은 n개의 점들 중에서 중요한 1024개의 점만 추출하게 됩니다. 짜잔! 이제 이 정보를 통해 Object Classification을 수행할 수 있습니다 🥳

 

Local and Global Information Aggregation

 

우리는 이제 global feature가 있다면 Classification을 수행할 수 있다는 것을 알았습니다. 자, 그렇다면 다른 테스크를 볼까요? 어떻게 하면 PointNet을 통해 Segmentation을 할 수 있을까요? 노란색 박스, Segmentation Network를 봅시다. Segmentation을 수행하기 위해서는 Local Feature와 Global Feature를 모두 알아야 합니다. 왜냐하면 classification과 다르게 segmentation은 객체 뿐만 아니라 주변의 정보도 알고 있어야 하기 때문입니다. 

 

Global feature 계산이 끝나면, Local Feature 뒤에 Global Feature을 연결하는 식으로 두 feature를 통합합니다. 이렇게 만들어진 n x 1088(= 64 + 1024) 크기의 새로운 벡터가 fully connected layer를 거치면서 n x 128 크기로 축소됩니다. 이때 새롭게 만들어진 point features는 local feature과 global feature의 정보를 모두 가지고 있습니다. 그리고 다시 fully conneted layer를 거쳐 n x m 크기의 벡터가 출력됩니다. 여기서 m은 scene 내 레이블의 개수입니다.

 

Joint Alignment Network

위에서 Point cloud를 처리할 때 입력 순서와 상관없이 항상 같은 결과가 나와야 한다는 것을 알았습니다. 그 외에도 고려해야할 점이 또 있습니다. 바로 객체의 위치가 변하거나, 객체가 회전하더라도 같은 결과를 출력해야 한다는 점입니다. 아래 그림을 봅시다.

 

위 이미지는 강체운동이라는 개념을 설명하기 위한 것입니다. 간단합니다! 강체운동이란 병진 운동(=평행 이동)과 회전 운동으로 발생하는 변화를 말합니다. 객체가 이동하거나 회전하더라도 즉, 강체운동을 하더라도 두 객체는 같은 객체입니다. 내가 옆으로 한 걸음 옮기고 90도 회전한다고 해서 내가 아니게 되는게 아닌 것처럼요!

Point Cloud도 똑같습니다. point cloud가 강체운동에 의해서 변형되더라도 동일한 결과를 출력해야 합니다. 고양이를 왼쪽에서 찍던, 위에서 찍던, 몇 걸음 이동해서 찍던 간에 언제나 '고양이'라고 Classification 또는 Segmentation을 수행해야하는 것처럼요. 그러기 위해서 PointNet은 Alignment(정렬)을 수행합니다. 이때 사용되는 네트워크가 바로 Joint Alignment Network입니다. 

빨간 박스 안에 있는 것이 바로 Joint Alignment Network이다

빨간 박스 안의 왼쪽 그림을 먼저 봅시다. 이는 input transform을 나타낸 것입니다. n x 3 크기의 벡터는 T-Net을 거치면서 모든 점들이 표준화된 공간에 놓이게 됩니다. 따라서 강체운동을 하게 되더라도, 3 x 3 행렬(T-Net)이 곱해졌기 때문에 모두가 완벽하게 같아지진 않더라도 비슷한 형식으로 데이터를 표준화하는 것이지요.

 

입력 데이터에 대한 표준화가 수행되면 n x 3이 나오게 되는데 이 벡터가 fully conneted layer를 거치고 나면 n x 64 크기의 벡터가 됩니다. 이는 각각의 점에 대해서, 원래 3차원이었던 점들이 64차원으로 늘어나게 되었음을 의미합니다. 즉, feature를 추출한 것인데 여기서 feature transform을 통해 이 feature에 대해서도 표준화 작업이 수행됩니다. 따라서 n x 64 크기의 벡터에 64 x 64 행렬을 곱하여 feature 표준화 작업을 수행해줍니다.

 

자, 이렇게 PointNet의 주요 특성 3가지를 살펴보았습니다. 우리는 이제 PointNet이 무엇인지 말할 수 있습니다! 🐣

 

Experiments Results

3D Object Classification

 

3D Object Detection을 수행했을 때 입력값이 mesh인 모델, voxel(=volume)인 모델, image인 모델, point인 모델을 비교한 결과입니다. accuracy overall을 보면, PointNet이 89.2로 가장 높은 점수를 받았습니다. 실험은 ModelNet40 데이터셋으로 진행되었습니다.

 

3D Object Part Segmentation

 

다른 3D Object Part Segmentation 모델과 PointNet을 비교한 결과입니다. 실험을 위해서 ShapeNet 데이터셋이 사용되었습니다.

표의 2번째 열에서 볼 수 있다시피 각 모델에 대한 IoU 점수가 계산되었습니다. mean 점수란 각 클래스의 Ground-Truth와 예측된 부분 사이의 IoU 구한 뒤 그 IoU의 평균값을 의미합니다. 이 점수를 보면 PointNetdl 83.7로 가장 높은 점수를 기록했음을 알 수 있습니다.

 

Semantic Segmentation in Scenes

PointNet과 Baseline 모델의 Semantic Segmentation의 결과를 비교한 표입니다. 비교를 위해 Stanford 3D 데이터셋을 사용했습니다.

결과를 보면, 누가봐도 뛰어난 PointNet의 성능을 볼 수 있습니다.

 

Ablation Experiment

이전에 Joint Alignment Network를 설명하면서 T-Net(Input Transformation, Feature Transformation)에 대해 설명했었습니다. 아래 표는 T-Net의 유무에 따른 결과를 비교한 표입니다.

 

Input Transformation과 Feature Transformation 두 개 모두 사용하지 않았을 때 87.1의 정확도를 보입니다. 없어도 상당히 좋은 결과가 나오지요. 그러나 둘다 있을 경우 89.2의 가장 높은 정확도를 기록합니다. input transformation만 있을 때는 87.9, feature transformation만 있을 때는 86.9, feature transformation과 학습을 할 때 softmax loss에 regularization term을 추가해주면 87.4를 기록했습니다.

 

Robustness of PointNet

아래 표는 PointNet의 강건함에 대해 설명하는 표입니다.

제일 왼쪽의 그래프를 봅시다. 간단히 말하면 점들이 20%, 40%, 60%, 80% 등의 비율로 없어졌을 때도 쉽게 Accuracy가 떨어지지 않음을 보여줍니다. 

 

두번째 그래프를 봅시다. 점들이 20%, 30%, 40%, 50% 의 비율로 Outlier(이상치)로 변했더라도 정확도가 어느정도 유지됨을 알 수 있습니다. 그 이유는 Max pooling이 outlier를 어느 정도 무시해준 덕분입니다.

 

마지막 그래프는 각 점에 대해서 가우시안 노이즈(분산)를 추가해주더라도 상당히 좋은 성능이 나온다는 것을 보여줍니다.

 

Conclusion

드디어 결론입니다!

 

자, 그렇다면 PointNet을 한 줄로 정리해봐야겠지요? PointNet이란 Point Cloud 데이터를 전처리없이 그대로 입력받을 수 있는 네트워크입니다. 즉, 데이터도 딥러닝으로 바로 처리 가능하며, 3D Object Classification, Part Segmentation, Semantic Segmentation같은 다양한 작업을 수행할 수 있습니다. 그러면서도 다른 SOTA모델과 비교했을 때 견줄만하거나 더 뛰어난 성능 보유합니다.

 

그러나 한계점이 존재합니다.

바로 PointNet은 3D 물체의 전체적인 윤곽은 잘 보지만, 세밀한 부분의 디테일이나 가까운 점들이 모여서 만드는 구조를 파악하는 데는 약하다는 점입니다. 예를 들어  3D 조각품을 수많은 점으로 본다고 가정해 봅시다. PointNet은 이 점들을 하나하나 독립적으로 관찰합니다. 즉, PointNet은 모든 점을 보고 "이건 의자 같아"라고 판단할 전체적인 모양(글로벌 특징)은 잘 파악하지만 "이 점 옆에 있는 점들은 다리가 되고, 저 점 옆에 있는 점들은 등받이를 이루네"와 같은 가까운 점들 사이의 연결 관계(지역적 구조)는 무시합니다. 이 때문에, 의자의 다리 끝부분이나 섬세한 조각처럼 아주 국소적인 세부 정보가 중요한 작업을 할 때는 정확도가 떨어질 수 있습니다.

 


와! 이렇게 처음 논문 리뷰를 해보았습니다! 앞으로도 열심히 논문리뷰를 해보겠습니다~ 아자!

 


참고 자료

https://medium.com/@parkie0517/pointnet-deep-learning-on-point-sets-for-3d-classification-and-segmentation-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-a623ee58b359

https://www.youtube.com/watch?v=Zrn-g_LCHTc