Transformers documentation
Оценка однокамерной глубины
Оценка однокамерной глубины
Оценка монокулярной глубины — это задача компьютерного зрения, которая заключается в предсказании информации о глубине сцены по одному изображению. Иными словами, это процесс оценки расстояния до объектов в сцене с точки зрения одной камеры.
Оценка монокулярной глубины находит применение в различных задачах, включая 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
Передайте изображение в конвейер.
>>> predictions = pipe(image)Пайплайн возвращает словарь с двумя записями. Первая, predicted_depth, — это тензор, значения которого представляют глубину в метрах для каждого пикселя.
Вторая, depth, — это изображение в формате PIL, визуализирующее результат оценки глубины.
Рассмотрим визуализированный результат:
>>> predictions["depth"]
Вывод оценки глубины вручную
Теперь, когда вы узнали, как использовать конвейер оценки глубины, давайте посмотрим, как можно воспроизвести тот же результат вручную.
Начните с загрузки модели и соответствующего процессора из чекпоинта на 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, ... )
