Transformers documentation
Depth Anything V2
Эта модель была опубликована в HF papers 13.06.2024 и добавлена в Hugging Face Transformers 05.07.2024.
Depth Anything V2
Обзор
Depth Anything V2 был представлен в одноимённой статье Ли Хэ Янга и соавторов. Он использует ту же архитектуру, что и исходная модель Depth Anything, но применяет синтетические данные и teacher-модель большей ёмкости, что позволяет получать значительно более точные и устойчивые предсказания глубины.
Аннотация из статьи следующая:
В данной работе представлена модель Depth Anything V2. Не прибегая к сложным приёмам, мы стремимся выявить ключевые закономерности, которые помогут создать мощную модель однокамерной оценки глубины. В частности, по сравнению с версией V1, эта версия обеспечивает значительно более точные и устойчивые предсказания глубины благодаря трём основным подходам: 1) замене всех размеченных реальных изображений на синтетические, 2) увеличению ёмкости нашей teacher-модели и 3) обучению student-моделей с использованием моста из реальных изображений с псевдо-разметкой в большом масштабе. По сравнению с новейшими моделями, построенными на базе Stable Diffusion, наши модели значительно эффективнее (более чем в 10 раз быстрее) и точнее. Мы предоставляем модели разного масштаба (от 25M до 1.3B параметров) для поддержки широкого спектра сценариев. Благодаря их высокой способности к обобщению, мы дообучаем их с метрическими метками глубины, чтобы получить наши метрические модели глубины. Помимо наших моделей, учитывая ограниченное разнообразие и частые шумы в текущих тестовых наборах, мы создали универсальный оценочный бенчмарк с точными аннотациями и разнообразными сценами, чтобы содействовать будущим исследованиям.
Depth Anything overview. Taken from the original paper. Модели Depth Anything были предоставлены nielsr. Исходный код можно найти здесь.
Пример использования
Существует два основных способа использования Depth Anything V2: либо через API pipeline, который скрывает от вас всю сложность, либо самостоятельно, используя класс DepthAnythingForDepthEstimation.
API Pipeline
Пайплайн позволяет использовать модель всего в нескольких строках кода:
import requests
from PIL import Image
from transformers import pipeline
# load pipe
pipe = pipeline(task="depth-estimation", model="depth-anything/Depth-Anything-V2-Small-hf")
# load image
url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)
# inference
depth = pipe(image)["depth"]Использование модели самостоятельно
Если вы хотите выполнять предобработку и постобработку самостоятельно, вот как это сделать:
import requests
import torch
from PIL import Image
from transformers import AutoImageProcessor, AutoModelForDepthEstimation
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
image_processor = AutoImageProcessor.from_pretrained("depth-anything/Depth-Anything-V2-Small-hf")
model = AutoModelForDepthEstimation.from_pretrained("depth-anything/Depth-Anything-V2-Small-hf", device_map="auto")
# prepare image for the model
inputs = image_processor(images=image, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model(**inputs)
# interpolate to original size and visualize the prediction
post_processed_output = image_processor.post_process_depth_estimation(
outputs,
target_sizes=[(image.height, image.width)],
)
predicted_depth = post_processed_output[0]["predicted_depth"]
depth = (predicted_depth - predicted_depth.min()) / (predicted_depth.max() - predicted_depth.min())
depth = depth.detach().cpu().numpy() * 255
depth = Image.fromarray(depth.astype("uint8"))Ресурсы
Список официальных ресурсов Hugging Face и сообщества (отмечены значком 🌎), которые помогут вам начать работу с Depth Anything.
- Руководство по задаче оценки монокулярной глубины
- Демо Depth Anything V2.
- Ноутбук с демонстрацией инференса с помощью DepthAnythingForDepthEstimation доступен здесь. 🌎
- Конвертация в Core ML варианта
smallдля использования на Apple Silicon.
Если вы хотите предложить ресурс для включения в этот раздел, пожалуйста, создайте Pull Request, и мы его рассмотрим! В идеале ресурс должен демонстрировать что-то новое, а не дублировать уже имеющийся.
DepthAnythingConfig
класс transformers.DepthAnythingConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonebackbone_config: dict | transformers.configuration_utils.PreTrainedConfig | None = Nonepatch_size: int | list[int] | tuple[int, int] = 14initializer_range: float = 0.02reassemble_hidden_size: int = 384reassemble_factors: list[int | float] | tuple[int | float, ...] = (4, 2, 1, 0.5)neck_hidden_sizes: list[int] | tuple[int, ...] = (48, 96, 192, 384)fusion_hidden_size: int = 64head_in_index: int = -1head_hidden_size: int = 32depth_estimation_type: str = 'relative'max_depth: int | None = 1 )
Параметры
- backbone_config (
Union[dict, ~configuration_utils.PreTrainedConfig], необязательный) — Конфигурация модели-бэкбона. - patch_size (
Union[int, list[int], tuple[int, int]], необязательный, по умолчанию14) — Размер (разрешение) каждого патча. - initializer_range (
float, необязательный, по умолчанию0.02) — Стандартное отклонение truncated_normal_initializer, используемое для инициализации всех матриц весов. - reassemble_hidden_size (
int, необязательный, по умолчанию 384) — Количество входных каналов в слоях reassemble. - reassemble_factors (
list[int], необязательный, по умолчанию[4, 2, 1, 0.5]) — Коэффициенты увеличения/уменьшения разрешения в слоях reassemble. - neck_hidden_sizes (
list[str], необязательный, по умолчанию[48, 96, 192, 384]) — Размеры скрытых слоёв, к которым проецируются карты признаков бэкбона. - fusion_hidden_size (
int, необязательный, по умолчанию 64) — Число каналов до слияния. - head_in_index (
int, необязательный, по умолчанию -1) — Индекс признаков, используемых в голове оценки глубины. - head_hidden_size (
int, необязательный, по умолчанию 32) — Количество выходных каналов во втором свёрточном слое головы оценки глубины. - depth_estimation_type (
str, необязательный, по умолчанию"relative") — Тип оценки глубины. Может быть одним из["relative", "metric"]. - max_depth (
float, необязательный) — Максимальная глубина, используемая для головы оценки глубины «metric». Для внутренних моделей следует использовать значение 20, а для внешних — 80. При оценке «relative» глубины это значение игнорируется.
Это класс конфигурации для хранения настроек модели Depth AnythingModel. Он используется для создания модели Depth Anything в соответствии с указанными аргументами, определяя архитектуру модели. Создание конфигурации с параметрами по умолчанию даст конфигурацию, аналогичную конфигурации LiheYoung/depth-anything-small-hf
Объекты конфигурации наследуются от PreTrainedConfig и могут использоваться для управления выводами модели. Подробнее читайте в документации PreTrainedConfig.
Пример:
>>> from transformers import DepthAnythingConfig, DepthAnythingForDepthEstimation
>>> # Initializing a DepthAnything small style configuration
>>> configuration = DepthAnythingConfig()
>>> # Initializing a model from the DepthAnything small style configuration
>>> model = DepthAnythingForDepthEstimation(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configDepthAnythingForDepthEstimation
класс transformers.DepthAnythingForDepthEstimation
< source >( config: DepthAnythingConfig )
Параметры
- config (DepthAnythingConfig) — Класс конфигурации модели, содержащий все параметры модели. Инициализация по файлу конфигурации не загружает веса, связанные с моделью, только конфигурацию. Используйте метод from_pretrained() для загрузки весов модели.
Depth Anything Model с головой для оценки глубины (состоящей из 3 свёрточных слоёв), например, для KITTI, NYUv2.
Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)
Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.
forward
< source >( pixel_values: FloatTensorlabels: typing.Optional[torch.LongTensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DepthEstimatorOutput or tuple(torch.FloatTensor)
Параметры
- pixel_values (
torch.FloatTensorформы(batch_size, num_channels, image_size, image_size)) — Тензоры, соответствующие входным изображениям. Значения пикселей можно получить с помощью DPTImageProcessor. Подробности см. в DPTImageProcessor.call() (processor_classиспользует DPTImageProcessor для обработки изображений). - labels (
torch.LongTensorформы(batch_size, height, width), необязательный) — Истинные карты оценки глубины для вычисления функции потерь. - output_attentions (
bool, необязательный) — Указывает, следует ли возвращать тензоры внимания всех слоев внимания. Подробности см. в описанииattentionsв разделе возвращаемых тензоров. - output_hidden_states (
bool, необязательный) — Указывает, следует ли возвращать скрытые состояния всех слоев. Подробности см. в описанииhidden_statesсреди возвращаемых тензоров. - return_dict (
bool, необязательный) — Указывает, следует ли возвращать ModelOutput вместо обычного кортежа.
Возвращает
DepthEstimatorOutput или tuple(torch.FloatTensor)
Объект DepthEstimatorOutput или кортеж из
torch.FloatTensor (если передан аргумент return_dict=False или если config.return_dict=False), содержащий различные
элементы в зависимости от конфигурации (DepthAnythingConfig) и входных данных.
Метод forward класса DepthAnythingForDepthEstimation переопределяет специальный метод __call__.
Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр
Module, а не эту функцию, поскольку первый вариант обеспечивает выполнение шагов предварительной и последующей обработки, тогда как второй молча их игнорирует.
loss (
torch.FloatTensorформы(1,), необязательный, возвращается, если переданlabels) — Потери классификации (или регрессии, если config.num_labels==1).predicted_depth (
torch.FloatTensorформы(batch_size, height, width)) — Предсказанная глубина для каждого пикселя.hidden_states (
tuple(torch.FloatTensor), необязательный, возвращается при передачеoutput_hidden_states=Trueили когдаconfig.output_hidden_states=True) — Кортеж изtorch.FloatTensor(один для вывода слоя встраиваний, если модель содержит такой слой, + один для вывода каждого слоя) формы(batch_size, num_channels, height, width).Скрытые состояния модели на выходе каждого слоя, а также необязательные выходные значения начального слоя встраивания.
attentions (
tuple(torch.FloatTensor), необязательный, возвращается при передачеoutput_attentions=Trueили приconfig.output_attentions=True) — кортежtorch.FloatTensor(по одному на каждый слой) формы(batch_size, num_heads, patch_size, sequence_length).Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.
Примеры:
>>> from transformers import AutoImageProcessor, AutoModelForDepthEstimation
>>> import torch
>>> import numpy as np
>>> from PIL import Image
>>> from huggingface_hub.utils import httpx
>>> from io import BytesIO
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> with httpx.stream("GET", url) as response:
... image = Image.open(BytesIO(response.read()))
>>> image_processor = AutoImageProcessor.from_pretrained("LiheYoung/depth-anything-small-hf")
>>> model = AutoModelForDepthEstimation.from_pretrained("LiheYoung/depth-anything-small-hf")
>>> # prepare image for the model
>>> inputs = image_processor(images=image, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> # interpolate to original size
>>> post_processed_output = image_processor.post_process_depth_estimation(
... outputs,
... target_sizes=[(image.height, image.width)],
... )
>>> # visualize the prediction
>>> predicted_depth = post_processed_output[0]["predicted_depth"]
>>> depth = predicted_depth * 255 / predicted_depth.max()
>>> depth = depth.detach().cpu().numpy()
>>> depth = Image.fromarray(depth.astype("uint8"))