자율주행 3D 탐지에서의 다중 센서 융합, TransFusion의 핵심 설계 원리
자율주행 시스템의 인지 파이프라인에서 정밀한 3D 객체 탐지는 필수 요소다. LiDAR는 정확한 거리 정보를 제공하지만 점군 데이터가 희소하고 해상도가 낮은 한계가 있으며, 반면 카메라는 풍부한 질감과 색상 정보를 제공하지만 깊이 추정에 어려움을 겪는다. 두 센서를 효과적으로 융합하면 각각의 단점을 보완할 수 있다.
기존 융합 방법들은 주로 점-픽셀 매칭 또는 ROI 기반 특징 병합에 의존했다. 그러나 이러한 하드 어쏘시에이션(hard association) 전략은 카메라와 LiDAR 간의 정렬 오차나 조명 변화에 매우 민감하다. 이에 반해 CVPR 2022에서 제안된 TransFusion은 트랜스포머 디코더 아키텍처를 활용한 소프트 어쏘시에이션 방식을 도입함으로써, 네트워크가 이미지 공간 전체에서 자율적으로 관련 정보를 가중하여 수집하도록 유도한다. 이 과정의 핵심은 SMCA(Spatially Modulated Cross-Attention)와 이미지 기반 쿼리 초기화(Image-Guided Query Initialization)이다.
환경 설정 및 코드 아키텍처 이해
TransFusion은 OpenMMLab의 MMDetection3D 프레임워크 위에 구축되어 있어, 높은 모듈성과 재사용성을 제공하지만, 그만큼 환경 구성이 까다롭다. 아래는 안정적인 실행을 위한 검증된 설정 절차다.
# 가상 환경 생성
conda create -n transfusion python=3.8 -y
conda activate transfusion
# CUDA 11.3 기준 PyTorch 설치
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch
# mmcv-full 설치 (CUDA 및 PyTorch 버전 정확히 일치해야 함)
pip install mmcv-full==1.7.0 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.12.0/index.html
# 저장소 클론 및 로컬 설치
git clone https://github.com/XuyangBai/TransFusion.git
cd TransFusion
pip install -e .
mmcv-full은 컴파일된 커널을 포함하므로, 사용 중인 PyTorch 및 CUDA 버전과 정확히 일치하는 빌드를 선택해야 한다. 그렇지 않으면 런타임 시 undefined symbol 오류가 발생할 수 있다. 설치 후 다음 코드로 환경 정상 동작 여부를 확인할 수 있다.
# test_env.py
import torch
from mmcv import __version__ as mmcv_version
from mmdet3d import __version__ as mmdet3d_version
print(f"PyTorch: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"MMCV: {mmcv_version}")
print(f"MMDetection3D: {mmdet3d_version}")
핵심 모듈 분석: SMCA와 쿼리 초기화 메커니즘
TransFusion의 성능 향상은 두 가지 핵심 설계에 기인한다. 첫째는 객체 중심의 쿼리 초기화 방식이며, 둘째는 공간 조건화된 크로스어텐션 메커니즘이다.
이미지 기반 쿼리 초기화 (Image-Guided Query Initialization)
기존 트랜스포머 기반 3D 탐지기는 쿼리를 무작위 또는 그리드 기반으로 초기화하여 불필요한 계산을 초래한다. TransFusion은 먼저 2D 이미지에서 CenterNet 스타일의 백본을 통해 객체 중심 맵(objectness heatmap)을 예측한다. 이 맵 상에서 응답 값이 높은 위치들(예: 최대값의 90% 이상)을 선별하고, 해당 위치에 대응하는 LiDAR BEV(Bird’s Eye View) 공간 내 3D 좌표를 초기 쿼리로 사용한다.
이 방식은 다음과 같은 장점이 있다:
- 쿼리가 실제 객체 근처에 집중되므로 탐지 효율성 증가
- 이미지 정보를 활용해 배경 영역에서의 잘못된 활성화 방지
- 후속 디코더 레이어에서 더 빠르게 수렴
공간 변조 크로스어텐션 (SMCA)
SMCA는 트랜스포머 디코더의 크로스어텐션 단계에서, 키(key)와 값(value)에 대한 공간적 중요도를 조절하는 역할을 한다. 일반적인 크로스어텐션은 쿼리와 키 간의 유사도만 고려하지만, SMCA는 추가적으로 공간 게이팅 함수를 도입하여, 현재 쿼리 위치와 이미지 피처맵 상의 각 위치 간의 지오메트릭 일관성(geometric consistency)을 평가한다.
구현상, 이는 다음과 같이 표현될 수 있다:
class SMCA(nn.Module):
def __init__(self, embed_dims, num_heads):
super().__init__()
self.attention = MultiheadAttention(embed_dims, num_heads)
self.spatial_gating = nn.Sequential(
nn.Linear(embed_dims, embed_dims),
nn.Sigmoid()
)
def forward(self, query, key, value, img_metas):
# 기하정보 기반 마스크 생성 (예: 카메라 왜곡, 프로젝션 행렬 반영)
spatial_weights = compute_projective_similarity(query, img_metas)
# 기존 어텐션 스코어 계산
attn_score = self.attention(query, key, value)
# 공간 가중치로 조절
gated_value = value * self.spatial_gating(spatial_weights)
output = torch.bmm(attn_score, gated_value)
return output
여기서 compute_projective_similarity 함수는 LiDAR 포인트를 카메라 플레인에 프로젝션하고, 유효한 시야각 내에 있는지, 그리고 깊이 일관성이 있는지를 판단하여 어텐션 가중치에 반영한다. 이는 센서 간 정렬 오차에 강건한 융합을 가능하게 한다.
모델 구성 파일과 핵심 경로
코드 베이스 내 주요 구성 요소는 다음과 같다:
mmdet3d/models/detectors/transfusion.py: 전체 탐지기의forward()흐름을 관리하며, 멀티모달 입력 처리 및 출력 생성을 담당.mmdet3d/models/dense_heads/transfusion_head.py: 가장 중요한 파일로, 쿼리 초기화, SMCA 통합, 최종 바운딩 박스 회귀 및 분류를 수행.mmdet3d/models/fusion_layers/smca.py: SMCA 모듈의 정의가 위치하며, 공간 조건화 로직이 구현됨.configs/transfusion/: 다양한 실험 설정(config)이 포함되어 있으며,transfusion_lidar-cam_fpn.py등이 대표적.
특히 transfusion_head.py 내부에서는 _prepare_query_from_heatmap 메서드를 통해 2D 히트맵을 기반으로 초기 3D 쿼리를 생성하며, 이후 트랜스포머 디코더 블록에서 SMCA를 반복 적용하여 점진적으로 정교한 예측을 수행한다.