Projects/AI 아이트래킹 모델 프로젝트

[도메인 공부 ] 5. MiDaS & DPT

ha2yong 2025. 9. 12. 09:06

📌 MiDaS & DPT 개요

  • MiDaS (Monocular Depth Sensing): Microsoft Research에서 만든 단일 RGB 이미지 → 깊이맵 추정 모델
  • 초창기엔 ResNet 기반 백본을 썼는데, 점점 발전하면서 DPT (Dense Prediction Transformer) 백본을 붙여서 성능이 크게 향상됐어.
  • 현재는 보통 “MiDaS”라고 부를 때 내부적으로 DPT 버전이 가장 많이 쓰여.

1️⃣ MiDaS의 발전 과정

  1. MiDaS v1 (2019)
    • ResNet 기반 Encoder + Decoder
    • 여러 depth dataset (NYU Depth, KITTI, MegaDepth 등)을 통합 학습
    • “절대 깊이”보단 “상대적 깊이 구조”에 강함
  2. MiDaS v2 (2020~2021)
    • Hybrid Encoder (ResNet + Vision Transformer 일부 결합)
    • 다양한 데이터셋 도메인 간 일반화 성능 강화
  3. MiDaS v3 (2021~2022) → 여기서 DPT 백본 정식 도입
    • Dense Prediction Transformer (DPT) 구조 적용
    • 다양한 출력 해상도 지원 (small / hybrid / large)
    • 고해상도 디테일 보존, 일반화 성능 ↑

2️⃣ DPT (Dense Prediction Transformer) 핵심

  • DPT는 원래 세그멘테이션·depth·normal 추정 등 dense prediction 문제를 위한 Transformer 백본이야.
  • 구조는 이렇게 돼:
    1. Vision Transformer (ViT) Encoder
      • 이미지를 패치로 나눠서 토큰화 → Transformer로 글로벌 문맥 파악
    2. Skip Connections
      • CNN처럼 로컬 디테일이 필요한데, 순수 ViT는 디테일이 부족 → 중간 feature map을 Decoder에 연결
    3. Decoder
      • 업샘플링 + Fusion → 원래 이미지 해상도와 같은 dense output (깊이맵) 생성

👉 CNN의 “지역적 특징 + 해상도 보존”과 Transformer의 “전역적 문맥 이해”를 동시에 쓰는 게 포인트.


3️⃣ MiDaS DPT 모델 종류

공식 GitHub에선 크게 3종류로 제공돼:

  • DPT_Large
    • 백본: ViT-L/16
    • 가장 무겁고 정확도 높음
    • GPU 메모리 많이 씀
  • DPT_Hybrid
    • 백본: CNN(ResNet) + Transformer 혼합
    • 속도와 정확도 밸런스 좋음 → 가장 많이 씀
  • DPT_Small
    • 경량 모델
    • 모바일/임베디드용

4️⃣ MiDaS DPT의 출력 특징

  • 출력: 깊이맵 (보통 상대 깊이, 정규화된 스케일)
  • 절대 거리는 학습 데이터에 따라 달라져서 신뢰 어려움 → 응용 시 보정 필요
  • 보통 후처리로 min-max 정규화 해서 시각화하거나, 시선 좌표와 결합해 "상대적 깊이"만 쓰면 충분함.

 


5️⃣ 간단한 사용법 (PyTorch Hub 예시)

import torch
import cv2
import numpy as np

# 모델 로드 (DPT_Hybrid 추천)
midas = torch.hub.load("intel-isl/MiDaS", "DPT_Hybrid")
midas.eval()

# 전처리
transforms = torch.hub.load("intel-isl/MiDaS", "transforms")
transform = transforms.dpt_transform

img = cv2.imread("world_image.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
input_batch = transform(img_rgb).unsqueeze(0)

# 추론
with torch.no_grad():
    prediction = midas(input_batch)

depth = prediction.squeeze().cpu().numpy()

# 정규화 후 시각화
depth_min, depth_max = depth.min(), depth.max()
depth_vis = (255 * (depth - depth_min) / (depth_max - depth_min)).astype(np.uint8)

cv2.imshow("Depth Map", depth_vis)
cv2.waitKey(0)

 

6️⃣ 요약

  • MiDaS = Monocular Depth 모델, 여러 dataset 일반화
  • DPT 백본 도입 이후 성능이 크게 향상됨
  • DPT_Hybrid → 속도/정확도 균형
  • DPT_Large → 최고 정확도 (GPU 필요)
  • 출력은 상대적 깊이맵, 절대 거리는 신뢰 어려움
  • 하지만 시선 벡터와 결합하면 “사용자가 어느 물체를 응시하는지”는 충분히 구별 가능