안녕하세요 ! 다섯번째 x-review 역시 3D Object Detection에 대한 논문을 읽어보았습니다. 일명 VoteNet이라 부르는 논문인데요, 바로 리뷰 시작하겠습니다.
1. Introduction
3D point cloud는 2D 이미지와 비교하여 기하학적인 정보를 가지며 조도 변화에 강인하다는 특징을 가지고 있지만 irregular한 특성을 가지고 있어 일반적인 CNN에서 처리하기에 적합하지 않은 구조로 되어 있습니다. 당시에 point cloud를 3D voxel grid로 바꾸어 처리함으로써 이를 해결하려 했지만 여전히 sparsity를 완전히 극복하지는 못하였고 3D convolution을 사용하면서 높은 계산 비용이 발생하였습니다. 그래서 다른 방식으로 point를 2D bird eye view로 변환하여 2D detector를 적용하고자 하였지만, 3D point cloud를 2D로 변환시키는 과정에서 point의 기하학적인 사항들을 잃어버리게 되고 이는 특히 indoor 환경에서 매우 치명적인 단점으로 적용하게 됩니다.
그래서 본 논문에서는 raw data인 point cloud를 직접적으로 처리하며 2D detector에 의존하지 않는 새로운 방법론인 VoteNet을 제안합니다. 먼저 VoteNet에서는 backbone으로 PointNet++을 사용함으로써 point cloud를 input data로 사용하기 위해 regular한 형태로 만들어야 한다는 문제는 어느정도 완화할 수 있었으나, 문제는 PointNet++은 object classification이나 segmentation에서는 유의미한 결과를 보여주었으나 3D Object Detection에 대한 연구는 거의 없었다고 합니다. 또한 detection을 위해 3D bounding box를 만들기 위해서는 센서로부터 얻은 point를 바탕으로 box를 만들어야 하는데, 여기서 또 한번 point cloud의 sparse함이 문제로 여겨지게 됩니다. 이미지에서는 object의 중심이 있을 때, 중심 근처가 모두 픽셀로 이루어져 있죠. 하지만 point cloud의 경우 depth 센서가 object의 표면만을 감지하기 때문에 정작 3D적으로 정말 object의 중심인 부분은 모든 감지된 포인트에서 멀리 떨어진 빈 공간이 될 수 있는 것 입니다. 때문에 물체의 중심 주변의 context를 얻는 것이 어려워지고 이는 단순히 receptieve field를 크게 늘린다고 해서 해결되는 것이 아닌게, receptieve field를 늘림으로써 오히려 인접해있는 다른 object의 cloud와 같이, detection 해야하는 객체와 상관없는 부분까지 포함될 수 있기 때문입니다.
그래서 논문에서는 Hough voting 방식을 차용하여 object의 center에 가깝다고 할 수 있는 포인트를 새롭게 만들어 3D Bounding box를 만들 수 있게 하고자 하였습니다. 물론 전통적인 Hough voting 방식은 여러개의 모듈로 이루어져 있기 때문에 end-to-end 방식에 최적화되도록 수정하였는데, 이는 아래에서 더 자세하게 다루도록 하겠습니다. 저자는 해당 방법론으로 3D Object detection dataset인 SUN RGB-D와 ScanNet 두 가지 데이터셋에서 실험을 진행하여 당시 SOTA를 달성하였다고 합니다. 실험 결과를 통해 voting 방식이 object의 surface에서 centroid가 멀 때 효과적으로 context한 정보를 모아 detection할 수 있음을 증명하였다고 하네요. 결국 논문의 main contribution은 다음과 같습니다.
- Hough voting 방식을 사용한 end-to-end deep learning 구조
- SUN RGB-D와 ScanNet 데이터셋에서의 SOTA 달성
- point cloud를 사용하는 3D Object detection에서 voting 방식의 중요성에 대한 분석
2. Related Work
Hough voting for object detection
image에서 Hougth transform이란 영상 (x, y) 좌표에서 (r, \theta) 매개변수 공간으로 mapping한 다음, voting 과정을 통해서 교점을 찾아 직선을 찾는 방법 입니다. 교점을 찾는 이유라함은 (x, y) 좌표 공간에서 같은 직선 위에 위치하는 픽셀의 경우 (r, \theta) 매개변수 공간에서 교점을 가지기 때문 입니다.
related work에서는 hough voting이 2D detection을 비롯한 여러 task에서 여러 기술들과 합쳐서 적용되 있음을 이야기하면서 3D Object Detection에서는 2D pipeline을 따라가는 방법론에 한해서 hough voting을 사용하고 있다고 말하고 있습니다. 2D detector를 적용하지 않으면서 voting 기법을 사용하는 저자의 방법론을 강조하려 했음이 아닐까 싶습니다.
3. Deep Hough Voting
VoteNet에서의 voting 방식을 알아보기에 앞서, 우선 전통적인 2D Detector에서의 Hough voting 과정을 살펴보겠습니다.
2D Detector에서 voting 과정이라함은 우선 GT box가 그려진 이미지 collection이 주어지면 이미지 patch와 각 object의 center에 해당하는 offset을 매핑해놓은 정보가 담긴 codebook을 생성합니다. 그러면 inference에서 image 안에서 interest point라는 것이 선택되고 interest point를 기준으로 patch를 추출하게 됩니다. 추출한 patch를 이제 object의 center의 위치를 찾고 vote를 만들기 위해서 생성한 codebook 안의 매핑 정보들과 비교하게 되는 것 입니다. 이 cluster을 통해서 object boundary, 즉 bounding box가 만들어지게 됩니다.
그러나 VoteNet은 end-to-end network를 구축하기 위해서 hand crafted feature로 선택했던 Interest points를 deep neural network을 사용하여 선택하였고, codebook을 만들어 매핑 정보와 patch를 비교하여 voting 하던 방식 대신 network를 통해 학습하였고 더불어 더 큰 receptieve field를 사용하여 모호한 voting 결과를 줄이고자 하였습니다. 또한 vote location을 feature vector로 활용하여 aggregation 해주고 그 결과를 통해 최종적으로 3D bounding box를 만들 수 있게 되는 것 입니다.
4. VoteNet Architecture
이제부터 본격적으로 VoteNet의 구조를 전체적으로 살펴볼건데, 해당 구조는 크게 두 부분으로 이루어져 있습니다. 존재하는 point들을 통해서 vote를 만드는 과정과, 만들어진 virtual point를 통해서 3D bounding box를 만들고 classify하는 과정으로 나누어집니다.
4.1. Learning to Vote in Point Clouds
input으로 point cloud가 N \times 3 ( N개의 포인트에 대한 3D 좌표) 사이즈로 들어온다고 가정했을 때, M개의 vote를 생성하게 됩니다. 각각의 vote는 원래 point의 3차원 좌표와 feature vectore을 가지게 됩니다. 해당 과정을 2단계로 나누어 보도록 하겠습니다.
Point cloud feature learning
위에서 언급하였듯이 hand crafted feature가 아니라 딥러닝 네트워크를 사용하여 feature learning을 할 것인데, 본 논문에서는 backbone으로 PointNet++을 사용한 것 입니다. PiontNet++이 point cloud를 input data로 사용하는 네트워크 중 여러 task에서 유의미한 성능을 보장한 바가 있기 때문에 사용한 것이라고 저자는 이야기하고 있습니다. backbone network를 지나고 나면 XYZ 좌표와 C차원의 feature vector M개를 output으로 가지게 됩니다. 즉, (3 + C) 차원의 seed point M개를 가지고 각 시드 당 하나의 vote를 생성할 수 있습니다.
Hough voting with deep networks
각 시드 당 vote를 생성할 때 원래 codebook을 통해서 voting을 하던 방식이 아닌 deep network 기반의 voting module을 기반으로 vote를 생성하기 때문에 더 효율적이고 정확한 voting을 할 수 있습니다.
만약 M개의 seed point 집합을 \{s_i\}^M_{i = 1} 라고 표현한다면 각 seed point s_i는 s_i = [x_i;f_i]가 될 수 있습니다. 여기서 x_i는 3차원 좌표로 x_i \in \mathbb{R}^3이 될 것이고, f_i는 feature vector로 f_i \in \mathbb{R}^C가 되겠죠. voting module은 각 seed point당 하나의 vote를 만드는데, 여기서 voting module은 FC Layer, ReLU, 그리고 BN으로 구성된 MLP Network 입니다.
이 MLP는 output으로 유클리디언 space offset \vartriangle{x_i} \in \mathbb{R}^3과 feature offset \vartriangle{f_i} \in \mathbb{R}^C을 가지고 vote인 v_i = [y_i ; g_i]을 가지게 됩니다. 여기서 y_i는 y_i = x_i + \vartriangle{x_i}이고, g_i = f_i + \vartriangle{f_i}가 되겠죠.
\vartriangle{x_i}는 식(1)과 같이 regression loss로 사용되는데, \vartriangle{x_i}*는 본래 x_i와 x_i가 속한 object의 GT Box의 중심까지의 offset을 나타냅니다. \mathbb{1}[s_i on object]는 해당 seed point가 object의 surface에 속하는지 여부를 판단하는 것이고, M_{pos}는 obejct의 surface에 속하는 모든 seed의 수를 의미합니다. 예측 offset과 GT offset의 값의 차이를 최소화하는 방향으로 Loss를 줄이면서 GT box의 center 값에 가까워지는 새로운 point가 구성됩니다.
이렇게 vote를 생성하면 더 이상 vote point는 object surface 위의 point가 아니게 되며 같은 object surface 위에 존재하던 seed point들끼리 가까워지는 방향으로 생성되기 때문에 object의 다른 부분들을 채워넣는 것을 쉬워지게 만듭니다.
4.2. Object Proposal and Classification from Votes
vote point를 만들었으면, object proposal과 classify 하기 위해서 이러한 vote들을 clustering 하게 됩니다.
Vote clustering through sampling and grouping
본 논문에서는 sampling과 grouping할 때 간단하게 공간의 인접성을 고려하여 진행하였다고 합니다. 우선 vote point set v_i를 y_i를 기준으로 farthest point sampling(FPS)를 사용해서 K개의 point v_{ik}로 sampling 합니다. sampling point는 각 v_{ik}와 인접한 이웃 vote들을 찾아서 K개의 cluster을 만들게 됩니다. 여기까지의 과정이 Figure 2.에서 보았을 때 seed point를 만들고 그 point들 중 vote point들을 뽑아서 노란색으로 표시되어 있는 Vote clusters까지 마친 것 입니다.
Proposal and classification from vote clusters
cluster까지 마쳤다면, 이제 object proposal과 classification 과정을 진행하면 됩니다. vote cluster C = \{w_i\}가 주어지면 각 cluster는 w_i = [z_i ; h_i]로 나타내며 z_i는 vote location으로 z_i \in \mathbb{R}^3이고 h_i는 vote feature로 h_i \in \mathbb{R}^C가 됩니다. vote location인 z_i는 z'_i = (z_i - z_j)/r처럼 중심값을 이용해서 정규화해줌으로써 local 좌표계로 변환시킵니다. local k개의 cluster에 대한 object proposal은 각각 식(2)에서 보이는 MLP_1을 태우고 난 후 max pooling을 통해 하나의 feature vectore로 만들어집니다. 그 다음 MLP_2를 통과하며 object score, bounding box parameter, semantic classification score을 예측하게 됩니다.
Loss function
우선 object scoreness라 함은 vote의 중심이 GT와의 차이가 0.3 meter 이내라면 positive, 만약 0.6m 이상으로 멀다면 negative로 분류하는데, positive도 negative도 아닌 경우의 수로 정규화한 cross entropy loss를 사용합니다. positive proposal에 한해서 bounding box estimation과 classification score을 예측하게 됩니다.
5. Experiments
5.1. Comparing with State-of-the-art Methods
indoor dataset인 SUN RGB-D dataset과 ScanNet으로 실험한 결과 입니다. SUN RGB-D와 ScanNet에서 모두 이전의 방법론 대비 우수한 성능을 보임을 알 수 있습니다. 특히나 저자는 VoteNet이 geometric한 input, 즉 point cloud만 사용하였음에도 point cloud + RGB를 사용한 이전의 방법론보다 좋은 결과를 보임을 강조하였습니다.
5.2. Ablation Study
Ablation Study에서는 voting을 하는 것이 얼마나 중요한 것인지를 입증하려 했습니다.
voting 여부를 확인하기 위해서 BoxNet이라는 voting을 하지 않은 baseline을 구축하여 실험하였다고 합니다. BoxNet에서의 bound box는 seed point가 구해지고 voting 되지 않은 object surface 위의 point들로 구해진 box라고 할 수 있습니다. Table 3.의 결과를 보면 두 dataset에서 모두 voting을 적용한 VoteNet이 높은 성능을 보임을 알 수 있습니다.
실제 ScanNet scene에서 BoxNet과 VoteNet에 bbox proposal에 사용된 point들을 시각화한 것인데, VoteNet에서 한 객체 당 더 넓은 범위에 seed point가 존재하며 box를 만들 때 필요한 context를 증가시켜줍니다.
다음 Figure 4.는 SUN RGB-D dataset에서 각 class의 surface와 ceneter가 얼마나 멀리 떨어져 있는가에 따라 voting의 효과가 달라지는지를 보여주고 있습니다. 빨간색 점이 각 class마다 object와 center 사이의 거리이고 파란색 점이 VoteNet에서 voting을 한 후 성능 입니다. 전반적으로 center가 surface에서 멀리 위치해있을수록 voting 후의 결과가 좋아지고 있음을 그래프를 통해 알 수 있습니다.
좋은 리뷰 감사합니다.
‘point의 기하학적인 사항들을 잃어버리게 되고 이는 특히 indoor 환경에서 매우 치명적인 단점’으로 작용한다고 하셨는데, outdoor보다 indoor에서 더 치명적인 이유가 무엇인지 설명해주실 수 있나요??
또한, seed는 입력으로 들어온 point cloud로부터 생성된 keypoint로 이해하면 되나요? 혹은 샘플링된 point인가요??
마지막으로, loss function에서 GT와 차이가 0.3m 이하일 경우 positive, 0.6 이상일 경우 negative로 분류하고, 그 사이의 값 3가지 경우로 나누어 cross entropy loss를 이용하는 것인가요?? 즉, total loss는 GT와 차이를 기준으로 3가지 경우에 대한 cross entropy loss와 positive일 경우의 box에 대한 regression 오차, positive일 경우 class에 대한 cross entroyp loss로 구성되는것인가요??
안녕하세요 ! 댓글 감사합니다.
첫번째 질문은 제 생각에는 indoor 환경에서 서랍 위의 화분이라던가 수직적으로 겹쳐져 있는 object들이 있는 scene이 많기 때문에 bird eye view로 변환하였을 때 치명적이지 않을까 .. 생각합니다.
두번째 질문은 input으로 들어온 point cloud에서 M개로 샘플링된 point 입니다 !
마지막으로는 objectness score에 대한 loss function은 batch 내에서 positive와 negative 둘 다에 해당하지 않는 object proposal의 개수로 나누어 normalization 시킨 cross entropy loss를 이용하는 것 입니다. 사용하는 loss를 식으로 표현해주진 않았는데 설명으로 보아, vote regression loss와 object score, box, sementic classification loss, 총 4개로 이루어진 것으로 보입니다.
안녕하세요, 손건화 연구원님, 좋은 리뷰 감사합니다.
해당 task는 3d의 pointcloud data의 sparsity로 인해 object의 중심을 찾기 위해 hough voting을 이용하는 것으로 이해했습니다. 그럼 3d hough voting을 이용하는것이 맞나요?
2d 이미지에서 hough transform이 (x,y) 직각좌표계에서 (r,θ) 극좌표계로 mapping한다음 voting을 통하여 교점을 찾아 직선을 구한다고 하셨는데, 그럼 3D에서의 hough transform도 있는건가요? 그럼 (x,y,z)의 직각좌표계에서 (r, θ, φ)의 구면좌표계로 변환하고 교점을 찾아 평면을 구하는것에 해당하는 걸까요 ..?
안녕하세요 ! 댓글 감사합니다.
음 제가 hough transform에 대해 깊게 공부한 것은 아니라 .. 잘 모르지만 3D hough transform이 있는 것으로 알고 있습니다. 3차원 공간 좌표계를 기반으로 다른 매개변수 좌표계로의 변환을 하는 것이니 재연님이 말씀하신 것이 맞는 것 같다는 생각이 듭니다 !
좋은 리뷰 감사합니다.
몇 가지 질문 남기고 가도록 할게요!
1. Deep Hough Voting은 hough 공간으로 변환하지도 않는데 왜 hough voting이라는 명칭을 사용하는 것일까요?
2. Proposal and classification from vote clusters에서 z_j은 무엇일까요? 그리고 r은 어떻게 구하는 것일까요?
3. feature offset은 왜 정의했을까요?
안녕하세요 ! 댓글 감사합니다.
1. 여기서 사용하는 deep hough voting은 tranditional hough voting 2D detector라는 논문의 voting 기법을 따라가지만, end-to-end network를 구축하기 위해서 여러 구조를 변형시켜주었는데요 그런 의미에서 hough voting이라는 워딩을 유지한 것이 아닐까요 .. ? 다른 이유가 있다면 알려주시면 감사하겠습니다 ㅎ ㅎ ..
2. z_j는 한 개의 cluster의 중심값에 대한 좌표를 의미합니다 ! 그리고 r이라는 것은 k개의 중심점에서 주변점을 구하기 위해 정의된 반경을 의미하는데요, 이는 하이퍼파라미터로 사전 정의 가능합니다.
3. feature offset은 저도 사실 생각해보았던 부분인데요 .. 어쨌든 center에 가까운 vote point라는 것은 만드는 이유 자체가 center에 인접한 context한 정보를 사용하기 위함이니 그에 맞는 feature가 새롭게 필요하기 때문이 아닐까요 .. ?
안녕하세요. 최종적으로 3D box를 내보내야하는데, 모델 그림을 보면 클러스터 단위로 수행되는데…. 3D NMS가 포인트 클라우드 수준에서 사용되는지 박스 단위로 수행되는지 궁금합니다.
안녕하세요 ! 댓글 감사합니다.
3D NMS는 박스 단위로 수행되는 것이 맞습니당