Ướ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.
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)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()))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.pngpath: 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ệ.
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.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")model.export(format="onnx")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.