안녕하세요. 후니대디입니다.
PV-RCNN, PV-RCNN++를 이번 포스팅에서 다루겠습니다.
PV-RCNN
PV-RCNN은 PointVoxel-RCNN은 줄임말로 3D voxel과 point-based을 모두 사용하는 프레임워크를 제시합니다. 대부분의 기존 3D detector는 voxel기반 point기반으로 분류될 수 있습니다. voxel(grid)은 보통 voxelization 혹은 BEV 맵으로 변환하고 3D-conv 혹은 2D-conv를 사용하여 feature를 추출합니다. 이 voxelization과정에서 미세한 정보손실이 발생합니다. point-based 방법은 point특성을 모두 살릴수 있지만 computing cost가 비쌉니다.
1. structure
우선 기본적인 backbone은 voxel-based사용합니다. voxelization후에 sparse 3D-conv를 거쳐 feature를 추출합니다. voxelization은 non-empty voxel에서 mean값으로 합니다. sparse 3D-conv로 8배까지 downsampling후에 feature volume을 뽑아냅니다. 이렇게 생성된 feature를 BEV으로 변환합니다. 이렇게 2D grid화 된 feature에 anchorbox를 통해 classification과 box regression을 합니다. 여기과지의 과정이 위의 architecture그림에서 윗부분에 해당합니다. 이 후 보통 RoI pooling을 하게 되는데 해당 논문에서는 RoI pooling을 하게 될 경우 downsampling에 의한 resolution 문제, sparse한 특성에 의해 interpolation을 하게 될 경우에 local feature를 온전히 반영하기 어렵다는 단점을 이야기 합니다. 그래서 아래 keypoint방식을 도입합니다.
2. Voxel-to-keypoint
다음으로는 point-based의 추상정보를 활용하는 방법입니다. 우선 raw points에서 FPS방법을 통해 keypoint를 sampling합니다.
FPS는 furthest-point sampling의 줄임말로 가장 먼 것끼리 set을 만들기위한 알고리즘입니다. 아래의 pointnet++의 포스팅을 참고하세요.
4개의 feature volume에서 해당 keypoint가 해당하는 feature pixel에 일정 radian반경내에 있는 non-empty pixel을 vectorize하고 concat하여 하나의 vector로 만듭니다. (구현과정에서는 2개의 radian을 사용했습니다.)이 후에는 pointnet의 block을 통해 keypoint의 feature vector를 최종적으로 만들어줍니다.
이렇게 만든 VSA module을 확장시킵니다. raw point의 대한 set abstraction과 마지막으로 BEV의 정보까지 포함시켜 최종적으로 key point featrue를 구성합니다. raw data 는 quantization loss를 복구하는 역할 BEV는 z축에 대해서 더 넓은 receptive field정보를 갖추기위해 추가하였습니다.
3. Predicted key-point weighting Module(PKW module)
PKW과정에서는 전 과정에서 구한 key-points feature에 weight를 부여하는 과정입니다. focal loss를 loss function으로 하여 foreground keypoint와 background keypoint의 weight를 달리 부여합니다.
4. Refinement
이렇게 구한 3D bbox proposal과 keypoints feature를 활용하여 refinement를 진행합니다. 이를 위해 RoI-grid pooling을 적용합니다. 3D proposal 에서 6x6x6 grid point 총 216개의 grid point를 uniformly하게 sampling한 후 앞서 구한 feature keypoint를 통해 encoding을 해줍니다.
위의 그림은 RoI-grid pooling module을 설명하는 이미지입니다. grid point에서 다양한 거리(receptive field)를 통해 key point set을 만듭니다. 이 set에서 T개를 sampling하고 pointnet block을 통해 grid point feature를 생성합니다.
이렇게 뽑은 grid point feature들을 2-layer MLP를 통해 256개의 RoI feature vector로 만들어줍니다. 이 후에 두개의 branch로 이루어진 network를 통해 confidence와 box refinement를 계산합니다.
PV-RCNN++
PV-RCNN++의 경우 두가지의 module이 추가됩니다. 하나는 sectorized proposal-centric입니다. 다른 하나는 Vectorpool aggregation 방식입니다.
1. Sectorized Proposal-Centric(SPC)
SPC는 기존 PV-RCNN의 FPS와는 다르게 proposal 부분에 좀더 집중해서 sampling하는 방식입니다.
위 그림에서 보면 크게 2단계로 나뉘는데 proposal bbox부분에 집중해서 point를 filtering합니다. 그 다음단계인 sectorized FPS단계에서는 sector로 points를 구분하고 sector내에서 FPS를 수행하여 keypoints를 sampling하게 됩니다.
2. VectorPool Aggregation
두번째 특징인 LocalVector를 나타내는 방법입니다. 위 그림은 local feature를 aggregation하는 과정입니다. grid point를 중심으로 sub-voxel을 만듭니다. sub-voxel의 속하는 point들을 interpolation을 거쳐 하나의 vector로 표현하고 conv연산을 거쳐 나온 feature vector를 concat하여 local vector representation을 만듭니다. 이 과정이 보다 local spatial 정보를 획득하기 용이하다고 말합니다. 이후 MLP과정을 거처 confidence와 bbox refinement를 수행합니다.
위 표는 pv-rcnn, pv-rcnn++의 실험결과입니다.
이상으로 포스팅 마치겠습니다.