Link to this sectionEstimación de profundidad monocular#
La estimación de profundidad monocular predice un mapa de profundidad por píxel a partir de una única imagen RGB. Cada píxel de salida contiene un valor de profundidad en metros que representa la distancia estimada desde la cámara hasta ese punto de la superficie.
La salida de un modelo de profundidad es un mapa denso de números flotantes con forma (H, W) alineado con la imagen de entrada. Esta representación por píxel hace que la estimación de profundidad monocular sea adecuada para la reconstrucción de escenas 3D, la navegación robótica, la creación de contenido AR/VR y cualquier aplicación que requiera el diseño espacial a partir de una sola cámara.
Usa task=depth o la tarea de CLI yolo depth para la estimación de profundidad monocular. Los archivos del modelo de profundidad YOLO26 usan el sufijo -depth, como yolo26n-depth.pt.
Link to this sectionModelos#
A continuación, se muestran los modelos de profundidad YOLO26 preentrenados en una amplia combinación de múltiples conjuntos de datos (interiores + exteriores, ~2,19 M de imágenes). Las columnas de métricas se reportan en la división de prueba Eigen de NYU Depth V2.
Los modelos se descargan automáticamente desde la última versión de Ultralytics al utilizarlos por primera vez.
| Modelo | tamaño (píxeles) | delta1NYU | abs_relNYU | rmseNYU | params (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 es el porcentaje de píxeles donde la profundidad predicha está dentro de un factor de 1,25 respecto a la verdad fundamental, en la división de prueba Eigen de NYU Depth V2 (654 imágenes) con TTA de escala múltiple + volteo horizontal y alineación log-least-squares.
- La precisión de una sola escala sin TTA es reproducible con
yolo depth val model=yolo26n-depth.pt data=nyu-depth.yaml imgsz=768 device=0(sustituyemodel=para cada tamaño), que utiliza alineación mediana (solo escala) y obtiene puntuaciones más bajas: delta1 0,785 (n), 0,786 (s), 0,827 (m), 0,839 (l), 0,843 (x). - abs_rel es el error relativo absoluto medio entre los valores de profundidad predichos y los de la verdad fundamental.
- rmse es el error cuadrático medio en metros.
- params y FLOPs se miden a 768×768, la resolución de entrenamiento de los pesos publicados.
Link to this sectionRango de profundidad y la cabecera log-depth#
La cabecera de profundidad predice exp(logit) — sin límites (~0,02–150 m) — y desacopla la forma de la escena de la escala absoluta: la red predice un campo de profundidad logarítmica relativa, y los metros absolutos se establecen mediante una transformación separada de dos parámetros (exp(a·log d + b)) recuperada en la evaluación, mediante una calibración ligera o mediante ajuste fino. La alternativa común, una cabecera delimitada sigmoid × max_depth, impone en cambio un límite fijo en la arquitectura, por lo que cualquier profundidad más allá de max_depth se recorta, lo que impide entrenar y predecir escenas de mayor alcance.
Link to this sectionPor qué la cabecera no tiene límites: evidencia en todos los rangos de profundidad#
A/B controlado: mismos datos, mismo cronograma, solo cambia la cabecera. Entrenar ambas cabeceras desde cero con una combinación idéntica de datos de interiores (≤10 m) y exteriores (≤80 m):
| Cabezal | Rango de salida | Val δ1 de rango mixto | Comportamiento del entrenamiento |
|---|---|---|---|
sigmoid × max_depth (10 m) | limitado 0–10 m | 0,221 | se estabiliza en la época 1 |
log (sin límites) | 0–~150 m | 0,367 (+66%) | mejora continuamente |
La cabecera delimitada no puede representar la mayoría de los píxeles de exteriores (>10 m), por lo que deja de mejorar casi de inmediato; la cabecera log aprende de todo el rango.
El modo de fallo que soluciona: ajuste fino de un solo conjunto de datos, estratificado por rango. Ajustar una cabecera delimitada (10 m) en conjuntos de datos individuales funciona cuando los datos se ajustan al límite y colapsa cuando lo exceden:
| Conjunto de datos | Rango de profundidad | δ1 de cabecera limitada |
|---|---|---|
| SUN RGB-D | ≤10 m | 0,78 ✅ |
| Hypersim | principalmente ≤10 m | 0,74 ✅ |
| KITTI | ~80 m | 0,08 ❌ (abs_rel ≈ 7,0 — la discrepancia de escala 80/10) |
| vKITTI2 | 80 m | 0,04 ❌ |
El colapso ocurre exactamente en el límite. La cabecera log no tiene tal límite.
Modelos publicados: rendimiento en todos los rangos. La familia de cabecera log distribuida, evaluada en puntos de referencia que abarcan desde 10 m (NYU, iBims-1) hasta 80 m (KITTI), con δ1 alineado por escala:
| Evaluación comparativa (Benchmark) | Rango | YOLO26x-depth (log) | lanzamiento anterior limitado |
|---|---|---|---|
| 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 |
| Media | — | 0,819 | 0,799 |
Las mayores ganancias se obtienen en los puntos de referencia de exteriores de mayor rango (KITTI, ETH3D) — exactamente donde un límite fijo de 10 m perjudica más — mientras que el rendimiento en interiores se conserva.
Link to this sectionEntrenar#
Entrena YOLO26n-depth en el conjunto de datos Depth8 durante 100 epochs con un tamaño de imagen de 640. Para obtener una lista completa de los argumentos disponibles, consulta la página de Configuración.
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)Consulta los detalles completos del modo train en la página de Entrenamiento.
Link to this sectionAjuste fino con tus propios datos#
Al adaptar un modelo de profundidad preentrenado a un conjunto de datos personalizado, reduce la tasa de aprendizaje y usa el optimizador AdamW. La configuración predeterminada del optimizador está ajustada para el entrenamiento desde cero (SGD con lr0=0.01); aplicada a un modelo de profundidad que ya ha convergido, puede sobrescribir el conocimiento preentrenado y degradar los resultados, especialmente cuando se realiza un ajuste fino en un solo dominio.
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
)Consejos adicionales:
- La aumentación se controla mediante los argumentos estándar (
degrees,translate,scale,shear,perspective,flipud,fliplr,hsv_h,hsv_s,hsv_v); la deformación geométrica y los volteos se aplican de forma idéntica al mapa de profundidad emparejado. Para ver la receta exacta utilizada para los pesos de YOLO26-Depth publicados, inspecciona lostrain_argsalmacenados en el punto de control: consulta Inspección de los argumentos de entrenamiento del punto de control de YOLO26. mosaic,mixup,cutmixycopy_pasteno están implementados para la profundidad. El cargador de conjuntos de datos de profundidad establece automáticamente estas probabilidades en 0, por lo que pasarlas no tiene efecto. Estas aumentaciones no son compatibles porque combinan múltiples imágenes, lo que produciría mapas de profundidad emparejados no válidos.- Cualquier rango de profundidad funciona sin configuración adicional. Los modelos con cabecera
logpredicen profundidad sin límites, por lo que se adaptan a datos de corto alcance (macro) o largo alcance (exteriores/conducción) sin cambios. Establecermax_depth:en tu YAML de conjunto de datos (en metros) limita qué píxeles de GT cuentan para las métricas de validación. - Mantén el rendimiento general. Si necesitas que el modelo siga siendo preciso en escenas más allá de tu conjunto de entrenamiento, mezcla una pequeña fracción (~5–10%) de imágenes diversas de propósito general en tus datos de entrenamiento; esto reduce sustancialmente el olvido durante el ajuste fino.
- Entrena desde cero (
model=yolo26s-depth.yaml) solo si tu dominio es muy diferente y tienes un conjunto de datos grande; en ese caso, el SGD predeterminadolr0=0.01es apropiado, ya que no hay pesos preentrenados que conservar.
Link to this sectionCalibración de la escala de profundidad#
La cabecera de profundidad separa la forma (estructura relativa de la escena) de la escala (metros absolutos). Si un modelo ya produce una buena profundidad relativa en tus escenas pero los valores absolutos no son correctos para tu cámara, puedes corregir la escala en segundos con model.calibrate() — un ajuste de forma cerrada de una log-afín de dos parámetros contra un pequeño conjunto etiquetado, sin entrenamiento de gradiente y sin cambios en los pesos de la red, por lo que no puede degradar la estructura relativa.
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")La calibración necesita una profundidad de verdad fundamental contra la cual ajustarse, por lo que se ejecuta en una división etiquetada; no es algo que pueda ocurrir en una inferencia ciega. Úsala cuando la profundidad relativa ya sea buena y solo la escala/rango sea incorrecto; si la estructura relativa misma necesita cambiar para tu dominio, ajusta finamente en su lugar.
El entrenamiento hace esto por ti automáticamente: una vez que model.train(...) se completa, los puntos de control mejores y últimos se calibran en el conjunto de validación para que emitan profundidad a escala métrica sin configuración adicional.
Los puntos de control yolo26*-depth.pt publicados se envían con esta calibración ya integrada, ajustada en la combinación de validación de preentrenamiento. Es una escala global única en todos los dominios, por lo que para obtener la profundidad absoluta más precisa en una cámara o tipo de escena específico, ejecuta model.calibrate() en una pequeña división etiquetada de tus propios datos; esto reemplaza el ajuste integrado.
Link to this sectionFormato del conjunto de datos#
Los conjuntos de datos de estimación de profundidad emparejan cada imagen RGB con un archivo de profundidad correspondiente. Los objetivos de profundidad se almacenan como matrices .npy que contienen valores float32 en metros. El YAML del conjunto de datos apunta a un directorio images/; el cargador deriva la ruta del archivo de profundidad reemplazando el componente images con depth y reemplazando la extensión de la imagen con .npy.
dataset/
├── images/
│ ├── train/
│ └── val/
└── depth/
├── train/
└── val/Por ejemplo, una imagen en images/train/scene_001.jpg se empareja con un mapa de profundidad en depth/train/scene_001.npy. Consulta la Guía de conjuntos de datos de estimación de profundidad para conocer la especificación completa del formato.
Link to this sectionValidar#
Valida la precisión de un modelo YOLO26n-depth entrenado en un conjunto de datos de estimación de profundidad. Pasa data explícitamente para que la validación utilice el YAML del conjunto de datos previsto. Los pesos publicados están entrenados a imgsz=768, así que valida y predice a ese tamaño para obtener la mejor precisión.
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 sectionPredecir#
Usa un modelo YOLO26n-depth entrenado para ejecutar predicciones en imágenes.
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), metersConsulta todos los detalles del modo predict en la página Predecir.
Link to this sectionResultado de la salida#
La estimación de profundidad YOLO devuelve un objeto Results por imagen. Cada resultado almacena un mapa de profundidad de flotante denso para toda la imagen.
| Atributo | Tipo | Forma | Descripción |
|---|---|---|---|
result.depth | DepthMap | (H,W) | Mapa de profundidad denso por píxel. |
result.depth.data | torch.Tensor | (H,W) | Valores de profundidad en metros; llama a .cpu().numpy() para obtener un NumPy. |
result.boxes | - | - | Sin cuadros de instancia. |
result.masks | - | - | Sin máscaras de instancia. |
Para ver los campos de Results específicos de cada tarea, consulta la sección Resultados de predicción por tarea.
Link to this sectionExportar#
Exporta un modelo YOLO26n-depth a un formato diferente como ONNX, CoreML, etc.
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")Los formatos de exportación de estimación de profundidad YOLO26 disponibles están en la tabla a continuación. Puedes exportar a cualquier formato usando el argumento format, es decir, format='onnx' o format='engine'. Puedes predecir o validar directamente en modelos exportados, es decir, yolo predict model=yolo26n-depth.onnx. Se muestran ejemplos de uso para tu modelo una vez que se completa la exportación.
| Formato | Argumento format | Modelo | Metadatos | Argumentos |
|---|---|---|---|---|
| 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 |
Consulta los detalles completos de export en la página Export.
Link to this sectionFAQ#
Link to this section¿Cómo entreno un modelo de estimación de profundidad YOLO26 en un conjunto de datos personalizado?#
Prepara imágenes RGB emparejadas y archivos de profundidad .npy, luego crea un YAML de conjunto de datos que apunte a tu directorio images/. El cargador encuentra los archivos de profundidad automáticamente sustituyendo images por depth en la ruta y cambiando la extensión de la imagen por .npy.
Empieza a partir de pesos preentrenados y utiliza una tasa de aprendizaje baja con AdamW para que el ajuste fino retenga lo que el modelo ya conoce (consulta Fine-tuning on your own data para saber por qué):
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,
)Consulta la página de Configuración para ver más argumentos disponibles.
Link to this section¿Qué métricas reporta la estimación de profundidad de YOLO26?#
La validación de la estimación de profundidad reporta el conjunto de métricas utilizado por Depth Anything y trabajos relacionados con la profundidad monocular:
- delta1 / delta2 / delta3 — porcentaje de píxeles donde la relación entre la profundidad predicha y la real (o su inversa) es inferior a 1,25, 1,25² y 1,25³ respectivamente. Cuanto más alto, mejor.
- abs_rel — error absoluto medio relativo. Cuanto más bajo, mejor.
- rmse — error cuadrático medio en metros. Cuanto más bajo, mejor.
- silog — error logarítmico invariante a la escala. Cuanto más bajo, mejor.
Cada predicción está alineada a la mediana respecto a su valor real por imagen, y las estadísticas se agrupan sobre cada píxel válido del conjunto de validación (las imágenes con más píxeles de profundidad válidos pesan proporcionalmente más). Los trabajos que promedian las métricas por imagen pueden reportar valores ligeramente diferentes en las mismas predicciones.
Link to this section¿Cuál es el formato de salida del mapa de profundidad?#
El mapa de profundidad se almacena como un torch.Tensor de forma (H, W) donde cada valor es la profundidad predicha en metros (utiliza result.depth.data.cpu().numpy() para obtener un array float32 de NumPy). Accede a él a través de result.depth.data tras ejecutar la predicción. El mapa está alineado con la resolución de la imagen de entrada.
Link to this section¿Qué conjuntos de datos son compatibles con la estimación de profundidad?#
Ultralytics YOLO26 ofrece configuraciones YAML de conjuntos de datos integradas para varios conjuntos de datos de estimación de profundidad, incluyendo NYU Depth V2, KITTI, Hypersim, SUN RGB-D y ARKitScenes. Consulta la Depth Estimation Dataset Guide para ver la lista completa y los detalles de formato.
Link to this section¿Cómo valido un modelo de estimación de profundidad YOLO26 preentrenado?#
Valida un modelo de profundidad YOLO26 preentrenado proporcionando el YAML del conjunto de datos utilizado para la evaluación:
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 section¿Cómo puedo exportar un modelo de estimación de profundidad YOLO26 al formato ONNX?#
Exporta un modelo de profundidad YOLO26 a ONNX con Python o CLI:
from ultralytics import YOLO
# Load a pretrained model
model = YOLO("yolo26n-depth.pt")
# Export the model to ONNX format
model.export(format="onnx")Para obtener más detalles sobre la exportación a varios formatos, consulta la página de Exportación.