[논문 리뷰] Pointpillars: Fast Encoders for Object Detection from Point Clouds

임종우·2023년 4월 5일
0

음 몇번째 논문이지?
한 네번째 되는 것 같다.
이제는 조금 빨라진 것 같기도 하고 아닌것 같기도 하고.

어쨌든 읽다보면 기초를 다시 탄탄히 해야겠음을 느낀다. 정말로!


PointPillars: Fast Encoders for Object Detection from Point Clouds

Abstract

  • 해당 논문에서는 point cloud를 down stream detection pipeline에 적절한 형태로 encoding 하는 문제에 대해 다룬다.
  • 최근의 논문들은 1. fixed encoder(빠르지만 정확도가 낮음), 2. 학습된 인코더(느리지만 정확도가 높음)의 두가지 형태의 인코더들을 주로 제안하고 있다.
  • 이 논문에서는, PointNet을 활용하여 pointcloud를 vertical columns(pillars)로 인코딩하는 PointPillars라는 새로운 encoder를 제시한다.
  • PointPillars를 통해 인코딩된 feature는 다른 인코더를 사용한 결과와는 다르게 2D convolution에 적용될 수 있다.
  • 해당 인코더를 사용하여 실험한 결과, 3D와 Brid Eye View의 속도와 정확성 측면에서 모두 SOTA를 찍었다. 실행시간은 2~4배 개선되었다.
💡 PointPillars는 Point cloud를 Pillars(수직 기둥들)로 인코딩하는 새로운 방법을 제시한다. 이를 통해 피쳐가 2D convolution에 사용될 수 있도록 하였고, 그 결과 속도가 매우 향상되었으며 성능도 좋았다.

Introduction

  • CV분야가 매우 발전함에 따라, object detection 기술을 lidar point cloud에 얼마나 적용할 수 있는지에 대한 연구가 계속 진행되어왔다.
  • 이미지와 point cloud간의 큰 차이는 1. image는 dense하고, point cloud는 sparse 하다는 것과 2. image는 2d이고, point cloud는 3d라는 것이다.
  • 따라서 일반적인 image convolutional pipeline만으로는 point cloud에서의 object detection을 잘 해낼 수 없다.
  • 그래서 몇몇의 연구들은 point colud의 image로의 projection 또는 3D Convolution의 사용에 집중했다.
  • 최근의 방법들은 point cloud를 Bird’s Eye view에서 바라보는 방법을 많이 사용한다. 이러한 방법은 물체의 scale 정보를 유지시켜주고, occlusion을 감소시킨다는 장점이 있다.
  • 그러나, 이러한 BEV를 CNN에 직접 사용하기에는 너무 sparse하여 효과적이지 않다.
  • 이 문제에 대한 해결으로써, ground plane을 regular grid로 나누어 각각의 gird에 hand crafted feature encoding을 진행하는 방법도 고안되었으나, 일반화되기 쉽지 않다는 단점이 있다.
  • VoxelNet은 3d object detection 분야의 첫 end to end 모델로, 공간은 voxel로 나누고, 각각의 voxel에 PointNet을 적용하여 feature encoding을 한 후, 3d convolutional middle layer를 지난 후 RPN을 적용해 3d detection을 진행한다.
  • 이는 성능은 좋지만, real time detection에 사용하기에는 너무 느리다.
  • 최근에는 SECOND가 등장하여 속도를 올렸으나, 여전히 3D convolution을 사용하기에 느린 점이 있다.
💡 3d detection 분야의 발전 현황. 일반적인 image와 달리 3d이며 sparse 하다는 특징이 존재하여, 여러 방법 중 BEV와 3D Convolution을 사용하는 방법이 사용되고 있다. 최근 VoxelNet의 등장으로 end to end model이 등장하였고, SECOND가 속도를 많이 향상시켰으나 이는 여전히 real time task에 적용하기에 매우 느리다.(3D Convolution 때문)
  • 이 논문은 2D convolutional layer만 가지고 3d object detection 을 진행하는 end-to-end 학습 모델인 PointPillars를 제안한다.
  • PointPillars는 vertical column인 pillar로 공간을 나누고, 이 pillar를 통해 feature를 학습하여 3d oriented box를 예측하는 새로운 형식의 인코더이다.
  • PointPillars는, fixed encoder를 사용하지 않고 pillar를 학습하여 feature encoding을 진행함으로써, pointcloud에 표현된 전체 정보를 활용할 수 있다.’
  • voxel이 아니라 pillar를 사용함으로써, vertical direction을 직접 나누어주지(binning) 않아도 된다.
  • pillars는 2D convolution에 사용될 수 있기 때문에 매우 빠르고 효율적이다.
  • PointPillars는 KITTI Dataset에 대해 3D, BEV에서 모두 최고 성능을 내었다.
