3D Object Detection 논문

PV-RCNN: Point-Voxel Feature Set Abstraction for 3D Object Detection 리뷰 및 정리

연구자H 2021. 2. 11. 01:32

오늘 제가 리뷰 논문은 작년 cvpr 2020  pv-rcnn: point voxel feature set abstraction for 3d object detection입니다.

1저자인 샤오슈아이님은 3D object detection 분야에서 좋은 논문을 여러개 내신분입니다.

논문의 네트워크로 KITTI 3d object detection 성능 비교에서 1등을 했었습니다. 현재는 다른 네트워크로 바뀌였고, 현재 pv-rcnn++ 5위를 하고 있는것으로 알고있습니다.

1.Background

 

Pointcloud 데이터의 특징

먼저, 많은 3D object detection 논문이 pointcloud 데이터를 이용하는데 기존 2d 이미지 데이터와 어떻게 다른지 간단하게 보면 좋을것 같습니다. Lidar 센서를 통해 얻은 point cloud point 하나는 3차원 좌표와 반사된 빛의 세기인 reflection intensity 이루어진 4차원 vector입니다.

 

Point cloud 특징

  1. Sparse 하다
  2. Irregular 하다.

그렇기 때문에 이미지 object detection 에서 주로 사용하는 CNN만으로는 충분히 feature encoding하기 힘들고

이 문제를 해결하고자 여러 구조의 네트워크들이 나오고있고 그 중에 하나가 오늘 리뷰하는 논문입니다.

 

3D sparse convolution and point set abstraction

https://towardsdatascience.com/how-does-sparse-convolution-work-3257a0a8fd1 / PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

1. 3D sparse convolution

 

2D image에 2D convolution을 적용한 것 처럼 3D voxel 3D convolution을 적용할 수 있습니다.

3D convolution inefficient하기 때문에 sparse 데이터에 적합한 3D sparse convolution을 적용할 수 있습니다.

위의 그림은 3D sparse convolution을 구현한 내용입니다. 단순히 sparse한 데이터에 효율적으로 적용가능한 sparse convolution입니다.

 

2. Point set abstraction

 

pointnet++ 논문의 point set feature encoding하는 알고리즘입니다.

전체 point에서 keypoint sampling하고 샘플링한 keypoint 중심으로 정해준 반지름 거리 안에 속해있는 point들의 feature 모아서 pointnet block이라는 MLP max pooling으로 이루어진 네트워크를 통과시켜 공간의 정보를 나타내는 feature vector 생성합니다.

 

다시 말해 샘플링된 point local feature encoding 함으로써 convolution처럼 local feature 배우고, 방법을 iterate하게 하면 point cloud 적은 수의 point encoding 하게 됩니다.

 

Point cloud based 3D Object Detection 분류

 

Point cloud 이용한 3D detection 방법은 크게 grid방식과 point방식으로 분류할 있습니다.

 

Grid based method 앞에서 본것과 같이 irregular point cloud regular representation 3D voxel 이나 2D bird eye view map으로 변환한 기존의 2D detection알고리즘 처럼 convolution 통해 detection하는 방식입니다.

이러한 방식은 3d sparse convolution 같은 방법을 적용하여 efficient하게 3d box proposal 있습니다.

하지만 receptive field 3D 또는 2D convolution kernel size 제한된다는 단점이 있습니다.

 

Point based method 주어진 point cloud 데이터를 3D voxel이나 2D bird eye view 변환하지 않고 point 이용해서 feature encoding하여 detection 진행하는 방식이다. 

방법은 주로 pointNet 논문에서 나온 set abstraction 이용하고 이를 통해 flexible receptive field 갖고 point들을 encoding 있습니다.

이런 장점때문에 정확한 contextual information 획득할 있다고 합니다.

하지만, point set abstraction distance-pair 계산해야하기 때문에  computation cost 높다는 단점이 있습니다.

 

PV-RCNN 두가지 방법의 장점을 통합하여 3D object detection 성능을 높였습니다. 

grid방식을 통해 region proposal, point 방식을 통해 location refinement 진행하였습니다.

2. PV-RCNN 구조

Network 구조 Overview

PV-RCCN의 overview

저자가 제안하는 PV-RCNN 전체적인 구조는 그림에서 보이는 것과 같습니다.

2 stage detection 구조로 이루어져있고 첫번째 stage에서 3D box proposal 이루어지고 두번째 stage에서 box proposal 대해서 confidence 계산하고 object 맞도록 location refinement 하게 됩니다.

 

 

3D Voxel CNN for Efficient Feature Encoding 

먼저 1 stage proposal generation 과정을 살펴보도록 하겠습니다. 

stage 기존 2D object detection 매우 유사한 방식입니다. convolution 통해 feature 얻고 RPN(region proposal network) 통해 classification box proposal 하게됩니다대신 Pointcloud voxel 변환하는 과정이 추가되고, 효율적인 연산을 위해 3D sparse convolution 통해 계산을 하는 점이 기존 2D detection과의 차이라고 있습니다.

 

