LCCNet (2021 CVPR)

LCCNet: LiDAR and Camera Self-Calibration using Cost Volume Network

하얼빈 공과대

Overview

Overview에 나온 것처럼 RGB와 LiDAR projection을 통한 Depth map을 이용해 Iterative한 방법으로 Calibration 한다.

Abstract

Multi-sensor fusion은 self-driving 및 robot navigation에서 3D reconstruction 및 perception을 향상한다. Sensor간 calibration은 효과적인 multi-sensor fusion을 위한 기저조건이다. 기존에는 LiDAR-camera간 calibration을 위해 수동적이고 힘들며 복잡한 calibration 환경이 요구되어왔다. 우리는 기존 CNN 기반과는 다른 online LiDAR-Camera Self-calibration Network (LCCNet)을 제안한다. LCCNet은 end-to-end로 training이 될 수 있으며 extrinsic parameter를 real-time으로 추정할 수 있다. LCCNet에서 우리는 RGB image feature들과 Depth image간 correlation을 나타내는 cost volume layer를 사용한다. 추정된 extrinsic parameter의 supervised signal인 smooth L1-loss 외에도 self-supervised signal인 point cloud distance loss가 training 단계에서 도입된다. Extrinsic parameter를 직접 regress하는 대신 decalibrated deviation을 ground truth와 initial calibration에서 추정한다 (decalibrated deviation이 뭐지). Calibration error는 iterative refinement와 inference stage에서 temporal filtering approach를 통해 감소한다. 각 iteration에서 단일 GPU에서 24ms의 시간이 소요된다. LCCNet은 KITTI에서 miscalibration이 최대 \(\pm\) 1.5m 와 \(\pm\) 20°인 상황에서 평균 0.297m와 0.017°의 에러를 나타내 SOTA CNN 기반 알고리즘보다 더 나은 결과를 보인다. 코드

Introduction

지난 몇년간 autonomous driving 기술은 급속도로 발전해왔다. Autonomous driving 환경은 복잡하고 매우 동적이기에 센서 하나로는 모든 시나리오에서 안정된 perception을 제공할 수 없다. LiDAR-camera fusion은 주변 환경에 대해 안정되고 정확한 perception 및 3D reconstruction 결과를 가질 수 있게 한다. 이는 정밀한 extrinsic calibration에 근간을 두고 있다. LiDAR point cloud와 camera image는 heterogeneous 이종의 데이터이다. Point cloud는 sparse 3D data인 반변 image는 dense 2D data이기에 정밀한 calibration을 통한 2D-3D matching이 요구된다.

기존 체커보드와 같은 인공적인 마커를 이용한 calibration 기법은 노동력 및 시간이 소요되고 offline 방식으로 진행돼 self-driving car production에 적합하지 않다. Vehicle operation 중 sensor간 calibration이 틀어져 re-calibration이 요구된다. 최근 몇몇 연구들은 targetless 환경에서 fully autonomous calibration에 집중한다. 하지만 대부분의 self-calibration 기법들은 특정 환경이 요구되며 offline-calibration에 비해 정확도가 높지 않다. 몇몇 연구자들은 DL을 적용하여 6자유도 rigid body transformation을 추정하였다. 이러한 방법들은 image와 point cloud의 feature간 correlation을 고려하지 않고 바로 융합하는 방식으로 진행된다. 이 논문은 RGB camera-LiDAR calibration의 새로운 기법을 소개한다:

  • LCCNet은 novel end-to-end learning network임. 네트워크는 세가지로 나뉨: feature extraction network, feature matching layer, and global feature aggregation network. Quaternion이 training시 GT로 사용되었으며, GT와 calibration간 smooth L1-Loss 외에도 point cloud distance loss도 적용되었다.
  • Feature matching layer는 RGB와 depth map의 matching cost를 저장하는 const volume를 생성한다. LiDAR-camera elf-calibration에서 최초로 이종 센서의 feature간 correlation을 고려하였다.
  • Calibration accuracy를 높이기 위해 iterative refinement와 multiple frames analysis가 적용되었다. LCCNet은 다른 SOTA보다 최고의 accuracy-speed trade-off를 가지고 있다.

