Estimazione della profondità dell’immagine utilizzando i Depth Prediction Transformers (DPT)

Depth estimation using Depth Prediction Transformers (DPT)

Introduzione

La stima della profondità delle immagini consiste nel capire a che distanza si trovano gli oggetti in un’immagine. È un problema importante nella visione artificiale perché aiuta con cose come la creazione di modelli 3D, la realtà aumentata e le auto a guida autonoma. In passato, le persone utilizzavano tecniche come la visione stereo o sensori speciali per stimare la profondità. Ma ora c’è un nuovo metodo chiamato Depth Prediction Transformers (DPT) che utilizza il deep learning.

I DPT sono un tipo di modello che può imparare a stimare la profondità guardando le immagini. In questo articolo, impareremo di più su come funzionano i DPT utilizzando la codifica pratica, perché sono utili e cosa possiamo fare con loro in diverse applicazioni.

Obiettivi di apprendimento

  • Il concetto di Dense Prediction Transformers (DPT) e il loro ruolo nella stima della profondità delle immagini.
  • Esplorare l’architettura dei DPT, inclusa la combinazione di vision transformers e framework encoder-decoder.
  • Implementare un compito DPT utilizzando la libreria transformer di Hugging Face.
  • Riconoscere le potenziali applicazioni dei DPT in vari domini.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Comprensione dei Depth Prediction Transformers

Depth Prediction Transformers (DPT) sono un tipo unico di modello di deep learning progettato specificamente per stimare la profondità degli oggetti nelle immagini. Utilizzano una speciale architettura chiamata transformers, che è stata inizialmente sviluppata per il trattamento dei dati linguistici. Tuttavia, i DPT si adattano e applicano questa architettura per gestire i dati visivi. Una delle principali forze dei DPT è la loro capacità di catturare relazioni intricate tra diverse parti di un’immagine e modellare dipendenze che si estendono su lunghe distanze. Questo consente ai DPT di predire con precisione la profondità o la distanza degli oggetti in un’immagine.

L’architettura dei Depth Prediction Transformers

Depth Prediction Transformers (DPT) combinano i vision transformers con un framework encoder-decoder per stimare la profondità nelle immagini. Il componente encoder cattura ed elabora le caratteristiche utilizzando meccanismi di auto-attenzione, migliorando la comprensione delle relazioni tra diverse parti dell’immagine. Ciò migliora la risoluzione delle caratteristiche e consente di catturare dettagli fini. Il componente decoder ricostruisce previsioni di profondità dense mappando le caratteristiche codificate nello spazio dell’immagine originale, utilizzando tecniche come l’upsampling e i layer convoluzionali. L’architettura dei DPT consente al modello di considerare il contesto globale della scena e modellare le dipendenze tra diverse regioni dell’immagine, ottenendo previsioni precise di profondità.

In sintesi, i DPT sfruttano i vision transformers e un framework encoder-decoder per stimare la profondità nelle immagini. L’encoder cattura le caratteristiche e le codifica utilizzando meccanismi di auto-attenzione, mentre il decoder ricostruisce previsioni di profondità dense. Questa architettura consente ai DPT di catturare dettagli fini, considerare il contesto globale e generare previsioni precise di profondità.

Implementazione dei DPT utilizzando Hugging Face Transformer

Vedremo un’implementazione pratica dei DPT utilizzando una pipeline di Huggin Face. Trova l’intero codice qui.

Passo 1: Installazione delle dipendenze

Iniziamo installando il pacchetto transformers dal repository GitHub utilizzando il seguente comando:

!pip install -q git+https://github.com/huggingface/transformers.git  # Installa il pacchetto transformers dal repository GitHub di Hugging Face

Esegui il comando !pip install in una cella Jupyter Notebook o JupyterLab per installare i pacchetti direttamente all’interno dell’ambiente del notebook.

Passo 2: Definizione del modello di stima della profondità

Il codice fornito definisce un modello di stima della profondità utilizzando l’architettura DPT della libreria Hugging Face Transformers.

from transformers import DPTFeatureExtractor, DPTForDepthEstimation

# Crea un estrattore di caratteristiche DPT
feature_extractor = DPTFeatureExtractor.from_pretrained("Intel/dpt-large")

