Link to this section단안 깊이 추정#
단안 깊이 추정(Monocular depth estimation)은 단일 RGB 이미지에서 픽셀별 깊이 맵을 예측합니다. 각 출력 픽셀은 카메라에서 해당 표면 지점까지의 추정 거리를 나타내는 미터(meter) 단위의 깊이 값을 포함합니다.
깊이 모델의 출력은 입력 이미지와 정렬된 (H, W) 형태의 조밀한(dense) float 맵입니다. 이러한 픽셀별 표현 방식은 단안 깊이 추정을 3D 장면 복원, 로봇 내비게이션, AR/VR 콘텐츠 제작 및 단일 카메라로부터 공간 레이아웃을 필요로 하는 모든 애플리케이션에 적합하게 만듭니다.
Use task=depth or the yolo depth CLI task for monocular depth estimation. YOLO26 depth model files use the -depth suffix, such as yolo26n-depth.pt.
Link to this section모델#
광범위한 다중 데이터셋 조합(실내 + 실외, 약 2.19M 이미지)으로 사전 학습된 YOLO26 깊이 모델은 아래와 같습니다. 지표 열은 NYU Depth V2 Eigen 테스트 분할에서 보고된 결과입니다.
모델은 처음 사용할 때 최신 Ultralytics 릴리스에서 자동으로 다운로드됩니다.
| 모델 | 크기 (픽셀) | delta1NYU | abs_relNYU | rmseNYU | 파라미터 (M) | FLOPs (B) |
|---|---|---|---|---|---|---|
| YOLO26n-depth | 768 | 0.882 | 0.109 | 0.414 | 6.4 | 46.9 |
| YOLO26s-depth | 768 | 0.896 | 0.104 | 0.399 | 13.2 | 67.9 |
| YOLO26m-depth | 768 | 0.921 | 0.089 | 0.364 | 23.3 | 130.7 |
| YOLO26l-depth | 768 | 0.930 | 0.083 | 0.351 | 27.7 | 157.2 |
| YOLO26x-depth | 768 | 0.933 | 0.080 | 0.344 | 57.0 | 302.0 |
- **delta1NYU**는 NYU Depth V2 Eigen 테스트 분할(654개 이미지)에서 다중 스케일(multi-scale) + 수평 뒤집기(horizontal-flip) TTA 및 로그 최소 자승(log-least-squares) 정렬을 사용하여 예측된 깊이가 정답(ground truth)의 1.25배 이내인 픽셀의 비율입니다.
- TTA를 사용하지 않는 단일 스케일 정확도는
yolo depth val model=yolo26n-depth.pt data=nyu-depth.yaml imgsz=768 device=0명령어로 재현 가능하며(각 크기마다model=값을 대체), 이 방식은 중앙값(스케일 전용) 정렬을 사용하며 더 낮은 점수를 기록합니다: delta1 0.785 (n), 0.786 (s), 0.827 (m), 0.839 (l), 0.843 (x). - abs_rel은 예측된 깊이 값과 실제 깊이 값 사이의 평균 절대 상대 오차입니다.
- rmse는 미터(meter) 단위의 평균 제곱근 오차(root mean squared error)입니다.
- params 및 FLOPs는 배포된 가중치의 학습 해상도인 768×768에서 측정되었습니다.
Link to this section깊이 범위 및 로그 깊이 헤드#
깊이 헤드는 exp(logit)을 예측하며, 이는 비경계(unbounded)(약 0.02–150 m) 형태이고 장면 형태와 절대 스케일을 분리합니다. 즉, 네트워크는 상대적인 로그 깊이 필드를 예측하며, 절대 미터 값은 평가 시 복구되거나 경량 보정(calibration) 또는 미세 조정(fine-tuning)을 통해 설정되는 별도의 2-파라미터 변환(exp(a·log d + b))에 의해 결정됩니다. 흔히 사용되는 대안인 경계가 지정된 sigmoid × max_depth 헤드는 아키텍처에 고정된 상한값을 적용하므로 max_depth를 초과하는 모든 깊이는 잘려 나가며, 이로 인해 더 먼 거리의 장면을 학습하거나 예측하는 것이 불가능해집니다.
Link to this section헤드가 비경계(unbounded)인 이유: 깊이 범위 전반에 걸친 증거#
제어된 A/B 테스트 — 동일 데이터, 동일 일정, 오직 헤드만 다름. 실내(≤10 m) 및 실외(≤80 m) 데이터의 동일한 조합으로 두 헤드를 처음부터 학습한 결과:
| 헤드 | 출력 범위 | 혼합 범위 val δ1 | 학습 동작 |
|---|---|---|---|
sigmoid × max_depth (10 m) | 0–10 m 범위 제한 | 0.221 | 에포크 1에서 정체 |
log (비경계) | 0–약 150 m | 0.367 (+66%) | 학습 내내 향상됨 |
경계가 지정된 헤드는 실외 픽셀의 대다수인 10 m 초과 영역을 표현할 수 없으므로 거의 즉시 개선이 멈춥니다. 반면 log 헤드는 전체 범위에서 학습합니다.
해결된 실패 모드 — 범위별로 계층화된 단일 데이터셋 미세 조정. 경계(10 m) 헤드를 개별 데이터셋으로 미세 조정하면 데이터가 제한 범위 내에 있을 때는 잘 작동하지만, 범위를 초과하면 결과가 무너집니다:
| 데이터셋 | 깊이 범위 | 경계 헤드 δ1 |
|---|---|---|
| SUN RGB-D | ≤10 m | 0.78 ✅ |
| Hypersim | 대부분 ≤10 m | 0.74 ✅ |
| KITTI | 약 80 m | 0.08 ❌ (abs_rel ≈ 7.0 — 80/10 스케일 불일치) |
| vKITTI2 | 80 m | 0.04 ❌ |
성능 저하는 정확히 경계 임계값에서 발생합니다. log 헤드에는 이러한 경계가 없습니다.
공개된 모델 — 교차 범위 성능. 10 m(NYU, iBims-1)에서 80 m(KITTI)까지의 벤치마크에 걸쳐 스케일 정렬된 δ1으로 평가된, 제공되는 log 헤드 제품군의 성능은 다음과 같습니다:
| 벤치마크 | 범위 | YOLO26x-depth (log) | 이전 경계 모델 릴리스 |
|---|---|---|---|
| NYU Eigen | 10 m | 0.933 | 0.934 |
| iBims-1 | 10 m | 0.961 | 0.945 |
| ETH3D | 약 60 m | 0.959 | 0.931 |
| Make3D | 약 70 m | 0.302 | 0.296 |
| KITTI Eigen | 80 m | 0.942 | 0.891 |
| 평균 | — | 0.819 | 0.799 |
가장 큰 성능 향상은 실내 성능을 유지하면서도 고정된 10 m 제한이 가장 문제가 되는 장거리 실외 벤치마크(KITTI, ETH3D)에서 나타납니다.
Link to this section학습(Train)#
Depth8 데이터셋에서 이미지 크기 640으로 100 에포크 동안 YOLO26n-depth를 학습하십시오. 사용 가능한 전체 인자 목록은 구성 페이지를 참조하십시오.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.yaml") # build a new model from YAML
model = YOLO("yolo26n-depth.pt") # load a pretrained model (recommended for training)
model = YOLO("yolo26n-depth.yaml").load("yolo26n-depth.pt") # build from YAML and transfer weights
# Train the model
results = model.train(data="depth8.yaml", epochs=100, imgsz=640)전체 train 모드 상세 정보는 학습(Train) 페이지를 참조하십시오.
Link to this section사용자 정의 데이터로 미세 조정#
사전 학습된 깊이 모델을 사용자 정의 데이터셋에 적용할 때는 학습률을 낮추고 AdamW 옵티마이저를 사용하십시오. 기본 옵티마이저 설정은 처음부터 학습(SGD, lr0=0.01)하도록 튜닝되어 있으므로, 이미 수렴된 깊이 모델에 적용하면 사전 학습된 지식을 덮어쓰고 결과를 저하시킬 수 있습니다. 특히 단일 도메인에서 미세 조정할 때 더욱 그렇습니다.
from ultralytics import YOLO
model = YOLO("yolo26s-depth.pt") # start from pretrained weights
model.train(
data="path/to/your_dataset.yaml",
epochs=20,
imgsz=640,
optimizer="AdamW",
lr0=1e-4, # ~100x below the from-scratch default
warmup_bias_lr=1e-4, # keep warmup gentle too
)추가 팁:
- 증강(Augmentation)은 표준 인수(
degrees,translate,scale,shear,perspective,flipud,fliplr,hsv_h,hsv_s,hsv_v)에 의해 제어됩니다. 기하학적 왜곡과 뒤집기는 쌍을 이루는 깊이 맵에도 동일하게 적용됩니다. 출시된 YOLO26-Depth 가중치에 사용된 정확한 레시피를 확인하려면 체크포인트에 저장된train_args를 살펴보십시오. YOLO26 체크포인트 학습 인수 검사를 참조하십시오. mosaic,mixup,cutmix및copy_paste는 깊이 모델에 구현되어 있지 않습니다. 깊이 데이터셋 로더는 이러한 확률을 자동으로 0으로 설정하므로, 해당 인수를 전달해도 효과가 없습니다. 이러한 증강 기법들은 여러 이미지를 결합하기 때문에 유효한 쌍을 이룬 깊이 맵을 생성할 수 없어 지원되지 않습니다.- 모든 깊이 범위는 즉시 작동합니다.
log헤드 모델은 비경계 깊이를 예측하므로 변경 없이 단거리(매크로) 또는 장거리(실외/주행) 데이터에 적응합니다. 데이터셋 YAML에서max_depth:(미터 단위)를 설정하면 유효성 검사 지표에 반영될 GT 픽셀을 제한할 수 있습니다. - 일반 성능 유지. 학습 데이터셋을 벗어난 장면에서도 모델이 정확도를 유지해야 한다면, 학습 데이터에 다양한 일반 목적 이미지를 소량(약 5–10%) 섞으십시오. 이는 미세 조정 중 발생하는 망각 현상을 크게 줄여줍니다.
- 처음부터 학습(
model=yolo26s-depth.yaml)은 도메인이 매우 다르거나 대규모 데이터셋을 보유한 경우에만 수행하십시오. 이 경우에는 보존할 사전 학습 가중치가 없으므로 기본 SGDlr0=0.01이 적절합니다.
Link to this section깊이 스케일 보정#
깊이 헤드는 형태(상대적인 장면 구조)를 스케일(절대 미터)에서 분리합니다. 모델이 이미 해당 장면에서 좋은 상대적 깊이를 생성하지만 카메라에 대한 절대 값이 맞지 않는다면, model.calibrate()를 통해 몇 초 만에 스케일을 수정할 수 있습니다. 이는 소량의 레이블이 지정된 세트를 대상으로 하는 2-파라미터 로그-아핀(log-affine)의 닫힌 형태(closed-form) 피팅 방식이며, 그라디언트 학습이 없고 네트워크 가중치 변경이 없으므로 상대적 구조를 저하시키지 않습니다.
from ultralytics import YOLO
model = YOLO("yolo26s-depth.pt")
# Fit scale on a labeled split (~100+ images is enough), then persist it
model.calibrate(data="path/to/your_dataset.yaml")
model.save("yolo26s-depth-calibrated.pt")보정에는 피팅을 위한 정답 깊이가 필요하므로 레이블이 지정된 분할에서 실행됩니다. 이는 블라인드 추론 시 수행할 수 있는 작업이 아닙니다. 상대적 깊이는 좋지만 스케일/범위가 잘못된 경우에 사용하십시오. 도메인에 맞게 상대적 구조 자체를 변경해야 한다면 대신 미세 조정을 수행하십시오.
학습 과정에서 자동으로 이 작업이 수행됩니다: model.train(...)이 완료되면 최고 및 마지막 체크포인트가 검증 세트에서 보정되어 즉시 미터 단위로 스케일링된 깊이를 출력합니다.
출시된 yolo26*-depth.pt 체크포인트는 사전 학습 검증 데이터셋에 맞게 이미 보정이 내장되어 있습니다. 이는 모든 도메인에 걸친 단일 전역 스케일이므로, 특정 카메라나 장면 유형에서 가장 정확한 절대 깊이를 얻으려면 자신의 데이터에서 소량의 레이블이 지정된 분할을 사용하여 model.calibrate()를 실행하십시오. 그러면 기존에 내장된 피팅 값이 대체됩니다.
Link to this section데이터셋 형식#
깊이 추정 데이터셋은 각 RGB 이미지를 해당 깊이 파일과 쌍으로 연결합니다. 깊이 타겟은 미터 단위의 float32 값을 포함하는 .npy 배열로 저장됩니다. 데이터셋 YAML은 images/ 디렉토리를 가리키며, 로더는 images 구성 요소를 depth로 바꾸고 이미지 확장자를 .npy로 대체하여 깊이 파일 경로를 유도합니다.
dataset/
├── images/
│ ├── train/
│ └── val/
└── depth/
├── train/
└── val/예를 들어, images/train/scene_001.jpg에 있는 이미지는 depth/train/scene_001.npy에 있는 깊이 맵과 쌍을 이룹니다. 전체 형식 사양은 깊이 추정 데이터셋 가이드를 참조하십시오.
Link to this section검증(Val)#
학습된 YOLO26n-depth 모델 정확도를 깊이 추정 데이터셋에서 검증하십시오. 의도한 데이터셋 YAML을 사용하여 검증이 수행되도록 data를 명시적으로 전달하십시오. 출시된 가중치는 imgsz=768에서 학습되었으므로 최상의 정확도를 위해 해당 크기로 검증 및 예측을 수행하십시오.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Validate the model
metrics = model.val(data="nyu-depth.yaml")
metrics.delta1 # percentage of pixels within threshold δ=1.25
metrics.abs_rel # mean absolute relative error
metrics.rmse # root mean squared error (meters)
metrics.silog # scale-invariant logarithmic errorLink to this section추론(Predict)#
학습된 YOLO26n-depth 모델을 사용하여 이미지에 대한 예측을 실행하십시오.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Predict with the model
results = model("https://ultralytics.com/images/bus.jpg") # predict on an image
# Access the results
for result in results:
depth_map = result.depth.data.cpu().numpy() # torch.Tensor -> NumPy float32, shape (H, W), meters전체 predict 모드 세부 정보는 Predict 페이지를 확인하십시오.
Link to this section결과 출력#
YOLO 깊이 추정은 이미지당 하나의 Results 객체를 반환합니다. 각 결과는 전체 이미지에 대해 하나의 조밀한 float 깊이 맵을 저장합니다.
| 속성 | 유형 | 형태 | 설명 |
|---|---|---|---|
result.depth | DepthMap | (H,W) | 픽셀별 조밀 깊이 맵. |
result.depth.data | torch.Tensor | (H,W) | 미터 단위의 깊이 값; NumPy를 사용하려면 .cpu().numpy()를 호출하십시오. |
result.boxes | - | - | 인스턴스 박스 없음. |
result.masks | - | - | 인스턴스 마스크 없음. |
모든 작업에 걸친 작업별 Results 필드는 작업별 예측 결과 섹션을 참조하십시오.
Link to this section내보내기(Export)#
YOLO26n-depth 모델을 ONNX, CoreML 등과 같은 다른 형식으로 내보내십시오.
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-depth.pt") # load an official model
model = YOLO("path/to/best.pt") # load a custom model
# Export the model
model.export(format="onnx")사용 가능한 YOLO26 깊이 추정 내보내기 형식은 아래 표와 같습니다. format 인수를 사용하여(format='onnx' 또는 format='engine') 모든 형식으로 내보낼 수 있습니다. 내보낸 모델에 대해 직접 예측하거나 검증할 수 있습니다(예: yolo predict model=yolo26n-depth.onnx). 내보내기가 완료되면 모델에 대한 사용 예시가 표시됩니다.
| 형식 | format 인수 | 모델 | 메타데이터 | 인수 |
|---|---|---|---|---|
| PyTorch | - | yolo26n-depth.pt | ✅ | - |
| TorchScript | torchscript | yolo26n-depth.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n-depth.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n-depth_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n-depth.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n-depth.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| TF SavedModel | saved_model | yolo26n-depth_saved_model/ | ✅ | imgsz, keras, quantize, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n-depth.pb | ❌ | imgsz, batch, device |
| TF Edge TPU | edgetpu | yolo26n-depth_edgetpu.tflite | ✅ | imgsz, quantize, data, fraction, device |
| PaddlePaddle | paddle | yolo26n-depth_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n-depth.mnn | ✅ | imgsz, batch, dynamic, quantize, nms, device |
| NCNN | ncnn | yolo26n-depth_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n-depth_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n-depth_rknn_model/ | ✅ | imgsz, batch, name, quantize, data, fraction, device |
| ExecuTorch | executorch | yolo26n-depth_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n-depth_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n-depth_deepx_model/ | ✅ | imgsz, quantize, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n-depth_qnn.onnx | ✅ | imgsz, batch, name, quantize, data, fraction, device |
| LiteRT | litert | yolo26n-depth.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| Hailo | hailo | yolo26n-depth_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou |
전체 export 세부 사항은 Export 페이지에서 확인하십시오.
Link to this sectionFAQ#
Link to this section사용자 지정 데이터셋으로 YOLO26 깊이 추정 모델을 학습하려면 어떻게 해야 합니까?#
쌍을 이루는 RGB 이미지와 .npy 깊이 파일을 준비한 다음, images/ 디렉토리를 가리키는 데이터셋 YAML을 생성하십시오. 로더는 경로에서 images를 depth로 바꾸고 이미지 확장자를 .npy로 교체하여 깊이 파일을 자동으로 찾습니다.
사전 학습된 가중치에서 시작하여 AdamW와 낮은 학습률을 사용함으로써 모델이 이미 학습한 내용을 파인 튜닝 과정에서 유지할 수 있도록 하십시오(그 이유는 자체 데이터에 대한 파인 튜닝을 참조하십시오):
from ultralytics import YOLO
# Load a pretrained YOLO26 depth model
model = YOLO("yolo26s-depth.pt")
# Fine-tune on a custom depth dataset
results = model.train(
data="path/to/your_dataset.yaml",
epochs=20,
imgsz=640,
optimizer="AdamW",
lr0=1e-4,
warmup_bias_lr=1e-4,
)사용 가능한 더 많은 인수를 확인하려면 구성(Configuration) 페이지를 참조하십시오.
Link to this sectionYOLO26 깊이 추정은 어떤 메트릭을 보고합니까?#
깊이 추정 검증은 Depth Anything 및 관련 단안 깊이 연구에서 사용하는 메트릭 세트를 보고합니다:
- delta1 / delta2 / delta3 — 예측된 깊이와 실제(ground-truth) 깊이(또는 그 역수)의 비율이 각각 1.25, 1.25², 1.25³ 미만인 픽셀의 비율입니다. 높을수록 좋습니다.
- abs_rel — 평균 절대 상대 오차입니다. 낮을수록 좋습니다.
- rmse — 미터(m) 단위의 평균 제곱근 오차입니다. 낮을수록 좋습니다.
- silog — 척도 불변 로그 오차입니다. 낮을수록 좋습니다.
각 예측은 이미지별로 실제(ground truth) 값에 중간값 정렬되며, 통계는 검증 세트의 모든 유효한 픽셀에 대해 통합됩니다(유효한 깊이 픽셀이 더 많은 이미지가 비례적으로 더 많이 가중됩니다). 대신 이미지별 메트릭을 평균화하는 논문은 동일한 예측 결과에 대해 약간 다른 값을 보고할 수 있습니다.
Link to this section깊이 맵 출력 형식은 무엇입니까?#
The depth map is stored as a torch.Tensor of shape (H, W) where each value is the predicted depth in meters (use result.depth.data.cpu().numpy() for a NumPy float32 array). Access it through result.depth.data after running prediction. The map is aligned to the input image resolution.
Link to this section깊이 추정을 위해 지원되는 데이터셋은 무엇입니까?#
Ultralytics YOLO26은 NYU Depth V2, KITTI, Hypersim, SUN RGB-D, ARKitScenes를 포함한 여러 깊이 추정 데이터셋에 대한 기본 데이터셋 YAML 구성을 제공합니다. 전체 목록 및 형식 세부 정보는 깊이 추정 데이터셋 가이드를 참조하십시오.
Link to this section사전 학습된 YOLO26 깊이 추정 모델을 어떻게 검증합니까?#
평가에 사용된 데이터셋 YAML을 제공하여 사전 학습된 YOLO26 깊이 모델을 검증하십시오:
from ultralytics import YOLO
# Load a pretrained model
model = YOLO("yolo26n-depth.pt")
# Validate the model
metrics = model.val(data="nyu-depth.yaml")
print("delta1:", metrics.delta1)
print("abs_rel:", metrics.abs_rel)
print("rmse:", metrics.rmse)Link to this sectionYOLO26 깊이 추정 모델을 ONNX 형식으로 어떻게 내보낼 수 있습니까?#
Python 또는 CLI를 사용하여 YOLO26 깊이 모델을 ONNX로 내보내십시오:
from ultralytics import YOLO
# Load a pretrained model
model = YOLO("yolo26n-depth.pt")
# Export the model to ONNX format
model.export(format="onnx")다양한 형식으로 내보내는 방법에 대한 자세한 내용은 내보내기(Export) 페이지를 참조하십시오.