오늘은 3D Object Detection 관련 알아둬야 할 기본 개념을 정리해보려고 합니다! 저도 공부하며 정리한 내용이라 많이 미숙할 수 있습니다 :) 주로 Point cloud를 활용한 3D Detection의 갈래에 대한 기본 개념이 정리되어 있습니다.
PointCloud의 Input 표현
우선 PointCloud는 LiDAR에서 생성되는 다음과 같은 데이터 형태를 뜻합니다. 이러한 데이터의 Input은 주로 다음과 같이 $x$, $y$, $z$, $r$의 4개의 요소로 정의됩니다. 여기서 $x$, $y$, $z$는 각 point들의 3차원 좌표를 뜻하고, $r$은 LiDAR의 반사세기를 뜻합니다.
이러한 point 좌표 ( $x$, $y$, $z$, $r$ )의 상대위치를 계산할 때는 주로 $x$, $y$, $z$의 무게중심 $v_x$, $v_y$, $v_z$을 계산하여 원래 좌표에서 빼주는 식으로 계산합니다. 따라서 주로 point의 원래 위치와 상대위치를 concat한 ( $x$, $y$, $z$, $r$, $v_x$, $v_y$, $v_z$ )을 인코더의 input으로 사용하기도 합니다. (VoxelNet, 2017)
Object Detection 갈래
Object Detection의 주요 갈래에는 주로 Single Stage Detector와 Two Stage Detector가 있습니다.
우선 Single Stage Detector는 말 그대로 localization과 classification을 동시에 처리하는 Detector로, 데이터 전체에서 feature를 뽑고 바로 bounding box prediction을 수행하는 매커니즘으로 작동합니다. 주로 YOLO와 SSD, PointPillar 등의 모델이 이에 속하며, Focal loss가 제안된 이후로 각광을 받고 있습니다.
여기서 Focal Loss는 Easy Example의 weight를 줄이고 Hard Negative Example에 대한 학습에 초점을 맞추는 Cross Entropy를 변형한 다음과 같은 loss를 뜻합니다.
반면 Two Stage Detector는 먼저 Object가 존재할 수 있는 Region을 뽑고, 그 region의 feature를 이용하여 regression과 classification을 수행하는 매커니즘으로 작동합니다. Localization과 Classification을 순차적으로 진행하는 방식이죠. 주로 RCNN이 이러한 계열에 속합니다.
Detection의 아이디어
PointCloud를 이용한 ObjectDetection은 Input으로는 point cloud 좌표가 들어가고, Output으로는 감지된 Object별 3d box가 추출됩니다. Feature representation을 받아 마지막에 추출되는 bounding box를 생성하는 부분은 주로 RPN(Region Proposal Network)으로 부르며, 말 그대로 box region을 proposal 하는 부분입니다. 아래 아키텍처에서 DenseHead 내에 있는 아키텍처가 이러한 부분에 속합니다.
이러한 RPN 에서는 feature를 input으로 받아 class score와 bounding box regression 결과를 산출합니다.
Anchor Box와 NMS
앞서 3D Object Detection의 목표는 물체가 존재할 3d bounding box를 생성하는 것이라고 명시했습니다. 이러한 bounding box의 후보를 Anchor Box (앵커박스)라고 부르며, 후보이기 때문에 여러개의 anchor box를 생성하고 각 앵커박스의 class와 offset을 예측합니다. 이러한 수많은 후보 앵커박스 중에서 가장 유사한 box를 최종 예측 bounding box로 반환하는 것이죠.
이러한 Bounding Box의 파라미터는 주로 7개로 정의되는데요, 이는 다음과 같습니다. 이러한 7개의 파라미터는 각각 regression을 통해 학습됩니다.
1. Center의 $x$, $y$, $z$ 좌표
2. Box의 길이, 폭, 높이 ($l$, $w$, $h$)
> 이는 주로 class에 따라 미리 정해집니다.
3. $z$축에 대한 회전 $\theta$ ( 0 ~ 2$\pi$ 의 범위)
> 하나의 anchor로는 이 범위를 전부 커버하기 어려우므로 각각 0, $\pi$/2의 $\theta$를 갖는 anchor를 각 위치마다
사용합니다.
그렇다면 가장 유사한 box의 기준은 무엇일까요? 바로 Ground Truth box와의 IoU(Intersection over Union)을 계산하는 것입니다. 당연히 GT와 많이 겹치면 가장 유사한 box라고 할 수 있겠죠? 따라서 IoU는 다음과 같이 단순히 교집합 영역의 넓이 / 합집합 영역의 넓이로 계산됩니다.
GT와 각 앵커박스의 IoU를 계산해, 이러한 IoU가 특정 threshold보다 크면 이를 positive anchor라고 하며 작으면 보통 negative anchor라고 명시합니다.
또한 이러한 수많은 앵커박스의 중복 제거를 위해 NMS (Non-Maximum-Suppression)을 사용하기도 합니다. Predict한 앵커 박스중에서 IoU가 일정 threshold 이상인 것들에 대해 중복으로 예측한 앵커박스를 제거하는 태크닉입니다. 아래 그림은 NMS 적용 전/후 차이를 나타낸 예시입니다.
Detection의 Loss function
3d Obejct Detection의 Loss는 주로 RPN의 output처럼 class loss와 regression loss로 구분됩니다. 이는 다음과 같습니다.
Class Loss
Loss를 계산하려면 보통 pred 값과 gt를 연결지어야 할 것입니다. 그리고 여기서 3d Object Detection에서의 pred 값은 주로 앞서 언급한 Anchor box의 7개의 파라미터를 뜻할 것입니다. 따라서 수많은 Bounding Box의 후보인 Anchor Box와 GT 사이의 IoU를 계산해 Positive와 Negative sample로 나눈 후, Positive anchor에 대한 score가 1에 가깝게 출력되고 Negative anchor에 대한 score는 0에 가깝게 출력되도록 학습합니다. 이러한 과정에서는 우리가 잘 아는 binary cross entropy를 사용합니다.
Regression Loss
앞선 Anchor의 소개에서 7개의 요소를 소개했습니다. 따라서 앞서 정의된 Positive Anchor에 대해서만 이러한 7개의 요소에 대해 Regression loss를 계산하도록 합니다.
이러한 두 Loss를 합쳐 보통 최종 loss로 정의하고, 모델에 따라 direction loss를 추가하기도 합니다.
지금까지 3D Object Detection에 대한 개괄을 정리해보았는데요, 상황에 맞게 내용을 추가하도록 하겠습니다. :)
References
[2] https://github.com/open-mmlab/OpenPCDet
[3] https://arxiv.org/abs/1711.06396