Transformers documentation

Оценка однокамерной глубины

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Оценка однокамерной глубины

Оценка монокулярной глубины — это задача компьютерного зрения, которая заключается в предсказании информации о глубине сцены по одному изображению. Иными словами, это процесс оценки расстояния до объектов в сцене с точки зрения одной камеры.

Оценка монокулярной глубины находит применение в различных задачах, включая 3D-реконструкцию, дополненную реальность, автономное вождение и робототехнику. Это сложная задача, поскольку модели необходимо понимать сложные взаимосвязи между объектами в сцене и соответствующей информацией о глубине, на которые могут влиять такие факторы, как условия освещения, перекрытие объектов и текстура.

Существуют две основные категории оценки глубины:

  • Оценка абсолютной глубины: Эта разновидность задачи направлена на получение точных измерений глубины от камеры. Термин используется как синоним метрической оценки глубины, при которой глубина предоставляется в точных значениях в метрах или футах. Модели оценки абсолютной глубины выводят карты глубины с числовыми значениями, представляющими реальные расстояния.

  • Оценка относительной глубины: Оценка относительной глубины направлена на предсказание порядка объектов или точек по глубине в сцене без предоставления точных измерений. Эти модели выводят карту глубины, которая указывает, какие части сцены находятся ближе или дальше друг от друга, без фактических расстояний до A и B.

В этом руководстве мы рассмотрим, как выполнять инференс с помощью Depth Anything V2 — передовой модели нулевого-выстрела для оценки относительной глубины, — и ZoeDepth — модели для оценки абсолютной глубины.

Откройте страницу задачи Depth Estimation, чтобы просмотреть все совместимые архитектуры и контрольные точки.

Прежде чем начать, нам нужно установить последнюю версию Transformers:

pip install -q -U transformers

Конвейер оценки глубины

Самый простой способ попробовать инференс с моделью, поддерживающей оценку глубины, — использовать соответствующий pipeline(). Создайте пайплайн из чекпоинта на Hugging Face Hub:

>>> from transformers import pipeline
from accelerate import Accelerator
>>> import torch
>>> device = Accelerator().device
>>> checkpoint = "depth-anything/Depth-Anything-V2-base-hf"
>>> pipe = pipeline("depth-estimation", model=checkpoint, device=device)

Далее выберите изображение для анализа:

>>> from PIL import Image
>>> import requests

>>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)
>>> image
Photo of a bee

Передайте изображение в конвейер.

>>> predictions = pipe(image)

Пайплайн возвращает словарь с двумя записями. Первая, predicted_depth, — это тензор, значения которого представляют глубину в метрах для каждого пикселя. Вторая, depth, — это изображение в формате PIL, визуализирующее результат оценки глубины.

Рассмотрим визуализированный результат:

>>> predictions["depth"]
Depth estimation visualization

Вывод оценки глубины вручную

Теперь, когда вы узнали, как использовать конвейер оценки глубины, давайте посмотрим, как можно воспроизвести тот же результат вручную.

Начните с загрузки модели и соответствующего процессора из чекпоинта на Hugging Face Hub. Здесь мы будем использовать тот же чекпоинт, что и ранее:

>>> from transformers import AutoImageProcessor, AutoModelForDepthEstimation

>>> checkpoint = "Intel/zoedepth-nyu-kitti"

>>> image_processor = AutoImageProcessor.from_pretrained(checkpoint)
>>> model = AutoModelForDepthEstimation.from_pretrained(checkpoint).to(device)

Подготовьте входные данные изображения для модели с помощью image_processor, который выполнит необходимые преобразования изображения, такие как изменение размера и нормализация:

>>> pixel_values = image_processor(image, return_tensors="pt").pixel_values.to(device)

Передайте подготовленные входные данные в модель:

>>> import torch

>>> with torch.no_grad():
...     outputs = model(pixel_values)

Давайте выполним постобработку результатов, чтобы удалить заполнители и изменить размер карты глубины, чтобы она соответствовала размеру исходного изображения. Функция post_process_depth_estimation возвращает список словарей, содержащих "predicted_depth".

>>> # ZoeDepth dynamically pads the input image. Thus we pass the original image size as argument
>>> # to `post_process_depth_estimation` to remove the padding and resize to original dimensions.
>>> post_processed_output = image_processor.post_process_depth_estimation(
...     outputs,
...     source_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"))

В исходной реализации модель ZoeDepth выполняет инференс как на исходном, так и на перевёрнутом изображении, усредняя результаты. Функция post_process_depth_estimation может выполнить это за нас, если передать перевёрнутые результаты в необязательный аргумент outputs_flipped:

>>> with torch.no_grad():
...     outputs = model(pixel_values)
...     outputs_flipped = model(pixel_values=torch.flip(inputs.pixel_values, dims=[3]))
>>> post_processed_output = image_processor.post_process_depth_estimation(
...     outputs,
...     source_sizes=[(image.height, image.width)],
...     outputs_flipped=outputs_flipped,
... )
Depth estimation visualization
Update on GitHub