💡 PointPillars의 특징 및 장점에 대해 이야기하고 있다. 1. PointPillars는 공간을 Pillar로 나누어 이로부터 특징을 학습하는 새로운 인코더이다. 2. 이는 vertical binning을 직접 진행하지 않아도 되고, 2D Convolution에 활용할 수 있어 매우 빠르고 효율적이다.

1.1.1 Object Detection using CNNs

  • RCNN으로부터 object detection에 CNN을 사용하려는 시도가 시작되었다.
  • Faster R-CNN은 RPN의 등장으로 two stage detector를 발전시켰다.
  • SSD와 같은 single stage detector는 anchor box들을 1stage regression을 통해 분류하여 빠르고 간단한 detection을 진행한다.
  • Focal loss 함수에서, single stage method가 two stage method보다 실행 속도와 성능이 모두 좋다는 연구 결과가 있었다.
  • 따라서 PointPillars에서는 1 stage detector를 head로 사용한다.

1.1.2 Object Detection in lidar point clouds

  • 3D convolution network를 3d detection에 사용하려는 시도들이 있어왔다.
  • 하지만 매우 느리다는 단점이 존재한다.
  • 최근의 방법들은 3D point cloud를 ground 혹은 image plane에 투영하여 실행 시간을 개선하려는 시도를 하였다.
  • 가장 많이 사용되는 방법은 point cloud를 voxel로 나누고, 각각 vertical column의 voxel들을 fixed length의 hand crafted feature encoding을 진행해 pseudo image를 만들어 standard image object detection을 진행하는 방법이다. (MV3D, AVOD, PIXOR 등)
  • 그 후 PointNet의 등장으로, pointcloud에서 직접 학습하여 특징을 추출할 수 있는 방법이 생겼고, VoxelNet이 end to end model로써 3d object detection을 진행한다.
  • VoxelNet에서 PointNet은 voxel에 적용되고 3D Convolutional layer, 2D backbone, detection head의 과정을 거쳐 처리된다.
  • 3D Convolution이 적용되므로, 속도는 매우 느리다.

1.2. Contributions

  • 새로운 방식의 point cloud encoder Point pillars를 제안하여, end to end training 과 3d object detection을 할 수 있는 새로운 방법을 제시한다.
  • pillars에서의 모든 계산은 dense 2D convolution으로 제시될 수 있고, 이는 다른 방법들에 비해 2~4배 빠른 요소이다.
  • KITTI dataset에서 SOTA를 찍었다.

2. PointPillars Network

PointPillars의 network는 다음과 같은 3단계로 구성된다.

  1. A feature encoder network : that converts a point cloud a sparse pseudo-image
  2. a 2D convolutional backbone : to process the pseudo-image into high-level representation
  3. a detection head : that detects and regresses 3D boxes

2.1. Pointcloud to Pseudo-image

  • pointcloud를 2D convolution에 사용하기 위해서는 이를 pseudo-image로 변환해야한다.

  • 따라서 Pointpillars의 첫번째 단계는 pseudo image를 만들기 위한 feature encoder이다.

  • 먼저 point cloud는 x-y 평면의 grid로 세분화되어 각각 grid의 pillar로 만들어진다.

  • 각각의 pillars는 x,y,z,r 뿐 아니라 pillar에 있는 x,y,z 각각의 산술 평균(xc,yc,zCx_c, y_c, z_C), 그리고 각 pillar의 중심점 좌표(xp,ypx_p, y_p)를 포함하고 있는 9차원(D)의 정보를 가진다.

  • point cloud가 매우 sparse하기 때문에, pillar들도 대부분 비어있을 것이고, 비어있지 않은 pillar들의 경우도 몇개의 점밖에 갖고 있지 않을 것이다.

  • sample당 non empty pillars의 개수(P)에 제한을 두고, pillar당 point의 개수(N)에 제한을 두어서 이러한 sparsity를 해결하고, (D,P,N) size의 tensor를 만든다.

  • 즉, sample이나 pillar가 너무 많은 point를 가지면 random sampling하고, 너무 적으면 zero padding한다.

  • 그 후 각각의 point에 PointNet의 간단한 버전을 사용하여 BN, ReLU를 지나게해 (C,P,N)size의 feature tensor를 만든다. channel에 대해 max pooling을 진행하여 (C,P) size의 output tensor가 되게 한다.

  • 이렇게 feature encoding이 되고 난 후, feature들은 다시 원래의 pillar location으로 scatter되어 (C,H,W) size의 pseudo - image를 만든다.

