카테고리 없음

[논문 재구현] PointGroup: Dual-Set Point Grouping for 3D Instance Segmentation

K_nowing 2021. 9. 26. 01:37

  PointGroup은 2020 CVPR에 accept된 point cloud instance segmentation 논문이다. Pointcloud task의 전반적인 이해를 위해 instance segmentation 논문을 재구현해보았다.

 

[논문 정보]

 

[논문 리뷰] PointGroup: Dual-Set Point Grouping for 3D Instance Segmentation

PointGroup은 2020 CVPR에 accept된 point cloud instance segmentation 논문이다. PointGroup PointGroup은 보는 것과 같이 RGB indoor pointcloud data에서의 Instance segmentation task를 다룬다. point cloud..

knowing.tistory.com

[재구현 코드]

 

GitHub - K-nowing/PointGroup-PyTorch: PointGroup: Dual-Set Point Grouping for 3D Instance Segmentation (CVPR2020)

PointGroup: Dual-Set Point Grouping for 3D Instance Segmentation (CVPR2020) - GitHub - K-nowing/PointGroup-PyTorch: PointGroup: Dual-Set Point Grouping for 3D Instance Segmentation (CVPR2020)

github.com

 

 

재구현 과정

1. Backbone 선택

  기존 논문에서는 point feature를 구하는 과정에서 pointcloud를 단순히 voxelize 하여 3d U-Net을 사용하였다. 그 과정에서 cost를 줄이기 위해서 spaseconv를 사용하게 되는데, 재구현 환경이 구글 colab이다 보니 build 문제가 있었다. 그래서 다른 backbone을 써야하는 상황이었고, KPConv와 DGCNN을 후보로 두게 되었다.

  비교적 구현이 쉬운 DGCNN을 사용할까 후보에 뒀었는데, 일단 semantic segmentation 성능이 잘 나와야 instance segmentation도 잘 나오기 때문에 KPConv를 선택하게 되었다. KPConv를 선택하면서 여러 새로운 문제들이 발생하게되었다.

 

KPConv Input 형태 (오른쪽)

  기존 PointGroup은 voxelize를 거쳐 3d U-Net을 통과하기 때문에 좌측 그림 처럼 scene 전체가 input으로 들어가게 된다. 하지만 KPConv는 오른쪽과 같이 input이 구 형태이다. 이러한 input 모양의 차이로 여러 문제가 발생하게 되었고, 이를 해결한 과정을 순서대로 서술해보려고한다.

 

2. Clustering Part

 

  PointGroup은 instance 구분을 위해 offset shift branch를 학습한다. 하지만 구형태로 input이 들어가다 보니 한 batch에 잘린 instance들이 많이 포함되게 되고, instance center를 알맞게 prediction하는게 힘들게 된다. 최대한 정보 손실을 줄이면서 sampling radius를 높게 설정해주었고, 절대적인 instance center gt 값을 두지 않고, batch 별로 center gt를 계산하여(잘린 instance는 잘린 point들의 center를 사용) 학습에 사용해주었다.

offset shift 결과

  P(origin points)와 Q(shifted points)에서 clustering을 하여 ScoreNet에서 cluster score를 학습하게 되는데, 전체 scene이 아니라 scene의 일부만 넣게 되어 틀리는 cluster가 거의 없게 되었다. 자연스레 overfitting이 일어나 학습이 잘 안되었고, cluster score는 mAP를 구할때 confidence로 중요하게 사용되므로 해결책이 필요했다. 그래서 일부러 틀린 cluster를 넣어주는 augmentation을 넣어줘 보자 생각하게 되었고, random down sampling을 하거나 서로 다른 cluster들을 merge하는 방법을 채택하였다. 결과적으로 학습 개선이 되었다.

Cluster Augmentation

 

 

3. ScoreNet

  ScoreNet에 사용할 Backbone도 새로 선택해야했다. KPConv, DGCNN, PointNet 세가지가 후보였다.

  논문에서와 같이 point feature를 뽑은 Backbone과 같은 Backbone을 사용하려면 KPConv를 사용해야하는데, KPConv는 center point를 정하고 그 주위 point들로 kernel points를 계산하여 학습을 하므로 input이 유동적인 ScoreNet에는 사용할 수 없다고 판단하였다. ScoreNet은 이미 계산된 point feature들을 사용하므로 상대적으로 정밀한 network가 필요없다고 생각해 DGCNN과 PointNet을 후보에 두었다.

  ScoreNet은 이웃한 point들과의 관계 파악이 중요하다. PointNet의 경우에는 전체 points의 global feature를 뽑는 방식으로 작동하므로 DGCNN에 비해 이웃한 points들의 정보가 부족하게 되고 학습이 어려울 거라고 판단했고, 실험을 해보았을 때도 학습이 안되는 것을 확인하였다. 결론적으로 ScoreNet에는 DGCNN을 사용하게 되었다.

최종 ScoreNet 학습 과정

 

 

4. Inference 

 

postprocessing을 적용하지 않은 prediction

  input이 scene별로 구성되어있지 않아 instance 후처리 작업이 필요했다. 별다른 후처리없이 inference를 뽑게 되면 위의 결과처럼 instance가 잘 구분이 안되는 것을 볼 수 있다.

 

  Inference 과정에서 전체 scene을 한번에 처리하는 게 아니므로 batch별로 겹치는 부분을 처리를 해주어야한다. semantic segmentation일 경우 단순히 겹치는 부분을 voting 해주면 되는데, instance segmentation의 경우 같은 instance로 볼지 말지에 대한 기준이 필요했다.

batch 전체를 사용하지 않고 중앙에 있는 instance들만 사용

  1차적으로 confidence를 고려해서 batch의 boundary에 있는 instance는 제외하고 중앙에 있는 instance만 inference에 사용해주었다. 그래도 겹치는 부분들은 thresh hold를 결정해서 한개로 볼지 말지 결정해 주었다. instance confidence score의 경우 semantic prob * cluster score를 사용하였고, 이를 고려하여 한 point는 한 instance를 나타내도록 해주었다.

 

Results

semantic segmentation 결과
instance segmentation 결과

  논문에서 주장한 mAP와 0.015 차이나는 정도로 재구현을 마쳤다. mPrec나 mRec의 경우는 confidence threshold에 따라 다르게 되는데, 논문에서 사용한 confidence와 내가 사용한 confidence가 달라 같은 threshold를 사용하는 의미가 없어 많이 못미치는 결과가 나왔다(의미 없지만 일단 구해 보긴했다).

 

 

Reference

  1. KPConv-Pytorch
  2. dgcnn.pytorch
  3. visualizing with pptk