오늘 제가 리뷰할 논문은 작년 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의 특징
- Sparse 하다
- Irregular 하다.
그렇기 때문에 이미지 object detection 에서 주로 사용하는 CNN만으로는 충분히 feature을 encoding하기 힘들고
이 문제를 해결하고자 여러 구조의 네트워크들이 나오고있고 그 중에 하나가 오늘 리뷰하는 논문입니다.
3D sparse convolution and point set abstraction
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-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 분야(?) 처럼 아름다운 수식과 확률 모델로 빡~! 할 수는 없는 분야인가 봅니다...(아직 많이 몰라서 그런건가??)
'3D Object Detection 논문' 카테고리의 다른 글
Mono3D : Monocular 3D Object Detection for Autonomous Driving 요약 및 리뷰 (0) | 2021.01.28 |
---|---|
3DVP: Data-Driven 3D Voxel Patterns for Object Category Recognition 리뷰 - 미완... (0) | 2021.01.27 |