💡 Feature Encoder의 경우, 각각의 점들을 Pillar로 나누어주고, PointNet을 사용하여 Feature를 추출한 후, 이 feature를 scatter하여 pseudo image를 만든다.

2.2. Backbone

  • VoxelNet에서와 유사한 구조의 backbone을 사용한다.

  • 즉, top-down network와 deconvolutional network 두 개의 network로 구성되어 있다.

  • top down network는 여러개의 (S,L,F) Block 들로 이루어져 있는데, 각각의 블록에서는 (S) stirde를 하고, L개의 3x3 2D conv를 지나며, BN과 ReLU를 포함하는 F output channel이 존재한다.

  • block layer의 첫 번째 conv만 S/Sin{{S}/{S_in}}의 stride를 가지며 그 후 conv들은 stride 1을 가진다.

  • deconv network는 각각의 top-down block의 feature들을 upsampling하고 concatenate하여 final feature를 얻어낸다.

  • 이는 transposed 2D convolution, BN, ReLU를 통해 진행된다.

  • 결국 final output feature는 서로 다른 stride를 통해 얻어진 모든 feature들의 종합이다.

💡 Backbone의 경우, VoxelNet에서와 유사하게 여러개의 2D Conv block을 지나고, 각각의 block을 Deconv하여 high resolution feature들의 concatenation feature를 얻는다.

2.3. Detection Head

  • Detection Head로는 single stage detector인 Single Shot Detector(SSD)를 사용한다.
  • 3D Detection에 사용하기 위해 height와 elevation을 추가로 regression 한다.
💡 Detection Head의 경우, SSD에 height와 elevation을 추가하여 사용한다.

3. Implementation Details

3.1. Network

  • network의 parameter들은 pre-train된 값을 사용하지 않고, 랜덤 값을 이용하여 초기화하였다.
  • encoder network는 C = 64의 output feature를 가진다.
  • car, pedestrian/cyclist는 각각 S =2. S =1의 stride값을 가진다.
  • top down backbone network는 Block1(S, 4, C), Block2(2S, 6, 2C), and Block3(4S, 6,4C)로 구성
  • deconv는 Up1(S, S, 2C), Up2(2S, S, 2C) and Up3(4S, S, 2C)로 구성
  • 최종적으로 concatenated된 output feature는 6C개의 feautre를 가지게 된다.
💡 앞서 살펴본 network에 실제로 사용된 parameter 값들에 대해 다루고 있다.

3.2. Loss

  • SECOND에서 도입된 Loss function과 같은 loss를 사용한다.
  • localization regression residual은

    다음과 같이 표현된다.
  • xgtx^{gt}xax^a는 각각 ground truth와 anchor box의 값이고, d는 대각선의 길이를 의미한다.
  • total locatization loss는 smoothL1 loss를 사용한다.

  • angle localization loss로는 flipped된 box를 구별하지 못하므로, 이를 막기 위해 방향을 이산화하여 구분할 수 있는 softmax classfication loss를 사용한다.
  • classification loss는 focal loss를 사용한다.

  • 따라서 최종적인 Loss 함수는 다음과 같다.

  • optimizer로는 Adam을 사용하였고, 0.0002의 lr로 시작하여 15 epochs마다 0.8씩 decay하여 160 epoch를 학습하였다.
  • validation set에서는 batch size = 2, test submission에서는 4로 사용하였다.
💡 Loss 함수로는, smoothL1을 사용한 localization loss, softmax를 사용한 angle localization loss, focal loss를 사용한 classification loss의 가중합을 사용한다.

4. Experimental setup

4.1. Dataset

  • KITTI Dataset을 사용한다. lidar point clouds와 image sample들로 구성되어 있다.
  • car, pedestrian, cyclist를 detection 해야한다.

4.2. Settings

  • 2D IOU를 사용한다.
  • match threshold를 넘으면 positive, negative threshold이하면 negative, 둘 다 아니면 무시한다.
  • IOU 0.5를 기준으로 NMS를 적용한다.

