Estimasi kedalaman
Estimasi kedalaman memprediksi seberapa jauh setiap piksel dari kamera menggunakan satu gambar. LibreYOLO mengeksposnya sebagai task kedalaman, yang mengembalikan peta kedalaman invers relatif yang padat di kanvas gambar asli.
Definisi
depth task memprediksi satu nilai per piksel dari satu gambar RGB. LibreYOLO
mendefinisikan nilai itu sebagai kedalaman terbalik relatif: lebih tinggi berarti lebih dekat ke kamera,
dan angka tersebut tidak memiliki satuan metrik dan tidak memiliki skala yang berlaku di antara dua gambar.
Membandingkan kedalaman antara dua piksel dari prediksi yang sama adalah bermakna;
membandingkan suatu nilai dengan nilai dari gambar lain tidak demikian.
Sebuah prediksi mengisi result.depth_map, sebuah muatan DepthMap yang memegang
array (H, W) pada kanvas gambar asli. .min, .max dan .mean membaca
nilai terbatas, dan .normalized() mengubah skala peta ke [0, 1] untuk ditampilkan.
result.boxes tetap kosong, sehingga conf, iou dan max_det tidak berpengaruh,
dan save=True menulis gambar berpeta-warna dari peta tersebut alih-alih foto yang diberi anotasi.
foto.
Model
Family berikut mendukung depth.
Depth Anything V2 memadukan encoder DINOv2 dengan adalah decoder DPT dan merupakan default serba guna di sini. Lisensi menentukan ukuran sama seperti akurasi: checkpoint Kecil adalah Apache-2.0 sedangkan Base dan Besar bersifat non-komersial, jadi periksa tabel checkpoint di halamannya sebelum memilih salah satu.
Depth Anything 3 mengadaptasi DA3MONO-LARGE checkpoint, sebuah transformer biasa tanpa spesialisasi arsitektur untuk kedalaman.
ZipDepth adalah tingkatan kompak: CNN yang dapat direparameterisasi yang didistilasi dari Depth Anything V2 Large, dengan checkpoint kedua yang decodernya menghindari operasi gather dan unfold untuk compiler NPU yang tidak memilikinya.
MiDaS adalah lini penelitian yang menetapkan protokol kedalaman relatif zero-shot untuk mengukur family lain. Checkpoint s dan l diunduh dari mirror LibreYOLO dengan izin MIT dari penerbit.
LibreMODUS mencapai kedalaman sebagai satu target dari
model apa pun ke apa pun daripada sebagai head khusus. Ini membutuhkan modus tambahan dan
akun Hugging Face Anda yang terautentikasi, dan tidak menawarkan val() maupun
export().
SenseNova-Vision menghasilkan peta kedalaman sebagai
gambar melalui dekode difusi, dari checkpoint 7B yang sama yang melayani
enam tugas lainnya. Ini membutuhkan sensenova tambahan, dan bobotnya dibatasi
untuk penggunaan non-komersial; lisensinya ada di halamannya.
Marigold V2 menambahkan adaptor kedalaman berbasis difusi dengan encoding kedalaman eksplisit.
GTR memprediksi kedalaman metrik dan mengembalikannya sebagai
kedalaman invers relatif, sehingga 1 / result.depth_map.data menghasilkan
kembali jarak dalam meter untuk adegan yang mirip dengan data pelatihannya. Model
ini berjalan dengan paket dasar, mendukung pelatihan, dan dapat diekspor ke ONNX
serta TorchScript.
Prediksi
Bobot diunduh saat pertama kali dipakai dan disimpan dalam cache lokal. Halaman model menjelaskan persyaratan autentikasi dan 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) di kanvas asliprint(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 # semakin tinggi semakin dekat; tidak ada satuan metrik, tidak ada skalagray = depth.normalized() # diubah skala ke [0, 1] untuk visualisasiprint(raw.shape, float(gray.max()))from libreyolo import LibreYOLO, SAMPLE_IMAGE # Kontrak task yang sama, jaringan yang jauh lebih kecil dibangun untuk runtime edge.model = LibreYOLO("LibreZipDepthb-depth.pt")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)Resolusi input dibatasi menurut family. Depth Anything V2 dan Depth Anything 3 memakai grid patch DINOv2, sehingga imgsz harus habis dibagi 14, yang diperiksa LibreYOLO sebelum berjalan. Results.plot() merender hasil kedalaman. Lihat prediksi untuk sumber, streaming, dan penanganan hasil.
DepthMap.encoding secara default adalah inverse_depth dan dapat berupa depth atau log_depth. Validasi menafsirkan encoding sebelum penyelarasan affine. Encoding tidak memberikan skala metrik pada prediksi relatif.
Format dataset
Validasi kedalaman memasangkan setiap gambar dengan peta kedalaman saluran tunggal yang padat yang memiliki resolusi yang sama, ditemukan dengan menggantikan direktori kedalaman ke dalam gambar jalur.
dataset/ data.yaml images/ val/room.jpg depths/ val/room.pngpath: datasetval: images/valdepths_dir: depthsnc: 1names: {0: depth}Peta adalah PNG atau TIF saluran tunggal, atau .npy. Nilai adalah kedalaman biasa dalam suatu satuan
dataset tetap konsisten, dan 0, negatif, NaN dan piksel tak hingga ditandai
sampel tidak valid yang dikecualikan dari metrik. Peta bilangan bulat dibagi oleh
depth_scale, yang default ke 256.0, konvensi PNG 16-bit; float
Peta .npy digunakan apa adanya. depth_stem_suffix dan depth_mask_suffix
menutupi dataset yang menamai berkas kedalaman atau mask validitas mereka dengan cara yang berbeda. Lihat
dataset memformat untuk kontrak penuh.
Latih
GTR adalah satu-satunya family kedalaman yang mendukung pelatihan: train() pada checkpoint -depth menjalankan resep upstream-nya, yang dijelaskan di halaman modelnya. Pada family lain, train() menimbulkan NotImplementedError. Setiap halaman model menyebut skrip konversi untuk mengubah checkpoint yang dilatih upstream menjadi format yang dapat dimuat LibreYOLO.
Validasi
val() menjalankan validator kedalaman bersama. Kedalaman relatif tidak memiliki skala absolut,
jadi setiap prediksi pertama-tama disesuaikan dengan invers dari ground truth-nya dengan
skala dan pergeseran kuadrat terkecil per gambar, kemudian dibalik kembali ke kedalaman. Setiap
metrik di bawah dihitung per gambar pada peta yang selaras itu dan dirata-rata di seluruh
dataset, menghitung hanya piksel yang ditandai dataset sebagai valid.
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"]) # kebugaranprint(metrics["metrics/delta2"], metrics["metrics/delta3"])metrics/abs_rel adalah kesalahan relatif absolut rata-rata, residu dibagi dengan
kedalaman ground-truth, dan nilai yang lebih rendah lebih baik. metrics/rmse adalah akar rata-rata
kuadrat kesalahan dalam satuan kedalaman dataset itu sendiri, juga lebih rendah lebih baik.
metrics/delta1, metrics/delta2 dan metrics/delta3 adalah akurasi ambang:
fraksi piksel valid yang rasio terhadap ground truth, diambil dalam
arah manapun yang lebih besar, berada di bawah 1,25, 1,25 kuadrat dan 1,25 pangkat tiga, sehingga
nilai yang lebih tinggi lebih baik. metrics/delta1 juga fitness, jumlah
bacaan pemilihan best-checkpoint.
Ekspor
Model kedalaman yang diekspor dimuat kembali melalui LibreYOLO() berdasarkan akhiran berkas-nya, sehingga
berkas .onnx atau .engine berperilaku seperti checkpoint dan mengembalikan .onnx yang sama,
dengan depth_map menggantikan kotak.
from libreyolo import LibreYOLO model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")model.export(format="onnx")from libreyolo import LibreYOLO, SAMPLE_IMAGE # Pabrik mengarahkan berdasarkan sufiks berkas, sehingga artefak yang diekspor dimuat# seperti checkpoint apa pun dan mengembalikan objek Results yang sama.model = LibreYOLO("LibreDepthAnythingV2s-depth.onnx")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)Cakupan berbeda per family, dan Depth Anything 3 menolak format apa pun di luar set yang divalidasi alih-alih mencoba konversi yang tidak divalidasi. Periksa halaman model dan matriks ekspor penuh sebelum berkomitmen ke target. LibreMODUS dan SenseNova-Vision tidak mengekspor sama sekali. Ekspor mencantumkan argumen yang diterima setiap format.