과정을 좀더 자세히 살펴보면 voxel 변환된 데이터를 3x3x3 3D spase convolution 통해 8배까지 downsampled size feature volume 생성합니다.

 

3D feature volume z축을 기준으로 stacking하여 2D bird eye view feature map으로 변환합니다. feature map에서 anchor based 방식으로 3D box proposal generate합니다. feature map pixel마다 orientation (0,90) 두개의 anchor 갖고있고 anchor 물체의 유무에 대한 classification box regression 하게 됩니다.

 

1 stage에서는 기존 grid방식과 크게 다른점이 없습니다.

논문에서 자세히 봐야하는 것은 저자가 , 그리고 어떻게 grid방식과 point방식을 통합하려는지입니다.

 

저자는 논문에서 3D feature volume이나 2D feature map으로 RoI pooling 하는 것에 2가지 문제 있다고 주장합니다.

첫번째 문제 3D convolution 통해 8배까지 사이즈를 줄이면서 resolution 낮아졌기 때문에 input scene에서의 object 정확한 location 알기 힘들다는 것입니다. 다른말로 하면 information loss 존재한다는 것입니다.

 

두번째 문제 만약 upsampling 통해 feature volume이나 feature map 얻는다하여도 여기에 sparse하다는 문제가 남아있습니다. interpolation 통해 upsampling 하면 바로 주변의 정보만을 이용하기때문에 전체적인 contextual information 없기떄문에 좋지 않습니다그러나 pointnet에서 제시한 set abstraction operation 사용한다면 적은 수의 point들이 매우 넓은 receptive field 갖기 때문에 이는 정확하고 robust refinement 가능하게 만든다고 주장하고 있습니다.

 

그러나 set abstraction operation distance-pair 모두 구해야하기 때문에 computational cost 높다는 문제점이 있습니다.

따라서 저자들은 과정을 2step 만들어줌으로써 computational cost 줄였습니다. naive 방법으론 모든 box proposal 안의 grid point 잡고 grid point 대해 multi-scale feature volume set abstraction operation 합니다.   과정에서 keypoint 추가해주어 2단계로 나누는데, 먼저 샘플링한 keypoint들로 feature volume aggregate 다음. keypoint들을 이용해서 RoI grid들이 feature 만드는 방식입니다.

 

논문에 naive 방식을 했을때 pair wise distance 얼마나 구해야하는지에 대한 예시가 있어서,  가정에 맞춰 저자들이 제시한 2-step방식으로 pair wise distance 대해서 계산해보았더니 대략 10%~ 15%정도의 연산이 줄어드는것으로 나왔습니다.  그래도 연산량이 상당하긴합니다.

 

Voxel-to-keypoint Scene Encoding via Voxel set Abstraction

2step 중 첫번째 스탭은 keypoint sampling 하여 voxel set abstraction 통해 multi-scale feature volume encoding하는 작업입니다이는 voxel set abstraction module 통해 이루어집니다.

 

저자들이 이야기하는 첫번째 main contribution입니다.

 

먼저 전체 point cloud에서 정해진 개수의 point furthest-point sampling 알고리즘을 통해 sampling합니다. ( FPS non-empty voxel에서 uniformly하게 존재하도록 한다)

 

하나의 keypoint 정해진 반지름(rk)만큼의 영역에 포함되는 voxel feature 모아 set 형성합니다. 

 

오른쪽 수식을 보면 lk 몇번째 feature volume인지를 나타내고 f voxel-wise feature vector이고, v-p keypoint 중심으로 voxel 상대좌표입니다. vector concatenate 하여 S라는 set으로 모읍니다. 오른쪽 수식의 rk k번째 layer 대해서 정해진 반지름입니다. 반지름을 레이어에 따라 다르게 설정해줌으로써 set abstraction operation flexible receptive field 갖는다고 생각하면 됩니다. 구현과정에서는 레이어당 2개의 반지름을 설정해주었습니다.

 

그렇게 모은 set pointnet block 통해 keypoint feature vector 만들어줍니다.

Pointnet block 보면 뮤는 최대 T 랜덤 샘플링.G multilayer-perceptron layer. max max pooling layer입니다. 

과정을 통해 keypoint feature volume에서의 feature vector 얻습니다.

 

layer 구한 key point feature들을 모으고 거기에 추가로 raw데이터에 대한 set abstraction bird eye view에서 구한 key point feature까지 합쳐주어 최종적인 key point feature 구성하게 됩니다.

 

Raw data voxelization 하면서 발생하는 quantization loss 복구해주기위해 추가해주었고

Bird eye view z축을 따라 넓은 receptive filed 갖기위해 추가해 주었습니다.

 

Predicted key point weighting Module (PKW module)

지금까지 Voxel set abstraction module 통해 key point feature 학습하는 방법을 보았습니다.

저자는 여기에 predicted key point weighting module 추가해주었습니다.

모듈은 foreground keypoint refinement과정에서 background keypoint보다 많은 기여를 해야한다는 아이디어를 구현한 것입니다.

