Transformers documentation

Tek gözlü derinlik tahmini

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

Tek gözlü derinlik tahmini

Monoküler derinlik tahmini, tek bir görüntüden bir sahnenin derinlik bilgisini tahmin etmeyi içeren bir bilgisayar görüsü görevidir. Başka bir deyişle, tek bir kamera bakış açısından sahnede nesnelerin mesafesini tahmin etme sürecidir.

Tek gözlü derinlik tahmini, 3B yeniden yapılandırma, artırılmış gerçeklik, otonom sürüş ve robotik gibi çeşitli uygulamalara sahiptir. Modelin, sahnede nesneler arasındaki karmaşık ilişkileri ve bunlara karşılık gelen derinlik bilgisini anlaması gerektiğinden zorlu bir görevdir; bu bilgi, aydınlatma koşulları, tıkanma ve doku gibi faktörlerden etkilenebilir.

İki ana derinlik tahmini kategorisi vardır:

  • Mutlak derinlik tahmini: Bu görev varyantı, kameradan kesin derinlik ölçümleri sağlamayı amaçlar. Terim, derinliğin metre veya feet cinsinden hassas ölçümlerle verildiği metrik derinlik tahmini ile eş anlamlı olarak kullanılır. Mutlak derinlik tahmini modelleri, gerçek dünya mesafelerini temsil eden sayısal değerlere sahip derinlik haritaları üretir.

  • Göreli derinlik tahmini: Göreli derinlik tahmini, kesin ölçümler sunmadan bir sahnede nesnelerin veya noktaların derinlik sırasını tahmin etmeyi amaçlar. Bu modeller, A ve B'ye olan gerçek mesafeler olmadan, sahnenin hangi kısımlarının birbirine göre daha yakın veya daha uzak olduğunu gösteren bir derinlik haritası üretir.

Bu kılavuzda, son teknoloji sıfır atıllı (zero-shot) göreli derinlik tahmini modeli olan Depth Anything V2 ve mutlak derinlik tahmini modeli olan ZoeDepth ile çıkarım (inference) yapmayı göreceğiz.

Uygun tüm mimarileri ve denetim noktalarını görüntülemek için Derinlik Tahmini görev sayfasını kontrol edin.

Başlamadan önce, Transformers'ın en son sürümünü yüklememiz gerekiyor:

pip install -q -U transformers

Derinlik tahmini hattı

Derinlik tahmini destekleyen bir modelle çıkarımı denemenin en basit yolu, ilgili pipeline() iş akışını kullanmaktır. Bir Hugging Face Hub kontrol noktasından bir iş akışı örneği oluşturun:

>>> 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)

Ardından, analiz edilecek bir görsel seçin:

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

Görseli pipeline'a iletin.

>>> predictions = pipe(image)

Pipeline, iki giriş içeren bir sözlük döndürür. Birincisi, predicted_depth adlı girdi, her piksel için metre cinsinden derinlik değerlerini içeren bir tensördür. İkincisi, depth, derinlik tahmini sonucunu görselleştiren bir PIL görüntüsüdür.

Görselleştirilmiş sonuca bir bakalım:

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

Derinlik tahmini çıkarımını elle

Derinlik tahmini hattını nasıl kullanacağınızı gördüğünüze göre, şimdi aynı sonucu elle nasıl yeniden üretebileceğimize bakalım.

Modeli ve ilişkili işlemciyi Hugging Face Hub'daki bir kontrol noktasından yükleyerek başlayın. Burada, daha öncekiyle aynı kontrol noktasını kullanacağız:

>>> from transformers import AutoImageProcessor, AutoModelForDepthEstimation

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

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

Gerekli görüntü dönüşümlerini, yeniden boyutlandırma ve normalizasyon gibi işlemleri üstlenecek image_processor kullanarak model için görüntü girdisini hazırlayın:

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

Hazırlanan girdileri modelden geçirin:

>>> import torch

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

Sonuçları son işlemeye tabi tutarak dolgu (padding) öğelerini kaldıralım ve derinlik haritasını orijinal görüntü boyutuyla eşleşecek şekilde yeniden boyutlandıralım. post_process_depth_estimation, "predicted_depth" içeren sözlüklerden oluşan bir liste döndürür.

>>> # 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"))

orijinal uygulamada ZoeDepth modeli, hem orijinal hem de yatayda ters çevrilmiş görüntüler üzerinde çıkarım yapar ve sonuçları ortalar. post_process_depth_estimation fonksiyonu, ters çevrilmiş çıktıları isteğe bağlı outputs_flipped argümanına ileterek bunu bizim için halledebilir:

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