본문 바로가기

Computer Vision + Python/영상 처리 & 비디오 분석 (엔지니어)

Python으로 구현하는 단안 깊이 추정(Depth Estimation)과 AR/VR 실무 응용 전략

Python으로 구현하는 단안 깊이 추정(Depth Estimation)과 AR/VR 실무 응용 전략

1. 평면적인 영상을 입체적인 공간으로 이해하는 기술

우리가 매일 접하는 디지털 영상은 본질적으로 2D 평면 데이터입니다. 하지만 인공지능과 컴퓨터 비전의 목표는 이 평면적인 픽셀 데이터에서 3차원 공간의 '깊이'를 읽어내는 것입니다. 이를 깊이 추정(Depth Estimation)이라고 부릅니다. 과거에는 이 정보를 얻기 위해 두 개의 카메라를 사용하는 스테레오 비전(Stereo Vision)이나 고가의 라이다(LiDAR) 센서가 필수적이었습니다.

하지만 필자는 최근 진행한 스마트 팩토리 물류 로봇 프로젝트에서 하드웨어 비용 절감이라는 큰 난관에 부딪혔습니다. 고가의 센서를 부착하기 어려운 소형 기기에서도 공간을 인식해야 했고, 그 해결책으로 찾아낸 것이 바로 인공지능 기반의 '단안 깊이 추정(Monocular Depth Estimation)'이었습니다. 단 하나의 카메라 렌즈만으로 사물 간의 거리를 계산해내는 이 기술은 AR(증강현실)과 VR(가상현실)의 진입 장벽을 낮추는 혁신적인 도구입니다. 이번 포스팅에서는 파이썬을 활용해 어떻게 평면 영상에 생명력을 불어넣을 수 있는지 심도 있게 다뤄보겠습니다.

2. 단안 깊이 추정의 원리와 AI의 역할

단 하나의 렌즈로 어떻게 거리를 알 수 있을까요? 사람도 한쪽 눈을 감고 사물을 보면 거리감을 어느 정도 느낄 수 있습니다. 이는 우리가 이미 사물의 크기, 질감, 조명의 변화, 그리고 '원근법'에 대한 학습 데이터가 뇌에 저장되어 있기 때문입니다. 인공지능 역시 마찬가지입니다. 수백만 장의 거리 데이터가 포함된 영상을 학습한 신경망 모델은 영상 내의 특징점들을 분석하여 상대적인 거리를 예측합니다.

실무적으로 가장 각광받는 모델 중 하나는 MiDaS(Multiple Indoor and Outdoor Depth Analysis)입니다. 이 모델은 실내외를 가리지 않고 상당히 정교한 깊이 지도(Depth Map)를 생성해냅니다. 영상의 각 픽셀이 카메라로부터 얼마나 떨어져 있는지를 0에서 255 사이의 밝기 값이나 특정 수치로 변환해주는 것이 핵심입니다. 이러한 깊이 지도가 확보되면, 우리는 비로소 평면 영상 위에 가상의 3D 캐릭터를 정확한 위치에 세우거나, 특정 거리 이상의 배경만 흐리게 만드는 고차원적인 작업이 가능해집니다.

3. AR/VR 응용을 위한 공간 좌표계의 이해

깊이 정보를 단순히 얻는 것만으로는 AR/VR 앱을 만들 수 없습니다. 얻어진 거릿값을 실제 물리적인 '공간 좌표'와 매칭시키는 과정이 필요합니다. 필자가 실제 AR 가구 배치 시뮬레이션을 개발할 때 겪었던 가장 큰 실수는 영상의 픽셀 좌표를 그대로 거리로 믿었던 것입니다.

실제 공간은 렌즈의 화각(FOV)에 따라 왜곡이 발생하므로, 카메라 매트릭스(Camera Matrix)를 활용한 캘리브레이션 과정이 병행되어야 합니다. 그래야만 "화면 중앙의 책상이 카메라로부터 1.5m 떨어져 있다"는 정보를 바탕으로 그 위에 가상의 컵을 흔들림 없이 올려놓을 수 있습니다. 이러한 정교함이 사용자에게 이질감 없는 몰입감을 선사하는 AR/VR 콘텐츠의 차이를 만듭니다.

4. Python 기반 실전 구현 전략

파이썬 환경에서는 PyTorch나 TensorFlow를 활용해 이미 잘 만들어진 프리트레인(Pre-trained) 모델을 불러오는 것만으로도 수준 높은 깊이 추정 시스템을 구축할 수 있습니다. 특히 OpenCV와 결합하면 실시간 웹캠 피드에서 실시간으로 공간의 깊이를 분석하는 프로토타입을 단 몇 줄의 코드로 완성할 수 있습니다.

구현 시 주의할 점은 연산 속도와 정확도의 트레이드오프(Trade-off)입니다. 모델이 무거울수록 깊이 지도는 정교해지지만, 실시간성이 중요한 AR 앱에서는 프레임 드랍이 발생해 사용자가 어지러움을 느낄 수 있습니다. 따라서 대상 기기의 사양에 맞춰 모델의 크기를 경량화하거나, 입력 영상의 해상도를 조절하는 최적화 작업이 반드시 수반되어야 합니다.

5. 파이썬을 활용한 깊이 추정 핵심 코드

이제 MiDaS 모델을 활용하여 입력 영상으로부터 깊이 지도를 추출하는 핵심적인 파이썬 코드를 살펴보겠습니다. (이 코드를 복사하여 티스토리 코드블럭에 넣으세요.)

