VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection

2019. 9. 13. 00:10Paper Review/Pointcloud Learning

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection
  1. Introduction
Figure 1 VoxelNet
Point cloud로 3D object detection을 할 때 challenge가 되는 issue들은 2D image와 비교하였을 때 매우 sparse하고 sensor의 상대적 위치, occlusion에 따라 point의 수가 달라져서 highly variable point density를 갖는 문제가 있다. 기존에는 이러한 point cloud를 3D object detection에 적합하게 변형하기 위해 직접 feature를 찾아서 변환하는 hand crafted feature representation 사용되었다. 본 논문에서는 이러한 hand crafted feature를 찾고 RPN을 사용하는 복잡한 과정 없이 feature extraction과 bounding box prediction을 single stage로 합쳐서 end-to-end로 학습 할 수 있는 deep network인 VoxelNet을 제안하고자 한다.
Figure 2 VoxelNet의 전체적인 architecture
VoxelNet은 특징적인 feature representation을 학습하는 동시에 point cloud로부터 3D bounding box를 end-to-end로 찾아낸다. 본 논문에서는 voxel feature encoding(VFE) layer라는 voxel내의 point들 간의 상관관계를 학습하는 새로운 design을 제시하였다. 전체 과정은 여러 개의 VFE layer를 통해 point cloud를 equally space 3D voxel로 변환하고 3D convolution을 적용하여 local 3D information을 얻은 다음에 RPN을 통해 detection result를 얻는 식으로 진행된다. VoxelNet은 KITTI BEV, 3D benchmark에서 큰 차이로 SOTA의 성능을 보였다고 한다.
본 논문의 main contribution을 정리하자면
  • Hand crafted feature가 필요 없이 raw point cloud를 input으로 받아 end-to-end로 학습 할 수 있는 새로운 point cloud based 3D detection architecture인 VoxelNet을 제안하였다.
  • VoxelNet을 sparse point structure와 voxel grid 병렬 처리에 대해서 매우 효율적으로 실행하는 방법을 제안하였다.
  • KITTI benchmark에서 실험을 하여 car, pedestrian, cyclist detection benchmark에서 SOTA의 성능을 보였다.
 
  1. VoxelNet
     
    1.  VoxelNet Architecture
VoxelNet의 구조는 1) Feature Learning Network, 2) Convolutional middle layers, 3) Region Proposal Network 이렇게 3개의 block으로 나뉜다.
      1. Feature Learning Network
Voxel Partition: 주어진 point cloud를 위의 그림처럼 D x H x W(z, y, x축에 해당)의 개수와 vD, vH, vW 크기의 equally space voxel로 나눈다.
Grouping: 하나의 voxel grid 내에 있는 point를 같은 group으로 묶는다. Point cloud는 density의 variance가 심하고 sparse하기 때문에 voxel은 다양한 숫자의 point를 포함하게 된다.
Random Sampling: 일반적으로 LiDAR sensor로부터 얻은 point cloud는 1frame당 10만개 정도의 point를 갖고 있다. 이는 computation, memory부담이 심하고 point density의 variance가 큰 요인이 된다. 이를 줄이기 위하여 T개 이상의 point를 가진 voxel에서 T개의 point를 random하게 sample하여서 computation을 줄이고 sampling bias를 줄임과 동시에 training에 variation을 주었다고 한다.
Stacked Voxel Feature Encoding: 핵심적인 아이디어는 연속적인 VFE의 layer들이다. 위의 그림은 전체적인 stacked voxel feature encoding 과정과 VFE layer-1의 형태를 나타낸 그림이다.
개의 LiDAR point를 포함한 비어있지 않은 voxel이라고 표현하고
는 i번째 point의 xyz좌표와 reflectance를 포함하고 있다. 우선 voxel 내부의 점들의 local mean을 구하여 V의 centroid를 구하고 이를(vx, vy, vz)라고 표현한다. 그리고 각각의 point에 대해 이를 이용해 point의 centroid로부터의 상대적 위치를 feature로 augment하여
의 형태로 input feature set을 얻고 FCN을 통해서 space 내부의 feature들을 aggregate하면 voxel 내부의 surface의 형태를 얻을 수 있는 어떠한 feature space로 변환하여 point-wise feature
를 얻고 MaxPooling을 통해 V 내부의 feature들을 aggregate하여
를 얻는다. 이러한 aggregate한 feature와 point-wise feature를 concatenate하여 output feature는 
의 형태가 된다. 모든 비어있지 않은 voxel에 대해 같은 방식을 적용하고 FCN의 parameter를 공유한다.
본 논문에서는 VFE-i(cin, cout)을 통해 i번째 VFE layer를 나타내는데 이 linear layer에서는 cin x (cout/2) 크기의 matrix를 학습하고 point-wise concatenation이 output dimension인 cout을 생성한다.
Output feature가 point-wise feature와 locally aggregated feature가 결합된 형태이기 때문에 VFE layer를 쌓는 것은 voxel내의 point들의 상관관계로부터 feature를 얻을 수 있게 되고 마지막 feature representation에서 shape information에 대한 상세한 정보를 얻을 수 있게 된다. Voxel-wise feature는 VFE-n 을 FCN을 통해 C 크기의 vector로 변환하고 element-wise Maxpool을 적용함으로써 얻을 수 있다.
Sparse Tensor Representation: non-empty voxel들을 처리함으로써 voxel feature들의 list를 얻을 수 있다. 이렇게 voxel-wise feature의 list는 sparse한 C x D’ x H’ x W’ 크기의 4D tensor로 변환할 수 있다. Point cloud가 10만개 정도의 point를 가지고 있지만 90% voxel은 비어있게 된다. 이를 통해 memory 사용량과 computation을 매우 압도적으로 줄였고 이 부분이 본 논문에서 제시한 효율적인 실행방법에서 가장 중요한 단계라 하였다.
      1. Convolutional Middle Layers
