728x90
반응형
나의 정리
- 기존의 hand-crafted feature가 아닌 feature extraction과 bbox prediction이 one-stage로 합쳐진 end-to-end 학습이 가능한 deep architecture이다.
- sparse 한 data인 point cloud를 바로 사용하여 sparse 4D tensor로 바꿔 GPU 연산이 효율적으로 하게 했다.
- point cloud data의 특징인 density imbalance 문제를 해결하였고 non-empty voxel에만 연산을 적용하여 memory, 연산량을 줄였다.
- 간단 요약하면 3D 상에 퍼져있는 point cloud를 voxel이라는 개념을 통하여 voxel 단위로 grouping, sampling 등을 통하여 voxel-wise feature를 뽑아낸 뒤 이 voxel의 위치에 대한 정보를 더해 4D tensor로 만들어 3D Conv를 이용해 detection을 하는 방식
- voxel을 이용하여 point cloud로 3D detection을 진행하는 중요한 논문!
배경 지식
Voxel 이란?
volume과 pixel을 조합한 혼성어로 3차원 공간에서 정규 격자 단위 값을 의미한다.
point cloud란?
3차원 공간상에 퍼져 있는 여러 포인트(Point)의 집합(set cloud)을 의미한다.
여기 논문에서는 LIDAR를 통하여 point cloud를 생성한다.
점군(Point Cloud)은 2D 이미지와 다르게 깊이(z축) 정보를 가지고 있기 때문에, 기본적으로 N X 3 Numpy 배열로 표현된다.
여기서 각 N 줄은 하나의 점과 맵핑이 되며, 3(x, y, z) 정보를 가지고 있다.
point cloud는 정형화 되어있지 않은 데이터이다. 3d 공간상에서 수많은 점들을 순서 없이 기록하는 방식으로 데이터가 저장되어 데이터의 기하학적 특성을 파악하기가 상당히 어렵다.
Sparse 한 특성을 가진다.
→ 즉 주어진 데이터의 3D 공간 안에는 point들에 비해 빈 공간이 상당히 많다.
이러한 데이터는 크기에 비해 얻을 수 있는 유의미한 정보가 거의 없다.
deconvolution 모든 픽셀들을 한 번에 예측하되, 사이즈를 안 줄이면 문제점이 존재하므로, 줄였다가 다시 복원시키면 어떨까?
하는 아이디어를 현실화한 것.
쉽게 말해서, 기존의 CNN과 비슷하게 Feature map 사이즈를 줄이고, 나온 결과를 FC layer에 넣는 대신 Deconvolution을 통해 원본 input 사이즈로 복원한다.
이 때, 앞서서 축소시키는 과정과 대칭이 되게 하는 것이 좋다.
Deconvolution을 upsampling이라고 부르기도 한다.
이러한 과정을 통해서 Conv 과정에서의 parameter가 점점 많아짐에 따라 커지는 메모리와 계산 비용에 대한 문제를 완화할 수 있다.
Abstract
- 기존에는 sparse 한 특성을 가진 LiDAR point cloud 데이터를 RPN(Region Proposal Network)에 넣기 위해 hand-crafted feature를 어떻게 만들 것인지에 집중했다.
이 논문에서는 hand-crated feature를 제거하고 feature extraction과 bbox prediction을 single stage로 통합해 end-to-end로 학습 가능한 네트워크를 제안한다. - VoxelNet은 3D voxel로 point cloud를 쪼개고 VFE(Voxel Feature Encoding) layer를 통하여 각 voxel안의 point들을 이용해 unified feature representation으로 변환한다.
Introduction
- LiDAR-only detection 방식.
- point cloud는 2D image와 비교했을 때 매우 sparse 하고 sensor의 상대적 위치, occlusion(흡수?)에 따라 point의 수가 달라져 highly variable point density를 갖는 문제가 있다.
- 전체 과정
- 여러 겹의 VFE layer를 통하여 point cloud를 동일 크기의 3D voxel로 나누어 encoding 한다.
- 3D convolution을 적용하여 local voxel feature를 통합하여 고차원의 부피 feature로 변환한다.
- RPN을 통하여 detection result를 얻는다.
Contribution
- Hand crafted feature를 찾는 복잡한 과정이 없이 point cloud를 바로 사용하는 end-to-end detector를 제안한다.
- sparse point structure와 voxel grid 병렬 처리에 대해서 매우 효율적으로 실행하는 방법을 제안하였다.
- KITTI benchmark에서 실험을 해 car, pedestrian, cyclist detection에서 SOTA 성능을 냄
VoxelNet
VoxelNet Architecture
-
- Feature Learning Network, 2. Convolution middle layers, 3. Region Proposal 이렇게 3개의 block으로 나뉜다.
Feature Learning Network
- Voxel Partition
- 주어진 point cloud를 D*H*W의 개수와 VD, VH, VW 크기의 equally space voxel로 나눠준다. [D′, H′, W′] (D′=D/vD, H′=H/vH, W′=W/vW)의 크기를 가지는 3D voxel grid로 쪼개진다.
- Grouping
- 하나의 voxel grid 내에 있는 point를 같은 group으로 묶는다.
point cloud는 density의 variance가 심하고 sparse 하기 때문에 voxel은 다양한 개수의 point를 포함한다.
빈 voxel도 존재하게 된다!!
- 하나의 voxel grid 내에 있는 point를 같은 group으로 묶는다.
- Random Sampling
- 일반적으로 LiDAR sensor로부터 얻은 point cloud는 1 frame 당 10만 개의 point를 가진다.
이는 memory, 계산 비용이 심하고 point density variance imbalance의 큰 요인이 된다. - 이를 줄이기 위해 T개 이상의 point를 가진 voxel에서 T개의 point를 random 하게 sample 해서 computation을 줄이고 sampling bias를 줄이고 training에 variation을 주었다.
- 일반적으로 LiDAR sensor로부터 얻은 point cloud는 1 frame 당 10만 개의 point를 가진다.
- Stacked Voxel Feature Encoding
- 연속적인 VFE layer가 핵심적인 아이디어다.
- LiDAR 데이터는 (x, y, z, r)의 형태를 가지는데 이때 r은 LiDAR의 beam이 반사된 세기를 나타내는 reflectance이다.
- Local point들의 중심 값의 mean을 구하여 V의 centroid를 구하고 이를 (vx, vy, vz)로 표현한다.
그리고 각각의 point에 대해 이를 이용해 상대적 위치를 feature로 augment 하여 (xi, yi, zi, ri, xi−vx, yi−vy, zi−vz)의 형태로 만들어 준다. - FCN을 통해 voxel 내부의 모든 point들의 feature에 대한 feature space로 변하여 point-wise feature를 얻을 수 있다.
→ 여기서 만든 feature는 voxel 내부의 surface 형태가 인코딩 된다.
⇒ FCN은 linear layer, BN, ReLU로 구성된다. - 이 point-wise feature를 max-pooling을 통해 V 내부의 feature들을 aggregate 하여 locally aggregated feature를 얻는다.
- aggregated feature와 point-wise feature를 concatenate 하여 output feature를 만들어 낸다.
- 이는 비어있지 않은 voxel에 대해 적용하고 FCN은 parameter를 공유한다.
- 우리가 얻고 싶은 것은 point-wise feature가 아닌 voxel-wise feature이다.
따라서 VFE-layer를 모두 통과한 후 얻은 point-wise feature를 마지막으로 FCN과 element-wise max-pooling을 통과시켜 최종적인 voxel-wise feature를 얻게 된다. - 논문에서는 2개의 VFE-layer를 쌓아서 사용하고 이를 통해 voxel 내부 point들의 shape information을 학습할 수 있다고 주장한다.
- Sparse Tensor Representation
- sparse 한 LiDAR point cloud의 특성상, 90% 이상이 empty voxel이다. 단순히 CxDxHxW 형태의 4차원 tensor로 나타내면 메모리, 연상량 낭비가 생긴다.
- 따라서 non-empty voxel들에 대응되는 feature를 list형태로 관리하는 sparse tensor representation이 backprop과정에서 연산량과 메모리 사용량을 줄여준다.
Convolutional Middle Layers
- ConvMD(cin, cout, k, s, p)로 M-dimension Conv operator를 표현한다.
Cin & Cout : input과 output의 channel 수
k : kernel size
s : stride
p : padding size - 3D Conv, BN, ReLU를 순차적으로 거치고 ConvMD를 통하여 voxel-wise feature를 합치고 점점 receptive field를 늘려가면서 context를 shape description에 추가해 나간다.
Region Proposal Network
- 논문에서 RPN의 architecture에서 중요한 부분을 수정하고, feature learning network, ConvMD와 결합하여 end-to-end 학습이 가능한 pipeline을 만들었다.
- RPN의 input은 ConvMD에 의해 만들어진 feature map이고 네트워크는 3개의 Fully Convolutional layer로 나누어진다.
- 첫 layer는 stride를 2로 유지하여 feature map을 절반의 크기로 downsample 하고 그다음 layer들은 stride가 1로 크기를 유지하며 BN, ReLU를 거치게 된다.
- 각각의 block의 ouput들은 일정한 크기로 Upsample 하여 concatenate를 해 high resolution feature map을 얻는다.
- high resolution feature map은 probability score map과 regression map으로 매핑이 된다.
Loss function
- Positive anchor와 Negative anchor의 set을 Npos, Nneg라 정의하고 모두 loss에 사용한다.
- classification loss는 binary cross entropy loss를 통해 구하고 regression loss는 위의 metric대로 GT와 positive anchor 사이의 distance(SmoothL1)를 구하는 식으로 계산한다.
alpha, beta는 hyperparameter로 loss들 간의 비율을 조절한다.
Efficient Implementation
- GPU는 dense 한 tensor를 처리하기에 최적화되어있어 sparse 한 point cloud를 처리하기에 효율적이지 않다.
따라서 stacked VFE를 통해 dense tensor로 바꾸어 point cloud를 voxel상에서 병렬 처리가 가능한 방법을 고려했다.
- K x T x 7차원의 tensor 구조를 갖는 Voxel input feature buffer와 KxTx1차원의 voxel coordinate buffer를 초기화한다.
- K: non-empty voxels의 최대 개수
T : voxel 당 가질 수 있는 최대 point 개수
7은 x, y, z, r, x-Vx, y-Vy, z-Vz이다. - point를 쭉 돌며 point가 속한 voxel이 초기화된 적이 없다면 voxel의 좌표를 voxel coordinate buffer에 추가하고 point를 voxel input feature buffer의 해당 voxel 위치에 삽입한다.
- 이렇게 Voxel Input feature buffer를 만들면 VFE에 넣어 dense 한 tensor 구조로 연산을 수행할 수 있게 되고 이는 GPU에서 병렬 처리된다.
- 비어있는 voxel들은 0으로 채워서 연산에 지장이 없게 한다.
- VFE를 거쳐 voxel-wise feature를 얻으면 만들어 두었던 voxel coordinate buffer를 이용해 해당 feature들을 다시 3D voxel grid 상으로 mapping이 가능하다.
- 이러한 과정을 거치게 되면 3차원 상에 불규칙하고 sparse 하게 퍼진 point를 정해진 형태를 갖는 tensor로 바꾸어 처리를 할 수 있고 얻은 feature를 다시 mapping 하는 과정이 GPU 연산 효율을 높여주었다.
728x90
반응형