Переглянути як Markdown

Оцінювання глибини

Оцінювання глибини передбачає відстань кожного пікселя до камери за одним зображенням. LibreYOLO надає його як задачу depth, що повертає щільну карту відносної оберненої глибини на полотні початкового зображення.

Визначення

Задача depth передбачає одне значення для кожного пікселя одного зображення RGB. LibreYOLO визначає його як відносну обернену глибину: вище значення означає меншу відстань до камери, а числа не мають метричної одиниці чи масштабу, спільного для двох зображень. Порівнювати глибину між двома пікселями одного передбачення змістовно, а зі значенням з іншого зображення ні.

Передбачення заповнює result.depth_map, об'єкт даних DepthMap із масивом у формі (H, W) на полотні початкового зображення. .min, .max і .mean читають скінченні значення, а .normalized() перемасштабує карту до [0, 1] для показу. Поле result.boxes залишається порожнім, тому conf, iou і max_det не мають впливу, а save=True записує карту з колірною шкалою замість анотованої фотографії.

Моделі

Наведені нижче сімейства підтримують depth.

Depth Anything V2 поєднує кодувальник DINOv2 із декодером DPT і є тут типовим універсальним варіантом. Ліцензування впливає на вибір розміру не менше за правильність: контрольна точка Small має ліцензію Apache-2.0, тоді як Base і Large не дозволяють комерційне використання, тому перед вибором перевірте таблицю контрольних точок на сторінці моделі.

Depth Anything 3 портує контрольну точку DA3MONO-LARGE, звичайний трансформер без архітектурної спеціалізації для глибини.

ZipDepth є компактним рівнем: репараметризована CNN, дистильована з Depth Anything V2 Large, з другою контрольною точкою, декодер якої не використовує операції gather та unfold для компіляторів NPU без їх підтримки.

MiDaS започаткувала протокол відносної глибини без навчальних прикладів, за яким оцінюють інші сімейства. Її контрольні точки s і l завантажуються з дзеркал LibreYOLO за дозволом MIT від видавця.

LibreMODUS отримує глибину як одну з цілей моделі перетворення довільної модальності на довільну, а не через спеціалізовану голову. Для нього потрібний набір modus і ваш автентифікований обліковий запис Hugging Face; він не підтримує ні val(), ні export().

SenseNova-Vision створює карту глибини як зображення через дифузійне декодування з тієї самої контрольної точки 7B, що обслуговує шість інших задач. Для неї потрібний набір sensenova, а ваги обмежено некомерційним використанням; ліцензію наведено на сторінці моделі.

Marigold V2 додає адаптери глибини на основі дифузії з явними кодуваннями глибини.

GTR передбачає метричну глибину й повертає її як відносну обернену глибину, тож 1 / result.depth_map.data відновлює метри для сцен, подібних до її навчальних даних. Модель працює з базовим пакетом, підтримує навчання та експорт у формати ONNX і TorchScript.

Передбачення

Ваги завантажуються під час першого використання й кешуються локально. Сторінки моделей описують вимоги до автентифікації та середовища виконання.

Передбачити карту глибини
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) на початковому полотніprint(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          # вище означає ближче; немає метричної одиниці чи масштабуgray = depth.normalized() # перемасштабовано до [0, 1] для візуалізаціїprint(raw.shape, float(gray.max()))
Компактна альтернатива
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Той самий контракт задачі, значно менша мережа для edge-середовищ.model = LibreYOLO("LibreZipDepthb-depth.pt")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)

Обмеження вхідної роздільної здатності залежать від сімейства. Depth Anything V2 і Depth Anything 3 побудовано на сітці патчів DINOv2, тому imgsz має ділитися на 14 без остачі; LibreYOLO перевіряє це перед запуском. Results.plot() відображає результати глибини. Джерела, потокове оброблення й роботу з результатами описано в розділі передбачення.

DepthMap.encoding типово дорівнює inverse_depth, а також може бути depth або log_depth. Валідація інтерпретує кодування перед афінним вирівнюванням. Кодування не надає відносним передбаченням метричного масштабу.

Формат датасету

Валідація глибини зіставляє кожне зображення зі щільною одноканальною картою глибини такої самої роздільної здатності, знайденою шляхом підстановки каталогу глибини в шлях зображення.

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

Картами можуть бути одноканальні PNG чи TIF або файли .npy. Значення є звичайною глибиною в одиниці, яку датасет використовує послідовно; пікселі зі значеннями 0, від'ємними значеннями, NaN і нескінченністю позначають некоректні зразки, вилучені з метрик. Цілочислові карти діляться на depth_scale, типовим значенням якого є 256.0 за домовленістю 16-бітних PNG; карти .npy з рухомою комою використовуються без змін. depth_stem_suffix і depth_mask_suffix підтримують датасети, які інакше називають файли глибини або маски коректності. Повний контракт наведено в розділі форматів датасетів.

Навчання

GTR є єдиним сімейством глибини, що підтримує навчання: train() для контрольної точки -depth запускає рецепт вихідного проєкту, описаний на сторінці моделі. Для інших сімейств train() викликає NotImplementedError. Сторінка кожної моделі вказує скрипт конверсії контрольної точки, навченої у вихідному проєкті, у формат, який може завантажити LibreYOLO.

Валідація

val() запускає спільний валідатор глибини. Відносна глибина не має абсолютного масштабу, тому кожне передбачення спочатку припасовується до оберненої глибини еталонних даних за допомогою окремих для кожного зображення масштабу й зсуву методом найменших квадратів, а потім знову обертається до глибини. Кожна наведена нижче метрика обчислюється для кожного зображення на цій вирівняній карті й усереднюється за датасетом із урахуванням лише пікселів, позначених датасетом як коректні.

Виконати валідацію та прочитати ключі метрик
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 є середньою абсолютною відносною похибкою, тобто залишком, поділеним на еталонну глибину; менше значення краще. metrics/rmse є коренем середньої квадратичної похибки у власній одиниці глибини датасету; тут також менше значення краще. metrics/delta1, metrics/delta2 і metrics/delta3 є пороговими значеннями accuracy: частками коректних пікселів, для яких більше з двох відношень до еталонних даних менше за 1.25, квадрат 1.25 і куб 1.25; більше значення краще. metrics/delta1 також є fitness, числом для вибору найкращої контрольної точки.

Експорт

Експортована модель глибини завантажується назад через LibreYOLO() за суфіксом файла, тому файл .onnx або .engine поводиться як контрольна точка й повертає той самий об'єкт Results із depth_map замість рамок.

Експорт
from libreyolo import LibreYOLO model = LibreYOLO("LibreDepthAnythingV2s-depth.pt")model.export(format="onnx")
Запустити експортований файл
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика маршрутизує за суфіксом файла, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий Results.model = LibreYOLO("LibreDepthAnythingV2s-depth.onnx")result = model(SAMPLE_IMAGE) print(result.depth_map.data.shape)

Покриття залежить від сімейства, а Depth Anything 3 відхиляє будь-який формат поза валідованим набором замість спроби неперевіреного перетворення. Перш ніж вибрати ціль, перевірте сторінку моделі та повну матрицю експорту. LibreMODUS і SenseNova-Vision узагалі не підтримують експорт. У розділі експорту наведено аргументи, які приймає кожен формат.

Перевірено з LibreYOLO v1.6.0.