LiDAR와 camera간 calibration은 2D-3D registration problem으로 분류될 수 있다. Calibration은 세종류로 나뉜다.

  1. Target-based methods
    1. 기존 calibration board를 사용한 기법들: 구멍을 뚫어서 하기도 했었구나
    2. Spherical target이 빠르고 정확한 calibration에 용이하다고 한다.
  2. Target-less methods
    1. Target 없이 Correspondence 또는 gradient direction으로 하는 기법들
  3. Learning-based methods
    1. RegNet은 CNN을 통해 6자유도 extrinsic parameter를 찾는다.
    2. CalibNet은 geometrically supervised deep network를 통해 실시간으로 6자유도 모션을 추정한다. End-to-end training은 geometric, photometric consistency를 최대화 한다.
    3. RGGNet은 Rimmaninan geometry와 deep generative model을 통해 tolerance-aware loss function을 생성한다.
    4. SOIC은 이를 Semantic centroid의 PNP문제로 해석하였다.
    5. Zhu et al은 extrinsic calibration을 semantic feature를 통한 optimization problem으로 해석하였다. 뭔소리지

Method

Method

CNN을 사용한 LiDAR-camera간 6자유도 extrinsic calibration

Input Processing

Initial extrinsic \(T_{init}\)과 camera intrinsic \(K\)를 통해 Depth image를 생성한다. 여기서 Z-buffer (depth buffer?) 기법을 이용해 보이지 않은 depth 값들은 쳐내는듯.

Network Architecture

네트워크는 feature extraction network, matching layer, global aggregation으로 나뉘는데, 각 parameter가 differentiable하기에 end-to-end가 가능하다.

  1. Feature Extraction Network Feature extraction network은 RGB image와 depth image feature extraction을 위한 두개의 symmetric branch를 가지고 있다:
    • RGB Branch: pre-trained ResNet-18 without FCN
    • Depth branch: RGB랑 같으나 RELU에서 Leaky RELU를 activation function으로 사용 (이유 안나옴)
  2. Feature Matching Layer RGB feature map \(x_{rgb}\)와 depth feature map \(x_{lidar}\)간 matching cost를 계산하기 위해 feature matching layer가 적용됨. PWC-Net에서 영감을 받아 correlation layer를 사용해 feature matching함. cost volume을 \(x_{rgb}\)와 \(x_{lidar}\)의 correlation으로 만듦: \(cv(p_1, p_2) = \frac{1}{N}(c(x_{rgb}(p_1)))^\top c(x_{lidar}(p_2))\) 여기서 \(c(x)\)는 feature map \(x\)의 flatten vector이며 \(N\)은 column vector \(c(x)\)의 길이임. 피쳐들에 대한 cost volume은 limited range of d pixel에서 이루어져야함 (왜인지는 안나옴) i.e., \(\vert p_1 - p_2 \vert _{\infty} \leq d\)

    Input feature map이 굉장히 작기 때문에 (Original image의 1/32) d=2로 설정됨. (결국 initial calibration이 잘 되어있어야 되는거 아님?) 3D cost volume의 dimension은 \(d^2 \times H \times W\)이며, \(H\)와 \(W\)는 feature map \(x_{rgb}\)와 \(x_{lidar}\)의 height와 width임.

  3. Feature Global Aggregation LCCNet은 6자유도 rigid body transformation을 cost volume feature를 통해 regress한다. 이 네트워크는 512 neuron을 가진 FCN과 두개의 roatation과 translation을 대표하는 stacked FCN branch로 이루어졌다. 네트워크 output은 \(1\times 3\) tranlation vector와 \(1 \times 4\) quaternion이다.

Loss Function