import cv2 import torch import numpy as np

1. MiDaS 모델 로드 (가장 가벼운 Small 버전 사용)

model_type = "MiDaS_small" midas = torch.hub.load("intel-isl/MiDaS", model_type)

2. 연산 장치 설정 (GPU 사용 가능 시 CUDA 사용)

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") midas.to(device) midas.eval()

3. 입력 영상 전처리 설정

midas_transforms = torch.hub.load("intel-isl/MiDaS", "transforms") transform = midas_transforms.small_transform if model_type == "MiDaS_small" else midas_transforms.dpt_transform

def estimate_depth(frame): # 4. 프레임 전처리 및 모델 추론 img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) input_batch = transform(img).to(device)

with torch.no_grad():
    prediction = midas(input_batch)
    # 원본 크기로 리사이징
    prediction = torch.nn.functional.interpolate(
        prediction.unsqueeze(1),
        size=frame.shape[:2],
        mode="bicubic",
        align_corners=False,
    ).squeeze()

# 5. 시각화를 위한 정규화 (0~255)
depth_map = prediction.cpu().numpy()
depth_map_norm = cv2.normalize(depth_map, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

# 컬러맵 적용하여 가독성 증대
depth_map_color = cv2.applyColorMap(depth_map_norm, cv2.COLORMAP_MAGMA)

return depth_map_color

[코드에 대한 부가 설명] 위 코드는 PyTorch Hub를 통해 인텔에서 공개한 MiDaS 모델을 실시간으로 활용하는 예시입니다. 특히 MiDaS_small 모델을 선택한 이유는 AR/VR 응용에서 가장 중요한 요소인 '실시간성'을 확보하기 위함입니다. 코드 내의 torch.nn.functional.interpolate 함수는 모델이 예측한 저해상도의 깊이 지도를 원래 입력 영상의 크기로 부드럽게 키워주는 역할을 하며, 마지막에 적용된 COLORMAP_MAGMA는 어두운 곳(먼 곳)과 밝은 곳(가까운 곳)을 시각적으로 명확하게 구분해줍니다. 실제 프로젝트에서는 이 depth_map_norm 값을 실제 거리(cm, m) 단위로 변환하는 매핑 과정을 거쳐 실무 데이터로 활용하게 됩니다.

6. 실무에서의 한계점과 극복 방안

단안 깊이 추정 기술이 만능은 아닙니다. 가장 큰 한계는 '절대 거리' 측정의 불확실성입니다. AI는 상대적인 거리는 매우 잘 맞추지만, "이 물체가 정확히 125cm 거리에 있다"는 절대적인 수치를 맞추는 데는 오차가 발생할 수 있습니다.

필자는 이를 극복하기 위해 '센서 퓨전(Sensor Fusion)' 방식을 도입하곤 합니다. 스마트폰의 가속도 센서나 자이로 센서를 활용해 기기의 높이 정보를 결합하거나, 영상 내에 크기를 이미 알고 있는 참조물(예: A4 용지, 신용카드 등)을 두어 보정(Calibration)하는 방식입니다. 이러한 보정 알고리즘이 추가될 때 비로소 AR 환경에서 가상의 물체가 바닥에 떠 다니지 않고 딱 붙어 있는 듯한 고품질의 결과물을 얻을 수 있습니다.

7. AR/VR을 넘어선 확장성: 디지털 트윈과 자율주행

깊이 추정 기술은 단순히 가상 캐릭터를 띄우는 AR/VR을 넘어 다양한 산업으로 확장되고 있습니다. 최근 주목받는 디지털 트윈(Digital Twin) 분야에서는 실제 공장의 사진 한 장만으로 내부 구조의 입체 모델을 생성하는 데 이 기술이 쓰입니다. 또한 자율주행 드론이나 로봇의 경우, 전방의 장애물과의 거리를 빠르게 판단하여 회피 경로를 생성하는 데 핵심적인 역할을 수행합니다.

특히 저사양 엣지 디바이스(Edge Device)에서 구동해야 하는 산업용 AI 카메라의 경우, 단안 깊이 추정은 저비용 고효율의 공간 인식 솔루션이 됩니다. 필자가 경험한 바로는, 정밀한 계측이 필요한 상황이 아니라면 고가의 스테레오 카메라 시스템을 유지보수하는 것보다 잘 최적화된 AI 모델 하나를 운영하는 것이 운영 비용 측면에서 훨씬 유리했습니다.

8. 마치며: 공간을 읽는 눈, 직접 구현해보세요

우리는 오늘 Python과 인공지능을 통해 평면적인 영상에서 3차원 깊이 정보를 추출하는 과정을 살펴보았습니다. 영상 처리 기술은 이제 단순히 이미지를 보기 좋게 만드는 단계를 지나, 기계가 공간을 이해하고 인간과 상호작용하는 단계로 진화하고 있습니다.

오늘 공유해 드린 코드를 바탕으로 여러분만의 웹캠 거측기나 간단한 AR 효과를 직접 만들어 보시길 권장합니다. 이론으로만 접하는 것보다 실제 깊이 지도가 생성되는 과정을 눈으로 확인하는 것이 훨씬 더 깊은 이해를 제공하기 때문입니다. 기술적 호기심에서 시작된 시도가 미래의 혁신적인 AR/VR 서비스의 밑거름이 될 것입니다. 구현 과정에서 막히는 부분이나 추가로 알고 싶은 알고리즘이 있다면 언제든 댓글로 질문을 남겨주세요. 여러분의 도전을 진심으로 응원합니다.