M-dimension conv operator를 표현하기 위해 ConvMD(cin, cout, k, s, p)를 사용했다. cin과 cout은 input과 output channel을 나타내며 k, s, p는 kernel, stride, padding size를 나타낸다. 각각의 ConvMD는 3D conv, BN, ReLu로 이뤄져 있고 ConvMD를 통해 voxel-wise feature를 합치고 점점 receptive field를 늘려가며 shape 표현의 context를 추가해 나간다.
      1. Region Proposal Network
RPN은 높은 성능을 보이는 최근의 object detection framework들에서 매우 중요하게 사용되는 block이다. 본 논문에서는 RPN architecture에서 중요한 부분들을 수정하였고 feature learning network와 ConvMD와 결합하여 end-to-end로 학습할 수 있는 pipeline을 만들었다.
RPN의 input은 ConvMD를 통해 얻을 수 있는 feature map이고 네트워크는 3개의 FCN block으로 이루어져있다. 각각의 block의 첫번째 layer는 stride를 2로 하여 feature map을 절반의 크기로 downsample하며 그 다음 layer들은 stride가 1로 크기를 유지하며 BN과 ReLU를 거치게 된다. 그리고 각각 block의 output들을 일정한 크기로 upsample하여 concatenate함으로써 high resolution feature map을 얻는다. 결국 이 feature map은 learning target에 따라 probability score map과 regression map의 형태로 그려지게 된다.
 
    1.  Loss Function
Positive anchor와 Negative anchor의 set을 Npos, Nneg라 정의하고 모두 loss에 사용한다.
위와 같이 distance metric을 잡고 centroid의 좌표의 차이, bounding box의 형태의 차이, heading angle의 차이를 기준으로 loss를 구한다.
Loss function은 위와 같으며, classification loss는 softmax를 통해 구하고 regression loss는 위의 metric대로 ground truth와 positive anchor사이의 distance를 구하는 식으로 계산한다. α와 β는 hyperparameter로 loss들 간의 비율을 조절한다.
    1.  Efficient Implementation
