[DiffusionDrive][nuscenes] [map_head] Sparse4DHead

ad_official·2025년 2월 6일

diffusion planning

목록 보기
7/19
  • 이 모듈은 주변 환경의 정적 요소(예: 차선, 경계, 보행자 횡단보도 등)를 벡터화하여 예측하는 역할

최종 요약

Map head로서의 Sparse4DHead는 다음과 같이 작동합니다:

  • 입력:

    • 이미지 백본/넥에서 나온 다중 스케일 feature maps와 메타 정보
    • InstanceBank로부터 생성된 초기 지도 후보(anchor 및 instance_feature), 각각
      • instance_feature: [B, 100, 256]
      • anchor: [B, 100, D]
  • 처리:

    1. Anchor 임베딩:
      • 원시 anchor를 SparsePoint3DEncoder를 통해 2D 지도 요소에 적합한 고차원 표현(anchor_embed, [B, 100, 256])으로 변환합니다.
    2. 정제:
      • Transformer 기반 모듈(operation_order)을 통해 instance_feature와 anchor_embed를 정제하여 후보의 정보를 강화합니다.
    3. Refinement:
      • SparsePoint3DRefinementModule (refine_layer)에서 각 후보에 대해 지도 클래스 분류 ([B, 100, 3])와 회귀(예: 선분 좌표, [B, 100, 40]) 결과를 산출합니다.
    4. 매칭 및 후처리:
      • 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는 전체 자율주행 시스템에서 지도 정보를 추정하기 위한 모듈로, 다음과 같이 구성되어 있습니다.

  1. InstanceBank (for map):

    • 입력: 초기 anchor 데이터를 "data/kmeans/kmeans_map_100.npy" (100개의 후보)
    • 출력:
      • instance_feature: [B, 100, embed_dims] (예: [B, 100, 256])
      • anchor: [B, 100, D]
  2. 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])
  3. Transformer 정제 (operation_order):

    • 입력: instance_feature와 anchor_embed, shape 각각 [B, 100, 256]
    • 출력: 정제된 feature로, 동일 shape 유지 (또는 약간 변형됨)
    • 이 과정에서 "gnn", "norm", "deformable", "ffn", "refine" 등 모듈이 순차적으로 적용되어 후보의 정보를 강화합니다.
  4. 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)
  5. 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]
  6. 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])

(3) Transformer 기반 정제 (Operation Order)

  • 역할:
    • 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]

profile
ad_official

0개의 댓글