Переглянути як 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 є лінією досліджень, що започаткувала протокол відносної глибини без донавчання, за яким вимірюють інші сімейства. Це єдине сімейство глибини, яке LibreYOLO не публікує повторно: запит контрольної точки завантажує офіційний артефакт із GitHub-релізу авторів і перевіряє зафіксовану суму SHA-256.

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

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

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

Під час першого використання ваги завантажуються з Hugging Face і кешуються локально, крім двох зазначених вище сімейств.

Передбачити карту глибини
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() не підтримує цю задачу; метод визначено лише для нормалей поверхні та країв. Джерела, потокове оброблення й роботу з результатами описано в розділі передбачення.

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

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

dataset/
  data.yaml
  images/
    val/room.jpg
  depths/
    val/room.png
yaml
path: dataset
val: images/val
depths_dir: depths
nc: 1
names: {0: depth}

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

Навчання

Жодне сімейство глибини в LibreYOLO не має реалізації навчання: train() спричиняє NotImplementedError в усіх шести. На сторінці кожної моделі названо скрипт перетворення, який створює придатну для LibreYOLO контрольну точку з контрольної точки, навченої в upstream-проєкті.

Валідація

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.5.0.