4.3. Data Augmentation

  • KITTI에 있어 Data augmentation은 아주 중요하다.
  • SECOND에서와 마찬가지로, 모든 class에 대한 ground truth 3D box의 lookup table을 만든 후, 임의로 선택된 gt sample들을 current point cloud에 위치시킨다.
  • 그 후 모든 gt box들을 augmentation 시킨다. 회전 및 이동을 진행한다.
  • 마지막으로 point cloud와 box에 대해 random flip, global rotation, scaling을 진행한 후 global translation을 진행한다.

5. Results

Quantitative Analysis.

  • mAP에 있어 가장 좋은 성능을 낸다.
  • Lidar Only만 사용하는 방법들 중에서는 easy car를 제외하고 모든 부문에서 최고 성능을 내었다.

Qualitative Anaylsis

  • 위 Figure들은 bbox 예측 결과를 BEV와 image에 나타낸 것이다.
  • car에 대한 예측 중 오류의 대부분은 false negative on difficult samples이거나 유사한 class에 대한 false positive이다.
  • 보행자와 자전거를 탐지하는것은 더 어려운데, 서로 각각 잘못 분류되는 경우가 많았다.
💡 3d detection 모델들 중 최고 성능을 내었고, 속도도 아주 많이 단축시켰다.

6. Realtime Inference

  • 앞선 Table에서 볼 수 있듯이, PointPillars는 예측 시간에 있어 매우 큰 향상을 보여준다.

  • 따라서 pointpillars의 과정 중 어느 부분이 빠른 것인지를 분석하여 보았다.

  • main inference step은 다음과 같다.

    • point cloud loading and filtering(1.4ms)
    • points are organized in pillars(2.7ms)
    • PointPillar tensor uploaded to the GPU(2.9ms)
    • encoding(1.3ms)
    • scatter to pseudo-image(0.1ms)
    • processed by the backbone and detection heads(7.7ms)
    • NMS on CPU(0.1ms)
  • 이를 통해 runtime이 빨라질 수 있던 가장 큰 이유는 PointPillar encoding임을 알 수 있었다.

  • VoxelNet의 encoder는 190ms가 걸리는데 비해, 1.3ms의 시간은 아주 빠르다.

  • SECOND의 encoder조차도 50ms가 소요된다.

  • VoxelNet에서는 2개의 sequential PointNet이 사용된데에 비해 여기서는 하나만 사용되었고, 이 역시 시간을 줄일 수 있던 원인이다.

  • 이 외 output dimension을 줄이는 등 slimmer design 을 통해 속도를 빠르게 하였다.

💡 PointPillars는 다른 3d detection 모델들에 비해 아주 빠른 속도로 실행된다. 이는 Encoding에 3D Conv가 사용되지 않아 소요되는 시간이 짧기 때문이다.

7. Ablation Studies

7.1. Spatial Resolution

  • binning size를 작게하면 속도는 떨어지지만 성능을 올라간다.
  • speed 와 accuracy 간의 trade off를 binning size로 조절할 수 있다.
  • pillar가 크면, non empty pillar가 적어지고 smaller pseudo image가 만들어지므로 빠르다.
  • pillar가 작으면, 더 정밀한 localization과 많은 feature를 얻을 수 있어 정확하다.

7.2. Per Box Data Augmentation

  • minimal box augmentation에서의 성능이 더 잘 나왔다.
  • 특히, pedestrian의 detection에 있어 box augmentation을 진행할수록 성능이 떨어졌다.

7.3. Point Decorations

  • VoxelNet에서 점의 좌표를 7dimension으로 표시했던 반면, pointpillars에서는 xp와 yp까지 9 dimenstion을 사용했다.
  • 이러한 Decoration이 0.5 mAP의 성능 향상을 가져왔따.

7.4. Encoding

  • PointPillar Encoder가 아닌 SECOND 등의 Encoder를 사용하여 성능을 측정해보았다.
  • fixed encoder보다 learned encoder의 성능이 더 좋았다.
  • VoxelNet의 Encoder가 PointPillars보다 성능이 좋았으나, 시간의 차이가 많이 나기에 PointPillars가 더 좋은 인코더로 보여진다.
  • 조건을 더욱 통제하여 추가 연구가 필요할 것으로 보인다.

8. Conclusion

  • 이 논문에서는 point cloud에 사용될 수 있는 end to end deep network이자 encoder인 PointPillars를 고안하였다.
  • KITTI dataset에서 전까지 존재하던 모델 중 가장 좋은 성능과 가장 빠른 속도를 보였다.
profile
ai school 기간 동안의 TIL!

0개의 댓글