📌 MiDaS & DPT 개요
- MiDaS (Monocular Depth Sensing): Microsoft Research에서 만든 단일 RGB 이미지 → 깊이맵 추정 모델
- 초창기엔 ResNet 기반 백본을 썼는데, 점점 발전하면서 DPT (Dense Prediction Transformer) 백본을 붙여서 성능이 크게 향상됐어.
- 현재는 보통 “MiDaS”라고 부를 때 내부적으로 DPT 버전이 가장 많이 쓰여.
1️⃣ MiDaS의 발전 과정
- MiDaS v1 (2019)
- ResNet 기반 Encoder + Decoder
- 여러 depth dataset (NYU Depth, KITTI, MegaDepth 등)을 통합 학습
- “절대 깊이”보단 “상대적 깊이 구조”에 강함
- MiDaS v2 (2020~2021)
- Hybrid Encoder (ResNet + Vision Transformer 일부 결합)
- 다양한 데이터셋 도메인 간 일반화 성능 강화
- MiDaS v3 (2021~2022) → 여기서 DPT 백본 정식 도입
- Dense Prediction Transformer (DPT) 구조 적용
- 다양한 출력 해상도 지원 (small / hybrid / large)
- 고해상도 디테일 보존, 일반화 성능 ↑
2️⃣ DPT (Dense Prediction Transformer) 핵심
- DPT는 원래 세그멘테이션·depth·normal 추정 등 dense prediction 문제를 위한 Transformer 백본이야.
- 구조는 이렇게 돼:
- Vision Transformer (ViT) Encoder
- 이미지를 패치로 나눠서 토큰화 → Transformer로 글로벌 문맥 파악
- Skip Connections
- CNN처럼 로컬 디테일이 필요한데, 순수 ViT는 디테일이 부족 → 중간 feature map을 Decoder에 연결
- Decoder
- 업샘플링 + Fusion → 원래 이미지 해상도와 같은 dense output (깊이맵) 생성
- Vision Transformer (ViT) Encoder
👉 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 필요)
- 출력은 상대적 깊이맵, 절대 거리는 신뢰 어려움
- 하지만 시선 벡터와 결합하면 “사용자가 어느 물체를 응시하는지”는 충분히 구별 가능
'Projects > AI 아이트래킹 모델 프로젝트' 카테고리의 다른 글
| [도메인 공부 ] 7. PLY(Point Cloud Data format) (0) | 2025.09.14 |
|---|---|
| [도메인 공부 ] 6. 절대 깊이(absolute depth)에 특화된 모델, Depth Anything (0) | 2025.09.14 |
| [도메인 공부 ] 4. 시선 벡터(gaze vector) (0) | 2025.09.11 |
| [도메인 공부 ] 2. 아이트래커 + 스테레오 비전 (0) | 2025.09.11 |
| [도메인 공부 ] 1. 스테레오 알고리즘 (0) | 2025.09.10 |