- 이 모듈은 주변 환경의 정적 요소(예:
차선, 경계, 보행자 횡단보도 등)를 벡터화하여 예측하는 역할
최종 요약
Map head로서의 Sparse4DHead는 다음과 같이 작동합니다:
-
입력:
- 이미지 백본/넥에서 나온 다중 스케일 feature maps와 메타 정보
- InstanceBank로부터 생성된 초기 지도 후보(anchor 및 instance_feature), 각각
- instance_feature: [B, 100, 256]
- anchor: [B, 100, D]
-
처리:
- Anchor 임베딩:
- 원시 anchor를 SparsePoint3DEncoder를 통해 2D 지도 요소에 적합한 고차원 표현(anchor_embed, [B, 100, 256])으로 변환합니다.
- 정제:
- Transformer 기반 모듈(operation_order)을 통해 instance_feature와 anchor_embed를 정제하여 후보의 정보를 강화합니다.
- Refinement:
- SparsePoint3DRefinementModule (refine_layer)에서 각 후보에 대해 지도 클래스 분류 ([B, 100, 3])와 회귀(예: 선분 좌표, [B, 100, 40]) 결과를 산출합니다.
- 매칭 및 후처리:
- SparsePoint3DTarget (sampler)을 통해 예측과 GT 간의 매칭(target 생성)을 수행하고,
- SparsePoint3DDecoder (decoder)를 통해 후처리하여 최종 지도 벡터 결과를 List[dict] 형태로 반환합니다.
-
출력:
- 최종 결과는 후처리된 지도 정보로, 각 이미지에 대해 후보 중 상위 결과(예: top-k, 300개 등)를 포함한 dict로 반환되며, 각 dict는 다음 정보를 담습니다:
"vectors": 예측 지도 벡터 (예: [num_selected, 40])
"scores": 예측 신뢰도 (예: [num_selected])
"labels": 예측 지도 클래스 (예: [num_selected])
이처럼 map head는 설정 파일에 정의된 파라미터(예: num_anchor=100, num_sample=20, embed_dims=256, num_map_classes=3 등)와 논문에서 제시된 end-to-end 자율주행 시스템의 아이디어를 반영하여, 지도 요소(차선, 경계 등)를 효과적으로 검출하고 벡터화하는 데 최적화된 모듈로 설계되어 있습니다.
3. 종합 요약 – Map Head (Sparse4DHead로서)
Map head는 전체 자율주행 시스템에서 지도 정보를 추정하기 위한 모듈로, 다음과 같이 구성되어 있습니다.
-
InstanceBank (for map):
- 입력: 초기 anchor 데이터를
"data/kmeans/kmeans_map_100.npy" (100개의 후보)
- 출력:
- instance_feature: [B, 100, embed_dims] (예: [B, 100, 256])
- anchor: [B, 100, D]
-
Anchor Encoder (SparsePoint3DEncoder):
- 입력: 원시 anchor, reshape 후 [B, 100, num_sample*coords_dim] (예: [B, 100, 20×2=40])
- 출력:
- anchor_embed: [B, 100, embed_dims] (예: [B, 100, 256])
-
Transformer 정제 (operation_order):
- 입력: instance_feature와 anchor_embed, shape 각각 [B, 100, 256]
- 출력: 정제된 feature로, 동일 shape 유지 (또는 약간 변형됨)
- 이 과정에서 "gnn", "norm", "deformable", "ffn", "refine" 등 모듈이 순차적으로 적용되어 후보의 정보를 강화합니다.
-
Refine Layer (SparsePoint3DRefinementModule):
- 입력: 정제된 instance_feature와 anchor_embed
- 출력:
- Classification: 지도 후보에 대한 분류 결과, shape [B, 100, num_map_classes] (예: [B, 100, 3])
- Regression: 지도 후보에 대한 회귀 결과, shape [B, 100, output_dim] (예: [B, 100, 40]; 여기서 output_dim = num_sample×coords_dim = 20×2)
-
Sampler (SparsePoint3DTarget):
- 입력: 예측된 cls_scores ([B, 100, 3])와 pts_preds ([B, 100, 40]), 그리고 GT 지도 정보
- 출력: 매칭된 target 값들
- output_cls_target: [B, 100]
- output_box_target: [B, 100, 40]
- output_reg_weights: [B, 100, 40]
-
Decoder (SparsePoint3DDecoder):
- 입력: 최종 예측 cls_scores, pts_preds, (옵션: instance_id, quality)
- 출력: 최종 지도 벡터 결과 – List[dict] with keys:
"vectors": 각 후보에 대한 지도 벡터, (예: [num_selected, 40])
"scores": 예측 신뢰도, (예: [num_selected])
"labels": 예측 지도 클래스, (예: [num_selected])
1. Map Head로서의 Sparse4DHead 개요
-
목적:
지도(map) 추정을 위해 이미지 백본/넥에서 추출한 다중 스케일 feature maps과 메타 정보를 받아, 지도 요소 후보(예: 차선, 경계선 등)를 생성하고 정제합니다.
최종적으로 각 후보에 대해 지도 요소의 분류(예: ped_crossing, divider, boundary)와 회귀(선분이나 경계선의 좌표 벡터)를 예측하고, decoder를 통해 실제 지도 벡터로 복원합니다.
-
구성:
map_head는 det_head와 동일한 Sparse4DHead 프레임워크를 사용하지만,
- 인스턴스 수: 후보 수가 100개 (num_anchor=100)로 설정되어 있어, 지도 영역에 대한 후보가 비교적 적은 수로 집중됩니다.
- 좌표 정보: 앵커 임베딩 및 refinement 과정에서 2D 좌표 기반 정보(예: num_sample=20, coords_dim=2)를 사용하여 지도 요소의 벡터(예: 선분)를 예측합니다.
- 손실 및 디코더: 지도 예측은 SparseLineLoss와 HungarianLinesAssigner 기반의 샘플러, 그리고 SparsePoint3DDecoder를 통해 후처리됩니다.
2. 주요 구성 요소 및 역할 (map_head 관점)
(1) InstanceBank (with anchor_handler)
- 역할:
- 이미지에서 지도 후보(anchor)를 생성합니다.
- 여기서는 num_anchor=100로 설정되어 있으며, 초기 anchor 데이터는
"data/kmeans/kmeans_map_100.npy"에서 로드됩니다.
- anchor_handler:
- 설정에서는 "SparsePoint3DKeyPointsGenerator"가 사용됩니다.
- 이 모듈은 원시 anchor를 입력받아, 지도 요소의 키포인트(예: 선분의 샘플 포인트)를 생성하거나 보정합니다.
- 입력 및 출력:
- 입력:
- 배치 크기 B (예: B)
- 메타 정보 (예: 타임스탬프, projection matrix 등)
- 초기 anchor 데이터: shape [B, 100, D] (D는 원시 3D 박스 표현 차원; 보통 8~10 정도)
- 출력:
- instance_feature: 초기 후보 객체의 특징, shape → [B, 100, embed_dims] (예: [B, 100, 256])
- anchor: 초기 anchor 값, shape → [B, 100, D] (나중에 anchor_encoder에서 사용)
(2) Anchor Encoder (SparsePoint3DEncoder)
- 역할:
- 인스턴스 뱅크에서 생성된 원시 anchor를, 지도 추정을 위한 고차원 임베딩으로 변환합니다.
- 이 모듈은 주로 2D 좌표 기반 정보를 처리합니다.
- 설정에서는 num_sample=20로 지정되어 있으며, 입력으로 2D 좌표 정보를 (예: 20개의 샘플) 받아 embed_dims (예: 256 차원)으로 임베딩합니다.
- 입력 및 출력:
- 입력:
- 원시 anchor, shape: [B, 100, D]
- 내부적으로, 해당 모듈은 입력을 reshape하여 [B, 100, num_sample * coords_dim] 형태로 만듭니다. (보통 coords_dim=2 → [B, 100, 40])
- 출력:
- anchor_embed: 지도 요소 후보의 고차원 표현, shape → [B, 100, embed_dims] (예: [B, 100, 256])
- 역할:
- instance_bank에서 나온 instance_feature와 anchor_encoder에서 생성된 anchor_embed를 결합 및 정제합니다.
- operation_order에 따라 여러 단계의 모듈("gnn", "norm", "deformable", "ffn", "refine" 등)이 순차적으로 적용됩니다.
- 이 과정에서 지도 후보의 특징이 강화되고, 최종 후보에 대한 정보가 업데이트됩니다.
- 입력/출력:
- 입력:
- instance_feature: [B, 100, embed_dims] (예: [B, 100, 256])
- anchor_embed: [B, 100, embed_dims]
- 출력:
- 업데이트된 instance_feature와 anchor_embed, 유지하는 shape: [B, 100, embed_dims]
- 특징:
- map_head의 경우, operation_order는 전체 리스트에서 slice ([:])로 그대로 사용되며, detection과 달리 temporal 모듈은 생략하거나 다르게 구성될 수 있습니다.
(4) Refine Layer (SparsePoint3DRefinementModule)
- 역할:
- 최종적으로 지도 후보에 대한 분류 및 회귀 예측을 수행합니다.
- 분류 branch는 각 후보가 어떤 지도 클래스(예: ped_crossing, divider, boundary)에 속하는지 예측합니다.
- 회귀 branch는 각 후보에 대해 선형 형태(예: 벡터화된 지도 요소, 보통 num_sample×coords_dim)의 좌표 값을 예측합니다.
- 입력 및 출력:
- 입력:
- 정제된 instance_feature와 anchor_embed (각각 [B, 100, embed_dims])
- 추가 정보로, time_interval 등(옵션)
- 출력:
- Classification: Tensor, shape → [B, 100, num_map_classes]
(예: [B, 100, 3], 여기서 num_map_classes = len(map_class_names) = 3)
- Regression (Prediction): Tensor, shape → [B, 100, output_dim]
- 여기서 output_dim = num_sample × coords_dim. 만약 num_sample=20, coords_dim=2, then output_dim = 40.
- (옵션) Quality Score: 추가적으로 예측되는 경우, shape은 보통 [B, 100, ?]
(5) Sampler (SparsePoint3DTarget)
- 역할:
- 지도 요소 후보 예측과 Ground Truth (GT) 간의 비용(cost) 기반 할당을 수행합니다.
- HungarianLinesAssigner를 사용하여, 예측된 지도 선분(또는 벡터)과 GT 간의 매칭을 계산합니다.
- 이 과정을 통해, 학습 시에 분류 및 회귀 손실을 계산하기 위한 target을 생성합니다.
- 입력 및 출력:
- 입력:
- cls_preds: 지도 후보에 대한 예측 분류 점수, shape → [B, 100, num_map_classes] (예: [B, 100, 3])
- pts_preds: 지도 후보에 대한 회귀 예측 값, shape → [B, 100, output_dim] (예: [B, 100, 40])
- cls_targets, pts_targets: GT 지도 라벨과 GT 포인트(라인) 정보; GT 개수는 이미지마다 다르므로 list 형태로 관리됨.
- 출력:
- output_cls_target: 최종 target 분류 값, shape → [B, 100]
- output_box_target: 최종 target 회귀 값, shape → [B, 100, output_dim]
- output_reg_weights: 회귀 가중치, shape → [B, 100, output_dim]
(6) Decoder (SparsePoint3DDecoder)
- 역할:
- 학습 또는 추론 후, 최종적으로 지도 head의 예측 결과를 후처리하여 실제 지도 벡터(예: 선분 좌표)를 복원합니다.
- 입력받은 분류 점수와 회귀 예측 값에서 top-k 후보를 선택하고, score threshold (설정된 경우)로 필터링하여 최종 결과를 산출합니다.
- 입력 및 출력:
- 입력:
- cls_scores: 예측된 지도 후보 분류 점수, shape → 보통 마지막 레벨 cls_scores[-1]의 shape: [B, num_pred, num_map_classes]
- pts_preds: 회귀 예측 값, reshape하여 [B, num_pred, num_sample, coords_dim] (예: [B, 100, 20, 2])
- (옵션) instance_id, quality: 추가 정보 (필요시)
- 출력:
- List[dict] 각 dict에는:
"vectors": 최종 지도 벡터(예: 선분 정보) → list 또는 numpy array 형태, 각 후보에 대한 좌표 (예: [num_pred_selected, output_dim] with output_dim = 40)
"scores": 예측 신뢰도, shape → [num_pred_selected]
"labels": 예측 지도 클래스 인덱스, shape → [num_pred_selected]