[DiffusionDrive][nuscenes] InstanceQueue

ad_official·2025년 2월 6일

diffusion planning

목록 보기
9/19
  • InstanceQueue는 모션 및 플래닝 모듈에서, 시간에 따른 객체(또는 자차)의 특징앵커 정보를 누적하여 저장하고 업데이트
  • 이를 통해,
    • 과거 프레임의 정보를 기반으로, 현재 프레임의 추정(예: 자차 상태나 미래 궤적 예측)을 보완하거나,
      - temporal consistency(시간적 일관성)를 유지할 수 있습니다.

아래는 주요 메서드별 기능과 역할입니다.


1. get 함수

목적:

  • 현재 배치(batch)의 메타 정보와 feature_maps를 이용하여,
    • 과거에 저장한 temporal 정보를 업데이트하고(예: 앵커 위치 보정),
  • 최신의 ego(자체) 정보와 함께 temporal 정보를 (instance_feature, anchor) 형태로 반환

주요 동작:

  • Reset 및 Temporal 업데이트:

    • 만약 저장된 temporal 정보(예: self.period)가 현재 배치 크기와 일치하면,
      • 이전 메타정보(self.metas)를 사용해 현재 메타(metas)와의 변환 행렬(T_global_inv @ T_global)을 계산
    • 이 변환 행렬(T_temp2cur)을 통해, 저장된 앵커들(self.anchor_queue, self.ego_anchor_queue)을 현재 좌표계로 보정
    • 만약 저장된 정보가 없거나 배치 크기가 다르면, reset()을 호출하여 temporal 정보들을 초기화합니다.
  • Motion/Planning 준비:

    • prepare_motion()을 호출:
      • det_output의 instance_feature와 예측 앵커(det_anchors)를 기반으로 motion 정보를 업데이트
    • prepare_planning()을 호출:
      • feature_maps에서 ego_feature(자차 특징)와 ego_anchor(자차 앵커)를 추출
  • Temporal 정보 통합:

    • 현재까지 누적된 instance_feature_queue와 anchor_queue (그리고 ego_feature_queue, ego_anchor_queue)를 torch.stack()을 이용해 하나의 텐서로 결합
    • self.period와 self.ego_period를 연결해, temporal 길이(몇 프레임의 정보를 저장했는지)를 나타내는 period 정보를 생성합니다.
    • 마지막으로, 시간에 따라 오래된 정보는 제거(clip)하고, 각 후보별로 temporal mask(temp_mask)를 생성하여 반환

입출력 Shape (예상):

  • 입력:
    • det_output["instance_feature"]: [B, N_det, embed_dims]
    • det_output["prediction"][-1]: [B, N_det, D]
    • metas: 메타 정보 딕셔너리 (각 이미지의 T_global, T_global_inv, img_metas 등)
    • feature_maps: 이미지 백본의 출력 feature maps
    • batch_size: B
    • mask: 배치별 마스크 (예: 자차 정보 업데이트 여부를 위한 Boolean tensor)
    • anchor_handler, # InstanceBank.anchor_handler(=Sparse3DKeyPointsGenerator) of det_head
  • 출력:
    • ego_feature: [B, (num_ego), embed_dims] (보통 자차의 경우 1개의 후보, 즉 [B,1,embed_dims=256])
    • ego_anchor: [B, (num_ego)=1, D=11] (자차 앵커 정보)
    • temp_instance_feature: [B, total_queue_length=901, embed_dims=256]
    • temp_anchor: [B, total_queue_length=901, D=11]
    • temp_mask: [B, total_queue_length=901, 1]

2. cache_motion 함수

목적:

  • 감지(det_output) 모듈에서 나온 최신 객체 특징(instance_feature)과 예측 앵커(det_anchors) 정보를 저장하여, 이후 temporal 업데이트에 활용합니다.

주요 동작:

  • det_output["classification"][-1]에서 sigmoid 함수를 적용하여 분류 점수를 얻고, 이 중 최대 값을 통해 각 후보의 confidence를 산출합니다.
  • det_output에서 instance_id를 가져와, 이전 프레임과의 매칭에 사용합니다.
  • 이 정보를 self.prev_confidence와 self.prev_instance_id에 저장하며, 이후 prepare_motion()에서 temporal 업데이트 시 활용합니다.
  • metas도 함께 저장하여, 변환 행렬 계산 등에 재사용합니다.

입출력 Shape (예상):

  • 입력:
    • instance_feature: [B, N_det, embed_dims]
    • det_output["classification"][-1]: [B, N_det, num_classes]
    • det_output["prediction"][-1]: [B, N_det, D]
    • det_output["instance_id"]: [B, N_det]
  • 출력:
    • 내부 변수 self.prev_confidence: [B, N_det]
    • self.prev_instance_id: [B, N_det]
    • self.metas: 저장된 메타 정보 (dictionary)

3. cache_planning 함수

목적:

  • 자차(planning) 모듈과 관련하여, ego_feature(자체 차량의 feature)와 ego_status(자차의 상태)를 저장합니다.
  • 이를 통해, 이후 temporal 정보 업데이트 시 자차와 관련된 정보를 최신 상태로 유지합니다.

주요 동작:

  • 입력받은 ego_status를 detach()를 통해 저장한 후, self.prev_ego_status에 업데이트합니다.
  • 또한, 최신 ego_feature는 이미 instance_queue의 마지막 요소에 저장되어 있으므로, 이를 업데이트합니다.

입출력 Shape (예상):

  • 입력:
    • ego_feature: [B, num_ego, embed_dims] (예: [B,1,embed_dims])
    • ego_status: [B, ...] (자차 상태 정보, shape는 설계에 따라 달라짐)
  • 출력:
    • self.prev_ego_status: 동일한 shape (자체 상태 정보)
    • 업데이트된 ego_feature_queue: 마지막 항목이 갱신되어 있음

결론

InstanceQueue는 모션 및 플래닝 모듈에서 시간에 따른 객체 및 자차 정보를 누적하여 관리하는 핵심 모듈입니다.

  • get() 함수는 저장된 temporal 정보를 현재 배치에 맞게 보정 및 통합하여, ego(자체 차량) 정보와 함께 최신 temporal 특징을 반환합니다.
  • cache_motion() 함수는 감지 모듈에서 나온 객체 정보(인스턴스 특징, 앵커, confidence, instance_id 등)를 저장하여 temporal 업데이트에 사용합니다.
  • cache_planning() 함수는 자차 상태 정보를 저장하여, 이후 자차 플래닝(ego trajectory 예측)에서 temporal context로 활용합니다.

이를 통해 InstanceQueue는 시간적 일관성을 보장하며, 과거 프레임의 정보를 기반으로 현재 프레임에서 더 안정적인 모션 및 플래닝 예측을 가능하게 만듭니다.

profile
ad_official

0개의 댓글