Ước lượng độ sâu

Ước lượng độ sâu dự đoán khoảng cách từ mỗi pixel đến camera chỉ bằng một ảnh. LibreYOLO cung cấp dưới dạng tác vụ depth, trả về inverse-depth map tương đối dày đặc trên canvas ảnh gốc.

Định nghĩa

Tác vụ depth dự đoán một giá trị trên mỗi pixel từ một ảnh RGB. LibreYOLO định nghĩa giá trị đó là inverse depth tương đối: giá trị cao hơn nghĩa là gần camera hơn, còn các số không mang đơn vị thực và không có tỷ lệ giữ nguyên giữa hai ảnh. So sánh độ sâu giữa hai pixel trong cùng dự đoán có ý nghĩa; so sánh một giá trị với giá trị từ ảnh khác thì không.

Dự đoán điền result.depth_map, một payload DepthMap chứa mảng (H, W) trên canvas ảnh gốc. .min, .max và .mean đọc các giá trị hữu hạn, còn .normalized() đổi tỷ lệ map về [0, 1] để hiển thị. result.boxes luôn rỗng, vì vậy conf, iou và max_det không có tác dụng, còn save=True ghi ảnh đã áp colormap của map thay vì ảnh có chú thích.

Mô hình

Các họ sau phục vụ depth.

Depth Anything V2 ghép encoder DINOv2 với decoder DPT và là lựa chọn mặc định đa dụng tại đây. Giấy phép ảnh hưởng tới việc chọn kích thước nhiều như độ chính xác: checkpoint Small dùng Apache-2.0, còn Base và Large chỉ cho mục đích phi thương mại, vì vậy hãy kiểm tra bảng checkpoint trên trang mô hình trước khi chọn.

Depth Anything 3 port checkpoint DA3MONO-LARGE, một transformer thuần không có chuyên biệt kiến trúc cho độ sâu.

ZipDepth là tầng nhỏ gọn: CNN có thể tái tham số hóa, được chưng cất từ Depth Anything V2 Large, với checkpoint thứ hai có decoder tránh phép toán gather và unfold cho NPU compiler không hỗ trợ chúng.

MiDaS là hướng nghiên cứu thiết lập quy trình độ sâu tương đối zero-shot dùng để đo các họ khác. Checkpoint s và l tải từ bản sao của LibreYOLO theo giấy phép MIT của nhà phát hành.

LibreMODUS thực hiện độ sâu như một target của mô hình any-to-any thay vì head chuyên dụng. Nó cần thành phần bổ sung modus và tài khoản Hugging Face đã xác thực riêng của bạn, đồng thời không cung cấp val() lẫn export().

SenseNova-Vision tạo depth map như một ảnh qua diffusion decode, từ cùng checkpoint 7B phục vụ sáu tác vụ khác. Nó cần thành phần bổ sung sensenova, còn trọng số bị giới hạn cho mục đích phi thương mại; giấy phép nằm trên trang của mô hình.

Marigold V2 bổ sung adapter độ sâu dựa trên diffusion với cách mã hóa độ sâu rõ ràng.

GTR dự đoán độ sâu theo đơn vị thực (metric depth) và trả về kết quả dưới dạng inverse depth tương đối, vì vậy 1 / result.depth_map.data khôi phục độ sâu theo mét cho các cảnh giống dữ liệu huấn luyện của nó. Nó chạy trên package cơ sở, huấn luyện được và xuất sang ONNX cùng TorchScript.

Dự đoán

Trọng số tải về ở lần dùng đầu tiên và được lưu vào bộ nhớ đệm cục bộ. Trang mô hình mô tả yêu cầu xác thực và runtime.

Dự đoán depth map
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")result = model(SAMPLE_IMAGE, save=True) depth = result.depth_mapprint(depth.data.shape)              # (H, W) trên canvas gốcprint(depth.min, depth.max, depth.mean)
Làm việc với các giá trị
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")result = model(SAMPLE_IMAGE) depth = result.depth_mapraw = depth.data          # cao hơn là gần hơn; không đơn vị thực, không tỷ lệgray = depth.normalized() # đổi tỷ lệ về [0, 1] để trực quan hóaprint(raw.shape, float(gray.max()))
Lựa chọn nhỏ gọn
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Cùng hợp đồng tác vụ, mạng nhỏ hơn nhiều dành cho runtime biên.model = LibreYOLO("LibreZipDepthb-depth.pt")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)

