[Reconstruction] hydra code - src/reconstruction/semantic_integrator.cpp

About_work·2024년 10월 14일
0

lifelong scene graph

목록 보기
7/56
  • isValidLabelupdateLikelihoods 메서드 가 중요

1. 과거 로그

src/reconstruction/projective_integrator.cpp에서의 semantic 부분

2. 코드의 세멘틱 통합 부분

A. computeLabel 함수

  • 먼저 세멘틱 라벨이 어떻게 처리되는지 살펴볼 수 있습니다.
  • TSDF 업데이트 시, 해당 복셀이 표면 근처에 있을 때만 세멘틱 라벨을 통합하는데, 그 과정이 computeLabel 함수에서 처리됩니다.
bool ProjectiveIntegrator::computeLabel(const InputData& data,
                                        const float truncation_distance,
                                        VoxelMeasurement& measurement) const {
  const bool is_surface = measurement.sdf < truncation_distance;
  if (data.label_image.empty() || !semantic_integrator_ || !is_surface) {
    return true;
  }
  measurement.label =
      interpolator_->interpolateID(data.label_image, measurement.interpolation_weights);
  return semantic_integrator_->canIntegrate(measurement.label);
}
세부 사항:
  1. is_surface: 현재 볼셀이 표면 근처에 있는지 확인하는 조건입니다. 표면 근처에 있지 않은 경우 세멘틱 정보를 통합하지 않습니다.

  2. data.label_image: RGB 이미지에 대한 세멘틱 분할 결과가 label_image로 주어집니다. 이 이미지에서 픽셀별로 레이블이 할당됩니다 (예: 건물, 나무, 사람 등).

  3. interpolator_->interpolateID:

  • 이 함수는 2D 세멘틱 이미지에서 볼셀의 3D 위치에 해당하는 픽셀의 세멘틱 라벨을 가져옵니다.
  • 이때 3D 복셀 위치를 2D 이미지 상의 위치로 투영하여 해당 픽셀의 레이블을 얻습니다.
  1. semantic_integrator_->canIntegrate(measurement.label):
  • 얻은 세멘틱 레이블이 통합 가능한지 확인합니다.
  • 예를 들어, 동적 객체(사람, 차량 등)의 경우 정적 환경을 대상으로 하는 TSDF 통합에서 제외할 수 있습니다.

B. updateVoxel 함수

  • 세멘틱 정보를 기반으로 TSDF를 업데이트하는 부분은 updateVoxel 함수에 있습니다.
  • TSDF에 세멘틱 정보 또한 같이 통합됩니다.
void ProjectiveIntegrator::updateVoxel(const InputData& data,
                                       const VoxelMeasurement& measurement,
                                       const float truncation_distance,
                                       VoxelTuple& voxels) const {
  // ...

  // Only merge other quantities near the surface
  if (measurement.sdf >= truncation_distance) {
    return;
  }

  // 세멘틱 정보 통합
  if (!semantic_integrator_ || !voxels.semantic) {
    return;
  }

  if (semantic_integrator_->isValidLabel(measurement.label)) {
    semantic_integrator_->updateLikelihoods(measurement.label, *voxels.semantic);
  }
}
세부 사항:
  1. semantic_integrator_->updateLikelihoods:
  • 세멘틱 정보가 유효한 경우, 현재 복셀의 세멘틱 라벨을 업데이트합니다.
  • 이를 통해 각 볼셀이 어떤 객체에 해당하는지 확률을 누적하게 됩니다.

3. src/reconstruction/semantic_integrator.cpp

isValidLabel()

  • 세멘틱 레이블을 통합하기 전에, 해당 레이블이 유효한지 판단하는 과정도 중요합니다.
  • 여기서 isValidLabel() 함수는 레이블이 유효한지 확인하고, canIntegrate() 함수는 해당 레이블이 동적(dynamic) 레이블이나 무효한(invalid) 레이블인지 여부를 확인합니다.

updateLikelihoods()

  • 세멘틱 라벨을 통합하는 부분은 MLESemanticIntegrator 클래스에서 이루어집니다. 특히, updateLikelihoods 함수가 세멘틱 통합의 핵심입니다.
void MLESemanticIntegrator::updateLikelihoods(uint32_t label,
                                              SemanticVoxel& voxel) const {
  if (voxel.empty) {
    voxel.empty = false;
    voxel.semantic_likelihoods.setConstant(total_labels_, init_likelihood_);
  }
  voxel.semantic_likelihoods += observation_likelihoods_.col(label);
  voxel.semantic_likelihoods.maxCoeff(&voxel.semantic_label);
}
  • 이 함수는 voxel의 세멘틱 우도를 업데이트하는 기능을 합니다.
  • 매번 새로운 세멘틱 레이블이 들어오면, 해당 레이블이 voxel에 맞는지를 확인하고, 해당 레이블의 우도를 추가합니다.
  • TODO: 왜 이렇게 하는지는 모르겠음
  1. 우도 업데이트:
  • 이후 입력되는 세멘틱 레이블에 대해 우도 행렬(observation_likelihoods_)의 값을 더해줍니다.
  • observation_likelihoods_은 각 레이블에 대한 일치 확률불일치 확률을 포함하고 있으며,
  • 다이어고날(diagonal)은 해당 레이블이 맞을 확률(일치), 나머지는 불일치 확률을 갖습니다.
    • 이 과정은 voxel.semantic_likelihoods 벡터에 추가적인 정보를 계속해서 더하는 방식
    • 즉, 해당 voxel에 여러 레이블이 들어올 때마다 그 레이블이 해당 voxel에 맞는지를 우도로 표현하고, 가장 높은 우도를 가진 레이블이 최종적으로 할당됩니다.
  1. 최대 우도 추정(MLE):
  • voxel.semantic_likelihoods.maxCoeff(&voxel.semantic_label)는 가장 큰 우도 값을 갖는 레이블을 찾아 voxel.semantic_label에 저장
  • 즉, 가장 가능성이 높은 레이블이 최종적으로 해당 voxel의 세멘틱 레이블로 할당됩니다.
  • 이를 통해 해당 voxel에 가장 적합한 세멘틱 레이블이 최종적으로 결정됩니다.

세부 사항:

  1. voxel.semantic_likelihoods 초기화:
  • 복셀이 처음 세멘틱 정보를 받으면, 모든 라벨에 대해 초기 우도를 설정
  • setConstant 함수를 통해 모든 라벨의 초기 확률을 균일하게 설정
  • init_likelihood_ = log(1 / total_labels_)
  1. 우도 업데이트:
  • 새로운 세멘틱 라벨 정보가 들어올 때마다, 현재 복셀의 semantic_likelihoods에 해당 레이블의 우도를 더해줍니다.
  • 이 우도 정보는 observation_likelihoods_ 행렬의 해당 라벨에 해당하는 값을 더해주는 방식으로 업데이트됩니다.
  1. 최대 우도 추정: 각 라벨에 대한 우도가 모두 계산되면, maxCoeff 함수를 사용하여 가장 높은 우도를 가진 라벨을 해당 볼셀의 최종 세멘틱 라벨로 결정합니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글