GPU는 dense한 tensor를 처리하기에 최적화 되어있기에 sparse한 point cloud를 처리하기에는 효율적이지 않다. 그래서 point cloud를 VFE를 쌓은 dense한 tensor형태로 바꾸어 point와 voxel에 대해 병렬적으로 처리 가능한 방법을 고안했다고 했다.
그 방법은 위의 그림과 같은데 K x T x 7 크기의 tensor를 만들어 voxel input feature buffer를 저장하려고 했다. K는 비어있지 않은 voxel의 최대 개수, T는 voxel당 들어있는 최대 point 수, 7은 앞에 언급하였던 각각 point당 가지는 input feature의 dimension이다. Processing 이전의 point는 randomized 되어 있으며 point cloud내의 각각의 point에 대해 어느 voxel안에 존재하는지를 확인한다. 이 lookup방법은 voxel coordinate를 hash key로 사용하는 hash table을 사용함으로써 O(1) 시간 안에 해결할 수 있다. 만약 voxel이 이미 생성되었으며 voxel 안에 T개 이하의 point가 있다면 point를 그 voxel location에 저장하고 다른 경우에는 point들을 무시한다. 만약 voxel이 생성되지 않았으면 새로운 voxel을 생성하고 이 voxel의 좌표를 voxel coordinate buffer에 저장하여 point들을 이 voxel location에 저장한다. Voxel input feature와 coordinate buffer는 point cloud를 한번 불러오는 동안에 생성할 수 있으며 complexity는 O(n)이다. Memory/computation의 효율정을 더 높이기 위해 voxel의 최대 개수를 K개로 제한했으며 point가 거의 없는 voxel들은 무시하였다.
Voxel input buffer가 생성된 후에 여러 개의 VFE는 GPU에서 병렬적으로 처리할 수point level과 있는 voxel level의 dense operation만 포함하게 된다. 알아둬야 할 것은 VFE에서 concatenate가 이뤄지면 empty point에 해당하는 feature들을 0으로 만듦으로써 voxel feature를 계산하는데 영향을 끼치지 않게 한다. 마지막으로 coordinate buffer를 통해 sparse한 voxel-wise structure를 dense한 voxel grid로 재배열한다. 이 이후에 ConvMD와 RPN이 dense한 voxel grid에서 돌아감으로써 GPU에서 효율적으로 작동하게 된다.
  1. Training Details
    1.  Network Details
KITTI dataset에서 car와 ped/cyc 에 대해 각각 다르게 setting 하였으며 단순히 parameter에 관한 정보이므로 자세한 detail은 논문을 참고 하기를 바란다.
    1.  Data Augmentation
4000개 미만의 training set을 사용하다 보니 overfitting을 피할 수 없었다고 한다. 이를 위해 3가지 형태의 data augmentation을 진행했다고 한다.
첫번째 augmentation으로는 각각의 3D ground truth box에 대해서 box안에 있는 point과 box를 주변에 복제하고 이를 random한 위치에 random한 heading angle로 복제한다.
두번째 augmentation으로는 모든 ground truth box와 point cloud에 대해서 global scaling을 하는 것이다. 이 scaling을 통해서 다양한 distance의 다양한 size의 object를 찾는 task에서 robust 해진다.
세번째 augmentation으로는 모든 ground truth box와 point cloud에 대해서 global rotation을 하는 것이다. 이 rotation을 통해서 vehicle이 회전을 하는 상황에 대해 학습할 수 있다.
  1. Experiments
End-to-end learning의 중요성을 분석하기 위해서 VoxelNet architecture에서 쓰이는 baseline과 hand-crafted feature를 사용하는 것에 대한 비교도 하였다.
 
    1.  Evaluation on KITTI Validation Set
VoxelNet은 SOTA의 성능(특히 3D)을 보였고 Hand crafted feature를 사용한 것에 비해서도 높은 성능을 보여 feature from learning을 사용하여 end-to-end로 학습하는 것이 더 좋은 성능을 보인다는 것을 보였다.
    1.  Evaluation on KITTI test set
VoxelNet의 inference time은 225ms 이며 voxel input feature에서 5ms, feature learning task에서 20ms,  ConvMD에서 170ms, RPN에서 30ms가 소요되었다.
  1. Conclusion
대부분의 LIDAR기반의 3D detection은 BEV projection과 같은 hand crafted feature에 의존해왔는데 이 논문에서는 manual feature engineering의 bottleneck을 제거하고 end-to-end로 학습 가능한 구조를 제안했다. 또한 sparse한 point cloud와 voxel을 병렬적으로 처리하는 효율적인 방법을 제안하였다. KITTI benchmark에서도 최상위의 성능을 보였다. 그러나 여전히 pedestrian과 cyclist에 대해서는 여전히 성능 개선의 여지가 많이 남아 있다.

'Paper Review > Pointcloud Learning' 카테고리의 다른 글

PointNet, PointNet++  (0) 2021.04.10
FlowNet3D  (0) 2021.04.10
PointPillars: Fast Encoders for Object Detection from Point Clouds  (0) 2019.09.04