Transformers documentation
Tek gözlü derinlik tahmini
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
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"]
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_estimationfonksiyonu, ters çevrilmiş çıktıları isteğe bağlıoutputs_flippedargü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, ... )
