Link to this sectionƯớc tính độ sâu đơn thị (Monocular Depth Estimation)#
Ước tính độ sâu đơn thị dự đoán bản đồ độ sâu trên từng pixel từ một ảnh RGB duy nhất. Mỗi pixel đầu ra chứa một giá trị độ sâu tính bằng mét, thể hiện khoảng cách ước tính từ camera đến điểm bề mặt đó.
Đầu ra của một model độ sâu là một bản đồ số thực dày đặc với shape (H, W) căn chỉnh theo ảnh đầu vào. Cách biểu diễn trên từng pixel này giúp ước tính độ sâu đơn thị rất phù hợp cho tái dựng cảnh 3D, điều hướng robot, tạo nội dung AR/VR và bất kỳ ứng dụng nào yêu cầu bố cục không gian từ một camera duy nhất.
Sử dụng task=depth hoặc tác vụ CLI yolo depth cho ước tính độ sâu đơn thị. Các tệp model độ sâu YOLO26 sử dụng hậu tố -depth, ví dụ như yolo26n-depth.pt.
Link to this sectionModel#
Các model độ sâu YOLO26 được tiền huấn luyện trên một tập hợp đa dữ liệu rộng lớn (trong nhà + ngoài trời, ~2,19 triệu ảnh) được trình bày dưới đây. Các cột chỉ số được báo cáo trên tập kiểm thử Eigen của NYU Depth V2.
Các Models sẽ tự động tải xuống từ release mới nhất của Ultralytics ngay lần đầu sử dụng.
| Mô hình | kích thước (pixel) | 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 là tỷ lệ phần trăm các pixel mà độ sâu dự đoán nằm trong khoảng hệ số 1,25 so với ground truth, trên tập kiểm thử Eigen của NYU Depth V2 (654 ảnh) với TTA đa quy mô + lật ngang và căn chỉnh log-least-squares.
- Độ chính xác đơn quy mô không có TTA có thể tái lập với
yolo depth val model=yolo26n-depth.pt data=nyu-depth.yaml imgsz=768 device=0(thay thếmodel=cho mỗi kích thước), sử dụng căn chỉnh trung vị (chỉ quy mô) và có điểm thấp hơn: delta1 0,785 (n), 0,786 (s), 0,827 (m), 0,839 (l), 0,843 (x). - abs_rel là sai số tương đối tuyệt đối trung bình giữa giá trị độ sâu dự đoán và ground-truth.
- rmse là sai số căn bậc hai trung bình tính bằng mét.
- params và FLOPs được đo ở độ phân giải 768×768, độ phân giải huấn luyện của các trọng số đã phát hành.
Link to this sectionPhạm vi độ sâu và phần đầu log-depth#
Phần đầu độ sâu dự đoán exp(logit) — không bị giới hạn (~0,02–150 m) — và tách biệt hình dạng cảnh khỏi thang đo tuyệt đối: mạng lưới dự đoán một trường log-depth tương đối, và các mét tuyệt đối được thiết lập bởi một phép biến đổi hai tham số riêng biệt (exp(a·log d + b)) được khôi phục khi đánh giá, bằng cách hiệu chuẩn nhẹ hoặc tinh chỉnh. Giải pháp thay thế phổ biến, một phần đầu sigmoid × max_depth bị giới hạn, thay vào đó tạo ra một ngưỡng trần cố định vào kiến trúc, vì vậy bất kỳ độ sâu nào vượt quá max_depth đều bị cắt — điều này ngăn cản việc huấn luyện và dự đoán trên các cảnh có phạm vi dài hơn.
Link to this sectionTại sao phần đầu lại không bị giới hạn: bằng chứng qua các phạm vi độ sâu#
A/B có kiểm soát — cùng dữ liệu, cùng lịch trình, chỉ khác phần đầu. Huấn luyện cả hai phần đầu từ đầu trên cùng một hỗn hợp dữ liệu trong nhà (≤10 m) và ngoài trời (≤80 m):
| Head | Phạm vi đầu ra | Val δ1 phạm vi hỗn hợp | Hành vi huấn luyện |
|---|---|---|---|
sigmoid × max_depth (10 m) | bị giới hạn 0–10 m | 0,221 | bão hòa ở epoch 1 |
log (không bị giới hạn) | 0–~150 m | 0,367 (+66%) | cải thiện xuyên suốt |
Phần đầu bị giới hạn không thể đại diện cho phần lớn (>10 m) các pixel ngoài trời, vì vậy nó ngừng cải thiện gần như ngay lập tức; phần đầu log học từ toàn bộ phạm vi.
Chế độ lỗi mà nó khắc phục — tinh chỉnh trên một tập dữ liệu, phân tầng theo phạm vi. Tinh chỉnh một phần đầu bị giới hạn (10 m) trên các tập dữ liệu riêng lẻ hoạt động khi dữ liệu phù hợp với giới hạn và bị sụp đổ khi vượt quá nó:
| Tập dữ liệu (Dataset) | Phạm vi độ sâu | δ1 phần đầu bị giới hạn |
|---|---|---|
| SUN RGB-D | ≤10 m | 0,78 ✅ |
| Hypersim | hầu hết ≤10 m | 0,74 ✅ |
| KITTI | ~80 m | 0,08 ❌ (abs_rel ≈ 7,0 — sự sai lệch thang đo 80/10) |
| vKITTI2 | 80 m | 0,04 ❌ |
Sự sụp đổ xảy ra chính xác tại ranh giới giới hạn. Phần đầu log không có ranh giới như vậy.
Các model đã phát hành — hiệu suất xuyên phạm vi. Họ model log-head được phát hành, đánh giá trên các tiêu chuẩn kéo dài từ 10 m (NYU, iBims-1) đến 80 m (KITTI), với δ1 căn chỉnh theo thang đo:
| Đánh giá hiệu năng (Benchmark) | Phạm vi | YOLO26x-depth (log) | bản phát hành bị giới hạn trước đó |
|---|---|---|---|
| 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 |
| Trung bình | — | 0,819 | 0,799 |
Những cải thiện lớn nhất nằm ở các tiêu chuẩn ngoài trời phạm vi dài (KITTI, ETH3D) — chính xác nơi giới hạn 10 m cố định gây hại nhiều nhất — trong khi hiệu suất trong nhà vẫn được duy trì.
Link to this sectionHuấn luyện (Train)#
Huấn luyện YOLO26n-depth trên tập dữ liệu Depth8 trong 100 epochs ở kích thước ảnh 640. Để có danh sách đầy đủ các đối số khả dụng, xem trang Cấu hình.
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)Xem chi tiết đầy đủ về chế độ train trong trang Huấn luyện.
Link to this sectionTinh chỉnh trên dữ liệu của riêng bạn#
Khi điều chỉnh một model độ sâu đã tiền huấn luyện cho một tập dữ liệu tùy chỉnh, hãy giảm tốc độ học (learning rate) và sử dụng bộ tối ưu hóa AdamW. Các cài đặt bộ tối ưu hóa mặc định được điều chỉnh để huấn luyện từ đầu (SGD với lr0=0.01); khi áp dụng cho một model độ sâu đã hội tụ, chúng có thể ghi đè lên kiến thức tiền huấn luyện và làm giảm kết quả — đặc biệt là khi tinh chỉnh trên một domain duy nhất.
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
)Mẹo bổ sung:
- Augmentation được kiểm soát bởi các đối số tiêu chuẩn (
degrees,translate,scale,shear,perspective,flipud,fliplr,hsv_h,hsv_s,hsv_v); biến dạng hình học và lật được áp dụng giống hệt nhau cho bản đồ độ sâu cặp. Để xem công thức chính xác được sử dụng cho các trọng số YOLO26-Depth đã phát hành, hãy kiểm tratrain_argsđược lưu trữ trong checkpoint — xem Kiểm tra Args Huấn luyện Checkpoint YOLO26. mosaic,mixup,cutmixvàcopy_pastekhông được triển khai cho độ sâu. Trình tải tập dữ liệu độ sâu tự động đặt các xác suất này về 0, vì vậy việc truyền chúng không có tác dụng. Các augmentation này không được hỗ trợ vì chúng kết hợp nhiều ảnh, điều này sẽ tạo ra các bản đồ độ sâu cặp không hợp lệ.- Mọi phạm vi độ sâu đều hoạt động ngay lập tức. Các model
log-head dự đoán độ sâu không giới hạn, vì vậy chúng thích ứng với dữ liệu phạm vi ngắn (macro) hoặc phạm vi dài (ngoài trời/lái xe) mà không cần thay đổi. Việc thiết lậpmax_depth:trong YAML tập dữ liệu của bạn (tính bằng mét) sẽ giới hạn các pixel GT được tính vào chỉ số đánh giá. - Duy trì hiệu suất chung. Nếu bạn cần model giữ độ chính xác trên các cảnh ngoài tập huấn luyện của bạn, hãy trộn một phần nhỏ (~5–10%) ảnh đa mục đích vào dữ liệu huấn luyện của bạn; điều này làm giảm đáng kể sự quên lãng trong quá trình tinh chỉnh.
- Huấn luyện từ đầu (
model=yolo26s-depth.yaml) chỉ khi domain của bạn rất khác biệt và bạn có một tập dữ liệu lớn — ở đó SGD mặc địnhlr0=0.01là phù hợp, vì không có trọng số tiền huấn luyện nào để bảo tồn.
Link to this sectionHiệu chuẩn thang đo độ sâu#
Phần đầu độ sâu tách biệt hình dạng (cấu trúc cảnh tương đối) khỏi thang đo (mét tuyệt đối). Nếu một model đã tạo ra độ sâu tương đối tốt trên các cảnh của bạn nhưng các giá trị tuyệt đối bị sai đối với camera của bạn, bạn có thể sửa thang đo trong vài giây với model.calibrate() — một khớp kín của biến đổi log-affine hai tham số so với một tập được gắn nhãn nhỏ, với không huấn luyện gradient và không thay đổi trọng số mạng, vì vậy nó không thể làm suy giảm cấu trúc tương đối.
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")Hiệu chuẩn cần độ sâu ground-truth để khớp, vì vậy nó chạy trên một tập được gắn nhãn — đó không phải là thứ có thể xảy ra khi suy luận mù. Sử dụng nó khi độ sâu tương đối đã tốt và chỉ sai thang đo/phạm vi; nếu chính cấu trúc tương đối cần thay đổi cho domain của bạn, hãy tinh chỉnh thay thế.
Huấn luyện tự động thực hiện việc này cho bạn: sau khi model.train(...) hoàn tất, các checkpoint tốt nhất và cuối cùng được hiệu chuẩn trên tập xác thực để chúng xuất ra độ sâu theo thang đo mét ngay lập tức.
Các checkpoint yolo26*-depth.pt được phát hành đi kèm với hiệu chuẩn này đã được tích hợp sẵn, khớp trên hỗn hợp xác thực tiền huấn luyện. Đây là một thang đo toàn cầu duy nhất trên tất cả các domain, vì vậy để có độ sâu tuyệt đối chính xác nhất trên một camera hoặc loại cảnh cụ thể, hãy chạy model.calibrate() trên một tập được gắn nhãn nhỏ từ dữ liệu của riêng bạn — nó sẽ thay thế khớp đã tích hợp sẵn.
Link to this sectionĐịnh dạng tập dữ liệu#
Các tập dữ liệu ước tính độ sâu ghép mỗi ảnh RGB với một tệp độ sâu tương ứng. Các mục tiêu độ sâu được lưu trữ dưới dạng mảng .npy chứa các giá trị float32 tính bằng mét. YAML tập dữ liệu trỏ đến thư mục images/; trình tải suy ra đường dẫn tệp độ sâu bằng cách thay thế thành phần images bằng depth và thay thế phần mở rộng ảnh bằng .npy.
dataset/
├── images/
│ ├── train/
│ └── val/
└── depth/
├── train/
└── val/Ví dụ, một ảnh tại images/train/scene_001.jpg được ghép với bản đồ độ sâu tại depth/train/scene_001.npy. Xem Hướng dẫn Tập dữ liệu Ước tính Độ sâu để biết thông số kỹ thuật định dạng đầy đủ.
Link to this sectionVal#
Xác thực độ chính xác của model YOLO26n-depth đã huấn luyện trên một tập dữ liệu ước tính độ sâu. Truyền data một cách rõ ràng để quá trình xác thực sử dụng YAML tập dữ liệu dự định. Các trọng số được phát hành được huấn luyện ở imgsz=768, vì vậy hãy xác thực và dự đoán ở kích thước đó để có độ chính xác tốt nhất.
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 sectionDự đoán (Predict)#
Sử dụng model YOLO26n-depth đã huấn luyện để chạy dự đoán trên các ảnh.
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), metersXem chi tiết đầy đủ về chế độ predict trong trang Dự đoán.
Link to this sectionĐầu ra kết quả#
Ước tính độ sâu YOLO trả về một đối tượng Results cho mỗi ảnh. Mỗi kết quả lưu trữ một bản đồ độ sâu số thực dày đặc cho toàn bộ ảnh.
| Thuộc tính | Loại | Kích thước | Mô tả |
|---|---|---|---|
result.depth | DepthMap | (H,W) | Bản đồ độ sâu dày đặc trên từng pixel. |
result.depth.data | torch.Tensor | (H,W) | Các giá trị độ sâu tính bằng mét; gọi .cpu().numpy() cho NumPy. |
result.boxes | - | - | Không có hộp instance. |
result.masks | - | - | Không có mask thực thể. |
Để biết các trường Results cụ thể cho từng tác vụ, hãy xem phần Dự đoán kết quả theo tác vụ.
Link to this sectionXuất (Export)#
Xuất model YOLO26n-depth sang một định dạng khác như ONNX, CoreML, v.v.
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")Các định dạng xuất ước tính độ sâu YOLO26 khả dụng có trong bảng dưới đây. Bạn có thể xuất sang bất kỳ định dạng nào bằng cách sử dụng đối số format, ví dụ: format='onnx' hoặc format='engine'. Bạn có thể dự đoán hoặc xác thực trực tiếp trên các model đã xuất, ví dụ: yolo predict model=yolo26n-depth.onnx. Các ví dụ sử dụng được hiển thị cho model của bạn sau khi quá trình xuất hoàn tất.
| Định dạng | Tham số format | Mô hình | Metadata | Tham số |
|---|---|---|---|---|
| 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 |
Xem chi tiết export đầy đủ trong trang Export.
Link to this sectionCâu hỏi thường gặp#
Link to this sectionLàm cách nào để huấn luyện một mô hình ước tính chiều sâu YOLO26 trên tập dữ liệu tùy chỉnh?#
Chuẩn bị các cặp ảnh RGB và tệp chiều sâu .npy, sau đó tạo một tệp YAML tập dữ liệu trỏ tới thư mục images/ của bạn. Bộ tải sẽ tự động tìm các tệp chiều sâu bằng cách thay thế images bằng depth trong đường dẫn và thay thế phần mở rộng của ảnh bằng .npy.
Bắt đầu từ trọng số tiền huấn luyện (pretrained) và sử dụng tốc độ học (learning rate) thấp với AdamW để quá trình tinh chỉnh (fine-tune) giữ lại những gì mô hình đã biết (xem Fine-tuning on your own data để biết lý do):
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,
)Kiểm tra trang Configuration để biết thêm các tham số khả dụng.
Link to this sectionYOLO26 ước tính chiều sâu báo cáo những chỉ số nào?#
Quá trình xác thực (validation) ước tính chiều sâu báo cáo bộ chỉ số được sử dụng bởi Depth Anything và các nghiên cứu về chiều sâu đơn ảnh (monocular-depth) liên quan:
- delta1 / delta2 / delta3 — tỷ lệ phần trăm pixel mà tỷ lệ giữa chiều sâu dự đoán và chiều sâu thực tế (hoặc nghịch đảo của nó) lần lượt nhỏ hơn 1.25, 1.25², và 1.25³. Chỉ số càng cao càng tốt.
- abs_rel — sai số tuyệt đối trung bình. Chỉ số càng thấp càng tốt.
- rmse — sai số bình phương trung bình gốc tính bằng mét. Chỉ số càng thấp càng tốt.
- silog — sai số logarit bất biến tỷ lệ. Chỉ số càng thấp càng tốt.
Mỗi dự đoán được căn chỉnh theo giá trị trung vị với giá trị thực tế trên mỗi ảnh, và các thống kê sau đó được tổng hợp trên mọi pixel hợp lệ của tập xác thực (các ảnh có nhiều pixel chiều sâu hợp lệ hơn sẽ có trọng số cao hơn tương ứng). Các bài báo nghiên cứu thay vì lấy trung bình các chỉ số trên mỗi ảnh có thể báo cáo các giá trị khác biệt nhẹ trên cùng các dự đoán.
Link to this sectionĐịnh dạng đầu ra của bản đồ chiều sâu (depth map) là gì?#
Bản đồ chiều sâu được lưu trữ dưới dạng torch.Tensor với kích thước (H, W) trong đó mỗi giá trị là chiều sâu dự đoán tính bằng mét (sử dụng result.depth.data.cpu().numpy() để lấy mảng NumPy float32). Truy cập nó thông qua result.depth.data sau khi chạy dự đoán. Bản đồ này được căn chỉnh theo độ phân giải của ảnh đầu vào.
Link to this sectionNhững tập dữ liệu nào được hỗ trợ cho việc ước tính chiều sâu?#
Ultralytics YOLO26 cung cấp các cấu hình YAML tập dữ liệu tích hợp sẵn cho một số tập dữ liệu ước tính chiều sâu bao gồm NYU Depth V2, KITTI, Hypersim, SUN RGB-D và ARKitScenes. Xem Hướng dẫn về Tập dữ liệu Ước tính Chiều sâu để biết danh sách đầy đủ và chi tiết định dạng.
Link to this sectionLàm cách nào để xác thực một mô hình ước tính chiều sâu YOLO26 đã được tiền huấn luyện?#
Xác thực một mô hình chiều sâu YOLO26 đã được tiền huấn luyện bằng cách cung cấp tệp YAML tập dữ liệu được sử dụng để đánh giá:
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 sectionLàm cách nào tôi có thể xuất (export) một mô hình ước tính chiều sâu YOLO26 sang định dạng ONNX?#
Xuất mô hình chiều sâu YOLO26 sang ONNX bằng Python hoặc CLI:
from ultralytics import YOLO
# Load a pretrained model
model = YOLO("yolo26n-depth.pt")
# Export the model to ONNX format
model.export(format="onnx")Để biết thêm chi tiết về việc xuất sang các định dạng khác nhau, hãy tham khảo trang Export.