# Crea un modello di stima della profondità DPT
model = DPTForDepthEstimation.from_pretrained("Intel/dpt-large")

Il codice importa le classi necessarie dalla libreria Transformers, ovvero DPTFeatureExtractor e DPTForDepthEstimation. Quindi, viene creato un’istanza dell’estrattore di caratteristiche DPT chiamando DPTFeatureExtractor.from_pretrained() e caricando i pesi preallenati dal modello “Intel/dpt-large”. In modo simile, viene creata un’istanza del modello di stima della profondità DPT utilizzando DPTForDepthEstimation.from_pretrained() e vengono caricati i pesi preallenati dallo stesso modello “Intel/dpt-large”.

Passaggio 3: Caricamento dell’immagine

Ora passiamo a fornire un modo per caricare e preparare un’immagine per ulteriori elaborazioni.

from PIL import Image
import requests

# Specifica l'URL dell'immagine da scaricare
url = 'https://img.freepik.com/free-photo/full-length-shot-pretty-healthy-young-lady-walking-morning-park-with-dog_171337-18880.jpg?w=360&t=st=1689213531~exp=1689214131~hmac=67dea8e3a9c9f847575bb27e690c36c3fec45b056e90a04b68a00d5b4ba8990e'

# Scarica e apri l'immagine usando PIL
image = Image.open(requests.get(url, stream=True).raw)

Abbiamo importato i moduli necessari (Image da PIL e requests) per gestire l’elaborazione delle immagini e le richieste HTTP, rispettivamente. Viene specificato l’URL dell’immagine da scaricare e quindi viene utilizzato requests.get() per recuperare i dati dell’immagine. Image.open() viene utilizzato per aprire i dati dell’immagine scaricata come oggetto immagine PIL.

Passaggio 4: Forward Pass

import torch

# Usa torch.no_grad() per disabilitare il calcolo del gradiente
with torch.no_grad():
    # Passa i valori dei pixel attraverso il modello
    outputs = model(pixel_values)
    # Accedi ai valori di profondità previsti dalle uscite
    predicted_depth = outputs.predicted_depth    

Il codice sopra esegue il passaggio in avanti del modello per ottenere i valori di profondità previsti per l’immagine di input. Utilizziamo torch.no_grad() come un gestore di contesto per disabilitare il calcolo del gradiente, il che aiuta a ridurre l’utilizzo della memoria durante l’inferenza. Passano il tensore dei valori dei pixel, pixel_values, attraverso il modello utilizzando model(pixel_values), e memorizzano le uscite risultanti nella variabile outputs. Successivamente, accedono ai valori di profondità previsti da outputs.predicted_depth e li assegnano alla variabile predicted_depth.

Passaggio 5: Interpolazione e Visualizzazione

Ora eseguiamo l’interpolazione dei valori di profondità previsti alla dimensione dell’immagine originale e convertiamo l’output in un’immagine.

import numpy as np

# Interpola i valori di profondità previsti alla dimensione originale
prediction = torch.nn.functional.interpolate(
    predicted_depth.unsqueeze(1),
    size=image.size[::-1],
    mode="bicubic",
    align_corners=False,
).squeeze()

# Converti i valori di profondità interpolati in un array numpy
output = prediction.cpu().numpy()

# Scala e formatta i valori di profondità per la visualizzazione
formatted = (output * 255 / np.max(output)).astype('uint8')

# Crea un'immagine dai valori di profondità formattati
depth = Image.fromarray(formatted)
depth

Utilizziamo torch.nn.functional.interpolate() per interpolare i valori di profondità previsti alla dimensione originale dell’immagine di input. I valori di profondità interpolati vengono quindi convertiti in un array numpy utilizzando .cpu().numpy(). Successivamente, i valori di profondità vengono scalati e formattati nell’intervallo [0, 255] per scopi di visualizzazione. Infine, viene creata un’immagine dai valori di profondità formattati utilizzando Image.fromarray().

Dopo l’esecuzione di questo codice, la variabile `depth` conterrà l’immagine di profondità, che viene visualizzata come la profondità dell’immagine.

Benefici e vantaggi