Độ phân giải đầu vào bị ràng buộc theo từng họ. Depth Anything V2 và Depth Anything 3 dựa trên lưới patch DINOv2 nên imgsz phải chia hết cho 14; LibreYOLO kiểm tra điều này trước khi chạy. Results.plot() dựng kết quả độ sâu. Xem dự đoán để biết nguồn đầu vào, streaming và cách xử lý kết quả.

DepthMap.encoding mặc định là inverse_depth và có thể là depth hoặc log_depth. Đánh giá diễn giải cách mã hóa trước khi căn chỉnh affine. Cách mã hóa không tạo thang đo theo đơn vị thực cho dự đoán tương đối.

Định dạng dataset

Xác thực độ sâu ghép mỗi ảnh với depth map một kênh dày đặc có cùng độ phân giải, được tìm bằng cách thay thư mục độ sâu vào đường dẫn ảnh.

dataset/  data.yaml  images/    val/room.jpg  depths/    val/room.png
yaml
path: datasetval: images/valdepths_dir: depthsnc: 1names: {0: depth}

Map là PNG hoặc TIF một kênh, hoặc .npy. Giá trị là độ sâu thuần theo đơn vị mà dataset giữ nhất quán, còn pixel 0, âm, NaN và vô cực đánh dấu sample không hợp lệ bị loại khỏi metric. Map số nguyên được chia cho depth_scale, mặc định là 256.0, quy ước PNG 16-bit; map float .npy được dùng nguyên trạng. depth_stem_suffix và depth_mask_suffix hỗ trợ dataset đặt tên tệp độ sâu hoặc mặt nạ hợp lệ theo cách khác. Xem định dạng dataset để biết hợp đồng đầy đủ.

Huấn luyện

GTR là họ độ sâu duy nhất có thể huấn luyện: train() trên một checkpoint -depth chạy quy trình huấn luyện upstream của nó, được mô tả trên trang mô hình. Trên các họ còn lại, train() phát sinh NotImplementedError. Mỗi trang mô hình nêu script chuyển checkpoint được huấn luyện upstream thành định dạng LibreYOLO có thể tải.

Xác thực

val() chạy validator độ sâu dùng chung. Độ sâu tương đối không có tỷ lệ tuyệt đối, vì vậy mỗi dự đoán trước hết được fit vào nghịch đảo ground truth bằng tỷ lệ và độ dịch chuyển least-squares theo từng ảnh, rồi được đảo lại thành độ sâu. Mọi metric bên dưới được tính theo từng ảnh trên map đã căn chỉnh đó và lấy trung bình trên dataset, chỉ tính các pixel được dataset đánh dấu hợp lệ.

Xác thực và đọc các key metric
from libreyolo import LibreYOLO model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/abs_rel"])print(metrics["metrics/rmse"])print(metrics["metrics/delta1"])   # fitnessprint(metrics["metrics/delta2"], metrics["metrics/delta3"])

metrics/abs_rel là sai số tương đối tuyệt đối trung bình, residual chia cho độ sâu ground truth, giá trị thấp hơn là tốt hơn. metrics/rmse là căn bậc hai sai số bình phương trung bình theo đơn vị độ sâu riêng của dataset, cũng thấp hơn là tốt hơn. metrics/delta1, metrics/delta2 và metrics/delta3 là độ chính xác theo ngưỡng: tỷ lệ pixel hợp lệ có tỷ số với ground truth, lấy chiều nào lớn hơn, nằm dưới 1.25, bình phương 1.25 và lập phương 1.25, vì vậy cao hơn là tốt hơn. metrics/delta1 cũng là fitness, con số mà cơ chế chọn checkpoint tốt nhất đọc.

Xuất

Mô hình độ sâu đã xuất được nạp lại qua LibreYOLO() theo hậu tố tệp, vì vậy tệp .onnx hoặc .engine hoạt động như checkpoint và trả về cùng Results, với depth_map thay cho hộp.

Xuất
from libreyolo import LibreYOLO model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")model.export(format="onnx")
Chạy tệp đã xuất
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Factory định tuyến theo hậu tố tệp, vì vậy artifact đã xuất được nạp# như mọi checkpoint khác và trả về cùng một đối tượng Results.model = LibreYOLO("LibreDepthAnythingV2s-depth.onnx")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)

Phạm vi hỗ trợ khác nhau theo family, còn Depth Anything 3 từ chối mọi định dạng ngoài tập đã xác thực thay vì thử chuyển đổi chưa được xác thực. Kiểm tra trang mô hình và ma trận xuất đầy đủ trước khi cam kết target. LibreMODUS và SenseNova-Vision hoàn toàn không xuất được. Phần Xuất liệt kê các đối số mà mọi định dạng chấp nhận.

Đã kiểm chứng với LibreYOLO v1.6.0.