RGB 이미지와 Depth image에 대해 두가지 loss를 사용한다: regression loss \(L_{T}\), point cloud distance loss \(L_{P}\) \(L = \lambda_T L_T + \lambda_P L_P\)

  1. Regreassion Loss Translation vector에 대해 smmoth L1 loss가 적용됨. L1 loss의 미분은 0에서 unique하지 않은 반면 smooth L1 loss는 제곱을 통해 near zero에서 더 부드럽다. 회전에 대한 loss에 대해 quaternion은 기본적으로 방향 정보이므로 Euclidean distance은 두개의 quaternion에 대해 정확히 설명할 수 없다. 따라서 angular distance를 이용해 두 quaternion의 차이를 설명하였다: \(L_R = D_a (q_{gt}, q_{pred})\) \(D_a\)는 angular distance이다.

    전체 regression loss는 다음과 같다: \(L_T = \lambda_t L_t + \lambda_q L_q\)

  2. Point Cloud Distance Loss Point cloud distance constrain도 추가되었다. LiDAR point cloud들 (\(P = \{ P_1, P_2, \dots, P_N \}\))에 대해 loss \(L_P\)는 다음과 같이 정의한다. \(L_P = \frac{1}{N} \sum_{i=1}^{N} \lVert T_{LC}^{-1} \cdot T_{pred}^{-1} \cdot T_{init} \cdot P_i - P_i\rVert_2\)

    이부분이 이해가 안되늗데, 찬찬히 봐보자.

         for i in range(len(point_clouds)):
             point_cloud_gt = point_clouds[i].to(transl_err.device)
             point_cloud_out = point_clouds[i].clone()
    
             R_target = quat2mat(target_rot[i])
             T_target = tvector2mat(target_transl[i])
             RT_target = torch.mm(T_target, R_target)
    
             R_predicted = quat2mat(rot_err[i])
             T_predicted = tvector2mat(transl_err[i])
             RT_predicted = torch.mm(T_predicted, R_predicted)
    
             RT_total = torch.mm(RT_target.inverse(), RT_predicted)
    
             point_cloud_out = rotate_forward(point_cloud_out, RT_total)
    
             error = (point_cloud_out - point_cloud_gt).norm(dim=0)
             error.clamp(100.)
             total_loss += error.mean()
    

    코드에서 나오는 point_cloud_out이 \(T_{LC}^{-1} \cdot T_{pred}^{-1} \cdot T_{init} \cdot P_i\)라는 건데, 이걸 point_cloud_gt랑 빼는 것을 보니.. 그냥 카메라 coordinate에서 바라본 point cloud의 prediction - gt인가? 오타인듯? 모르겠다.

Calibration Inference and Refinement

Extrinsic parameter는 다음과 같다: \(\hat{T}_{LC} = T_{pred}^{-1}\cdot T_{init}\)

여기서 다양한 range에 대해 다양한 network을 training시킨다.

1.5m, 1.0m, 0.5, 0.2m, 0.1m, 그리고 20°, 10°, 5°, 2°, 1°까지 range를 만들고, 나중의 작은 range는 maximum mean absolute error (MAE)를 통해 결정했다고 한다 (결과에 따라 정밀한 calibration을 위한 training인듯).

여튼 1.5m, 20°로 train된 network를 시작으로 다음 range, 다음 range로 다시 넣어 최종 extrinsic calibration은 다음과 같다: \(\hat{T}_{LC} = (T_0 \cdot T_1 \dots T_5)^{-1}\cdot T_{init}\)

Experiments and Discussion

Data Preparation

KITTI odometry data를 이용했음. LiDAR와 left color camera 사용 01~20까지 train & validation, 00을 testset. 200프래임 제외 모두 spatially independent함. Random deviation을 추가해서 data 추가: \(T_{init} = \Delta T \cdot T_{LC}\)

Evaluation Metrics

Translation: L2 norm 사용

Rotation: Quaternion angle distance 사용

Traiing Details

Adam Optimizer with initial learning rate of \(3e^{-4}\). Two Nvidia GP100 GPU with batch size 120 and total epochs 120. Large-range model이 pre-trained model로 사용됨. largest는 120, 작은 것들은 50으로 epoch가 설정됨.

Results and Discussion

Result1

작은 네트워크로 진행될 수록 작아지는 것을 볼 수 있음.

Result2

Random initial parameter에 대해 calibration이 잘 됨을 알 수 있음.

Conclusion


© 2020. All rights reserved.

Powered by Hydejack v9.0.5