I Depth Prediction Transformers offrono diversi benefici e vantaggi rispetto ai metodi tradizionali per la stima della profondità dell’immagine. Ecco alcuni punti chiave da comprendere sui Depth Prediction Transformers (DPT):

  • Migliore attenzione ai dettagli: I DPT utilizzano una parte speciale chiamata encoder per catturare dettagli molto piccoli e rendere le previsioni più accurate.
  • Comprensione dell’immagine completa: I DPT sono bravi nel capire come diverse parti di un’immagine sono connesse. Ciò li aiuta a comprendere l’intera scena e stimare la profondità in modo accurato.
  • Diverse aree di applicazione: Utilizza i DPT in molte cose diverse come la creazione di modelli 3D, l’aggiunta di elementi al mondo reale nella realtà aumentata e l’aiuto ai robot a comprendere l’ambiente circostante.

  • Semplicità di integrazione: Combina DPT con altre strumenti di computer vision come l’individuazione di oggetti o la divisione di un’immagine in diverse parti. Ciò rende la stima della profondità ancora migliore e più precisa.

Applicazioni potenziali

La stima della profondità dell’immagine utilizzando i Depth Prediction Transformers ha molte applicazioni utili in diversi settori. Ecco alcuni esempi:

  • Navigazione autonoma: La stima della profondità è importante per le auto a guida autonoma per comprendere l’ambiente circostante e navigare in sicurezza sulla strada.
  • Realtà aumentata: La stima della profondità aiuta ad sovrapporre oggetti virtuali sul mondo reale nelle app di realtà aumentata, rendendoli realistici e in grado di interagire correttamente con l’ambiente.
  • Ricostruzione 3D: La stima della profondità è fondamentale per creare modelli 3D di oggetti o scene da immagini 2D regolari, permettendoci di visualizzarli in uno spazio tridimensionale.
  • Robotica: La stima della profondità è preziosa per i robot per svolgere compiti come raccogliere oggetti, evitare ostacoli e comprendere la disposizione del loro ambiente.

Conclusioni

La stima della profondità dell’immagine utilizzando i Depth Prediction Transformers fornisce un metodo forte e preciso per stimare la profondità dalle immagini 2D. Utilizzando l’architettura del transformer e un framework encoder-decoder, i DPT possono catturare efficacemente dettagli intricati, comprendere le connessioni tra diverse parti dell’immagine e generare previsioni precise di profondità. Questa tecnologia ha il potenziale per essere applicata in varie aree come la navigazione autonoma, la realtà aumentata, la ricostruzione 3D e la robotica, offrendo possibilità entusiasmanti per i progressi in questi campi. Con l’avanzamento della computer vision, i Depth Prediction Transformers continueranno a svolgere un ruolo cruciale nel raggiungimento di una stima precisa e affidabile della profondità, portando a miglioramenti e scoperte in numerose applicazioni.

Cose da ricordare

  • La stima della profondità dell’immagine utilizzando i Depth Prediction Transformers (DPT) è un approccio potente e accurato per prevedere la profondità dalle immagini 2D.
  • I DPT sfruttano l’architettura del transformer e il framework encoder-decoder per catturare dettagli fini, modellare dipendenze a lungo raggio e generare previsioni precise della profondità.
  • I DPT hanno applicazioni potenziali nella navigazione autonoma, nella realtà aumentata, nella ricostruzione 3D e nella robotica, aprendo nuove possibilità in vari settori.
  • Con l’avanzamento della computer vision, i Depth Prediction Transformers continueranno a svolgere un ruolo significativo nel raggiungimento di una stima precisa e affidabile della profondità, contribuendo ai progressi in numerose applicazioni.

Domande frequenti

  • Codice: https://github.com/inuwamobarak/depth-estimation-DPT
  • https://www.v7labs.com/blog/vision-transformer-guide
  • https://viso.ai/deep-learning/vision-transformer-vit/
  • https://paperswithcode.com/method/dense-prediction-transformer
  • https://huggingface.co/docs/transformers/main/en/model_doc/dpt

Il materiale mostrato in questo articolo non è di proprietà di Analytics Vidhya ed è utilizzato a discrezione dell’autore.