Point cloud Segmentation network 추가하여 해당 Point foreground인지 background인지 confidence 계산하여 weight 주어집니다.

따로 segmentation label없이 ground truth 3D box 내부의 point foreground 외부의 point background 학습시켰습니다.

실제 동작시 학습된 네트워크를 통해 foreground confidence keypoint feature 곱해줌으로써 foreground keypoint refinement 영향을 주도록 하였습니다.

학습시 focal loss 통해 트레이닝 셋의 분포가 unblanced 문제를 해결해 주었습니다.

 

 

Keypoint-to-grid RoI Feature Abstraction for Proposal Refinement

 

앞의 과정들을 통해 적은 수의 keypoint multi-scale semantic feature 정보를 갖도록 만들어주었습니다. 

이번에는 RoI-grid pooling module 통해 Keypoint-to-grid RoI feature abstraction 진행합니다.

3D proposal 안에서 6x6x6 grid point( 216개의 grid point) uniformly하게 샘플링 앞에서 사용한 set abstraction operation 이용하여 이번엔 RoI 안에 grid point feature keypoint들을 통해 encoding 해줍니다.

기존의 방법들은 box안의 point feature average하여 RoI feature encoding하였는데, set abstraction operation 통해 flexible receptive field 많은 contextual information 얻을 있었다고 합니다.

심지어 RoI boundary 바깥의 keypoint information까지 encoding하고 이를통해 refinement성능을 높일 있었다고 합니다.

 

여기에서 왜 굳이 proposal box 바깥의 keypoint까지 encoding하는 것이 필요하냐는 의문을 제기할 수 있습니다.

어떤점이 좋다 라는 것은 논문에 나와있진 않지만, boundary 근처에 있는 keypoint는 boundary 안쪽과 바깥쪽 모두의 정보를 encoding하여 갖고있을 것 이므로 boundary를 결정하는데 중요한 정보로 쓰일 수 있기 때문이라고 개인적으로 생각합니다.

저자가 이 부분을 굳이 동영상 발표 내용에 넣은 만큼 분명 의미가 있을 것이라고 생각합니다.

 

Keypoint-to-grid RoI Feature Abstraction for Proposal Refinement

RoI-grid pooling module 설명하는 이미지 입니다빨간점이 grid point이고, 노란점이 key point, 살구색같은 작은 점들이 raw point입니다.   Grid point에서 다양한 거리(receptive field) 통해 key point set 만들어줍니다이렇게 모은 key point feature set에서 T개를 샘플링. multilayer-perceptron layer. max pooling layer 통해 grid point feature 생성합니다.

 

3d proposal refinement and confidence prediction

앞에서 얻은 3D proposal grid point feature들을 2-layer MLP 통해 256 feature dimension 갖는 RoI feature vector 만들어줍니다.

이후 두개의 branch 이루어진 네트워크를 통해 confidence box refinement 계산합니다.

 

첫번째 식은 training candidate RoI confidence 단순히 0또는 1 갖는 것이 아닌, 좋은 candidate 수록 1 가깝게, 안좋은 candidate 수록 0 가깝게 confidence 예측하도록 학습하기 위해 candidate RoI confidence IOU 통해 계산하는 식이다. 이는 test 일반적으로 0또는 1 classification하는 것보다 어떤 box proposal 좋은지 판단을 잘하게 되는 네트워크가 있습니다.

 

두번째 식은 confidence brach loss function으로 cross-entropy loss minimize합니다.

Box refinement branch에서는 location residual(오차)(center, size, orientation같은) 예측하고 smooth L1 loss function 통해 optimize됩니다.

 

Training loss

Loss function 대해 살펴보겠습니다.

전체 loss  region proposal loss + key point segmentation loss + proposal refinement loss 입니다.

Region proposal loss  L rpn region proposal network(RPN)에서 두개의 brach loss입니다.

L cls anchor classification loss 이고 smooth L1 loss box regression branch loss 입니다.

L seg 앞에서 PKW module에서 segmentation network loss입니다.

Proposal refinement loss L rcnn 앞에서 살펴본 confidence brach box refinement branch Loss입니다.

 

3. conclustion

기존의 grid 방식과 point 방식을 integrate하면서 큰 성능향상을 하였습니다.

integrate 과정에 keypoint를 추가하여 set abstraction 방식을 2 step으로 만들어줌으로써 더 부드럽게 이어지고 계산량도 줄일 수 있었다고 생각합니다.

 

아직 많은 논문을 보지 못했지만, detection 분야는 상당히 engineer적인 요소가 많이 들어간다고 느끼게 됩니다.

이 논문만 봐도 하이퍼파라미터로 voxel크기, 각 feature volume 별 radius를 2개씩 총 12개, grid point set sbastraction에서 2개.

적어도 하이퍼파라미터만 15개를 설정해주어야합니다.  ML 분야(?) 처럼 아름다운 수식과 확률 모델로 빡~! 할 수는 없는 분야인가 봅니다...(아직 많이 몰라서 그런건가??)