Lo stato della Visione Artificiale presso Hugging Face 🤗

Stato Visione Artificiale Hugging Face 🤗.

Da Hugging Face, siamo orgogliosi di democratizzare il campo dell’intelligenza artificiale insieme alla comunità. Come parte di questa missione, abbiamo iniziato a concentrare i nostri sforzi sulla visione artificiale nell’ultimo anno. Quello che è iniziato come un PR per avere i Vision Transformers (ViT) in 🤗 Transformers è cresciuto in qualcosa di molto più grande: 8 compiti principali di visione, oltre 3000 modelli e oltre 100 set di dati sul Hugging Face Hub.

Sono accadute molte cose interessanti da quando i ViTs si sono uniti all’Hub. In questo post del blog, riassumeremo ciò che è successo e cosa sta arrivando per supportare il progresso continuo della visione artificiale nell’ecosistema 🤗.

Ecco un elenco delle cose che copriremo:

  • Compiti di visione supportati e pipeline
  • Addestrare i propri modelli di visione
  • Integrazione con timm
  • Diffusori
  • Supporto per librerie di terze parti
  • Implementazione
  • e molto altro ancora!

Abilitare la comunità: Un compito alla volta 👁

L’Hugging Face Hub ospita oltre 100.000 modelli pubblici per diversi compiti come la previsione della parola successiva, il riempimento della maschera, la classificazione dei token, la classificazione delle sequenze, ecc. Ad oggi, supportiamo 8 compiti principali di visione fornendo molti checkpoint di modelli:

  • Classificazione delle immagini
  • Segmentazione delle immagini
  • (Zero-shot) rilevamento degli oggetti
  • Classificazione dei video
  • Stima della profondità
  • Sintesi immagine-immagine
  • Generazione di immagini incondizionata
  • Classificazione delle immagini zero-shot

Ogni compito viene fornito con almeno 10 checkpoint di modelli sull’Hub da esplorare. Inoltre, supportiamo compiti che si trovano all’incrocio tra visione e linguaggio, come:

  • Immagine-testo (descrizione dell’immagine, OCR)
  • Testo-immagine
  • Risposta alle domande dei documenti
  • Risposta alle domande visive

Questi compiti implicano non solo architetture basate su Transformer all’avanguardia come ViT, Swin, DETR, ma anche architetture puramente convoluzionali come ConvNeXt, ResNet, RegNet e altre! Architetture come ResNets sono ancora molto rilevanti per una miriade di casi d’uso industriali e quindi il supporto di queste architetture non-Transformer in 🤗 Transformers.

È importante notare che i modelli sull’Hub non provengono solo dalla libreria Transformers, ma anche da altre librerie di terze parti. Ad esempio, anche se supportiamo compiti come la generazione di immagini incondizionata sull’Hub, non abbiamo ancora modelli che supportano quel compito in Transformers (come questo). Supportare tutti i compiti di ML, che siano risolti con Transformers o una libreria di terze parti, fa parte della nostra missione di promuovere un ecosistema di Machine Learning open-source collaborativo.

Supporto per le pipeline

Abbiamo sviluppato le pipeline per fornire agli operatori gli strumenti necessari per incorporare facilmente il machine learning nella loro cassetta degli attrezzi. Forniscono un modo semplice per eseguire l’inferenza su un input dato rispetto a un compito. Abbiamo il supporto per sette compiti di visione nelle pipeline. Ecco un esempio di utilizzo delle pipeline per la stima della profondità:

from transformers import pipeline

estimatore_profondità = pipeline(task="stima-profondità", model="Intel/dpt-large")
output = estimatore_profondità("http://images.cocodataset.org/val2017/000000039769.jpg")

# Questo è un tensore con i valori che rappresentano la profondità espressa
# in metri per ogni pixel
output["profondità"]

Interfaccia rimane la stessa anche per compiti come la risposta visiva alle domande:

from transformers import pipeline

oracolo = pipeline(model="dandelin/vilt-b32-finetuned-vqa")
url_immagine = "https://huggingface.co/datasets/mishig/sample_images/resolve/main/tiger.jpg"

oracolo(domanda="Cosa sta facendo l'animale?", immagine=url_immagine, top_k=1)
# [{'score': 0.778620, 'risposta': 'sdraiato'}]

Allenare i propri modelli

Pur potendo utilizzare un modello per l’inferenza immediata, il fine-tuning rappresenta il modo migliore per ottenere il massimo vantaggio dalla comunità. Questo è particolarmente vero quando i set di dati sono personalizzati e non si ottengono buone prestazioni dai modelli preaddestrati.

Transformers fornisce un’API per il Trainer che riguarda tutto ciò che riguarda l’addestramento. Attualmente, il Trainer supporta senza soluzione di continuità i seguenti compiti: classificazione delle immagini, segmentazione delle immagini, classificazione dei video, rilevamento degli oggetti e stima della profondità. Anche il fine-tuning dei modelli per altri compiti di visione è supportato, ma non dal Trainer.

Fino a quando il calcolo della perdita è incluso in un modello di Transformers che calcola la perdita per un determinato compito, è idoneo per il fine-tuning per il compito. Se riscontri problemi, segnalali su GitHub.

Dove trovo il codice?

  • Documentazione del modello
  • Notebook di Hugging Face
  • Script di esempio di Hugging Face
  • Pagine del compito

Gli script di esempio di Hugging Face includono diverse strategie di pre-training auto-supervisionato come MAE e strategie di pre-training immagine-testo contrastive come CLIP. Questi script sono risorse preziose per la comunità di ricerca e per i professionisti desiderosi di eseguire il pre-training da zero su corpora di dati personalizzati.

Tuttavia, alcuni compiti non sono destinati per loro natura al fine-tuning. Ad esempio, la classificazione di immagini senza supervisione (come CLIP), il rilevamento di oggetti senza supervisione (come OWL-ViT) e la segmentazione senza supervisione (come CLIPSeg). In questo post esamineremo nuovamente questi modelli.

Integrazioni con i dataset

I dataset forniscono un facile accesso a migliaia di dataset di diverse modalità. Come accennato in precedenza, l’Hub dispone di oltre 100 dataset per la computer vision. Alcuni esempi degni di nota sono ImageNet-1k, Scene Parsing, NYU Depth V2, COYO-700M e LAION-400M. Con questi dataset presenti nell’Hub, è possibile caricarli facilmente con soli due righe di codice:

from datasets import load_dataset

dataset = load_dataset("scene_parse_150")

Oltre a questi dataset, forniamo supporto per l’integrazione con librerie di augmentations come albumentations e Kornia. La comunità può beneficiare della flessibilità e delle prestazioni di Datasets e delle potenti trasformazioni di augmentation fornite da queste librerie. Oltre a ciò, forniamo anche guide dedicate al caricamento dei dati per i compiti principali della visione: classificazione di immagini, segmentazione di immagini, rilevamento di oggetti e stima della profondità.

🤗 🤝 timm

timm, noto anche come pytorch-image-models, è una collezione open-source di modelli di immagini state-of-the-art di PyTorch, pesi pre-addestrati e script di utilità per addestramento, inferenza e convalida.

Abbiamo oltre 200 modelli di timm sull’Hub e ne sono in arrivo altri. Consulta la documentazione per saperne di più su questa integrazione.

🧨 Diffusers

Diffusers fornisce modelli pre-addestrati di diffusione per visione e audio, e funge da toolbox modulare per l’inferenza e l’addestramento. Con questa libreria, è possibile generare immagini plausibili da input di linguaggio naturale, tra altri casi d’uso creativi. Ecco un esempio:

from diffusers import DiffusionPipeline

generator = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
generator.to("cuda")

image = generator("Un'immagine di uno scoiattolo in stile Picasso").images[0]

Questo tipo di tecnologia può fornire potenza a una nuova generazione di applicazioni creative e aiutare anche artisti provenienti da diverse esperienze. Per saperne di più su Diffusers e i diversi casi d’uso, consulta la documentazione ufficiale.

La letteratura sui modelli basati sulla diffusione sta sviluppandosi a un ritmo rapido, motivo per cui ci siamo associati a Jonathan Whitaker per sviluppare un corso su questo argomento. Il corso è gratuito e puoi trovarlo qui.

Supporto per librerie di terze parti

Al centro dell’ecosistema di Hugging Face c’è l’Hub di Hugging Face, che consente alle persone di collaborare efficacemente nell’apprendimento automatico. Come accennato in precedenza, supportiamo non solo modelli di 🤗 Transformers sull’Hub, ma anche modelli di altre librerie di terze parti. A tal fine, forniamo diverse utilità in modo che tu possa integrare la tua libreria con l’Hub. Uno dei principali vantaggi di farlo è che diventa molto facile condividere artefatti (come modelli e dataset) con la comunità, facilitando così ai tuoi utenti la possibilità di provare i tuoi modelli.

Quando hai i tuoi modelli ospitati sull’Hub, puoi anche aggiungere widget di inferenza personalizzati per essi. I widget di inferenza consentono agli utenti di verificare rapidamente i modelli. Ciò contribuisce a migliorare il coinvolgimento degli utenti.

Spazi per demo di computer vision

Con Spaces, è possibile dimostrare facilmente i propri modelli di apprendimento automatico. Spaces supporta integrazioni dirette con Gradio, Streamlit e Docker, fornendo ai professionisti una grande quantità di flessibilità nella presentazione dei propri modelli. È possibile utilizzare il proprio framework di apprendimento automatico per creare una demo con Spaces.

La libreria Gradio fornisce diversi componenti per la creazione di applicazioni di Computer Vision su spazi come Video , Gallery e Model3D . La comunità ha lavorato duramente per creare alcune straordinarie applicazioni di Computer Vision che sono alimentate da Spaces:

  • Genera voxel 3D da una mappa di profondità prevista di un’immagine di input
  • Segmentazione semantica a vocabolario aperto
  • Narra video generando didascalie
  • Classifica video da YouTube
  • Classificazione video senza vincoli
  • Domande e risposte visive
  • Utilizza la classificazione di immagini senza vincoli per trovare le migliori didascalie per un’immagine per generare immagini simili

🤗 AutoTrain

AutoTrain fornisce una soluzione “no-code” per addestrare modelli di Machine Learning di ultima generazione per compiti come la classificazione del testo, la sintesi del testo, il rilevamento delle entità nominate e altro ancora. Per la Computer Vision, attualmente supportiamo la classificazione delle immagini , ma ci si può aspettare una maggiore copertura dei compiti.

AutoTrain consente anche la valutazione automatica dei modelli . Questa applicazione consente di valutare i modelli dei Transformers 🤗 su una vasta gamma di dataset nell’Hub. I risultati della valutazione verranno visualizzati nelle classifiche pubbliche . Puoi controllare questo post del blog per ulteriori dettagli.

La filosofia tecnica

In questa sezione, volevamo condividere la nostra filosofia dietro l’aggiunta del supporto per la Computer Vision nei Transformers 🤗 in modo che la comunità sia consapevole delle scelte di progettazione specifiche per questa area.

Anche se i Transformers sono nati con il NLP, oggi supportiamo più modalità, ad esempio – visione, audio, visione-linguaggio e Reinforcement Learning. Per tutte queste modalità, tutti i modelli corrispondenti dei Transformers godono di alcuni vantaggi comuni:

  • Facile download del modello con una sola riga di codice con from_pretrained()
  • Facile caricamento del modello con push_to_hub()
  • Supporto per il caricamento di checkpoint enormi con tecniche di suddivisione efficiente dei checkpoint
  • Supporto all’ottimizzazione (con strumenti come Optimum )
  • Inizializzazione dalle configurazioni del modello
  • Supporto sia per PyTorch che per TensorFlow (non esaustivo)
  • e molti altri

A differenza dei tokenizzatori, abbiamo dei preprocessori (come questo ) che si occupano di preparare i dati per i modelli di visione. Abbiamo lavorato duramente per garantire che l’esperienza dell’utente nell’utilizzo di un modello di visione sia ancora facile e simile:

from transformers import ViTImageProcessor, ViTForImageClassification
import torch
from datasets import load_dataset

dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]

image_processor  = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")
inputs = image_processor(image, return_tensors="pt")

with torch.no_grad():
    logits = model(**inputs).logits

# il modello predice una delle 1000 classi ImageNet
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])
# Gatto egiziano

Anche per un compito difficile come il rilevamento degli oggetti, l’esperienza dell’utente non cambia molto:

from transformers import AutoImageProcessor, AutoModelForObjectDetection
from PIL import Image
import requests

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

image_processor = AutoImageProcessor.from_pretrained("microsoft/conditional-detr-resnet-50")
model = AutoModelForObjectDetection.from_pretrained("microsoft/conditional-detr-resnet-50")
inputs = image_processor(images=image, return_tensors="pt")

outputs = model(**inputs)

# converti gli output (bounding box e logit di classe) in API COCO
target_sizes = torch.tensor([image.size[::-1]])
results = image_processor.post_process_object_detection(
    outputs, threshold=0.5, target_sizes=target_sizes
)[0]

for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Rilevato {model.config.id2label[label.item()]} con fiducia "
        f"{round(score.item(), 3)} nella posizione {box}"
    )

Porta a:

Rilevato telecomando con fiducia 0.833 nella posizione [38.31, 72.1, 177.63, 118.45]
Rilevato gatto con fiducia 0.831 nella posizione [9.2, 51.38, 321.13, 469.0]
Rilevato gatto con fiducia 0.804 nella posizione [340.3, 16.85, 642.93, 370.95]
Rilevato telecomando con fiducia 0.683 nella posizione [334.48, 73.49, 366.37, 190.01]
Rilevato divano con fiducia 0.535 nella posizione [0.52, 1.19, 640.35, 475.1]

Modelli zero-shot per la visione

C’è stato un aumento di modelli che riformulano compiti di visione centrali come la segmentazione e la rilevazione in modi interessanti e introducono ancora più flessibilità. Supportiamo alcuni di questi modelli da Transformers:

  • CLIP che consente la classificazione delle immagini zero-shot con prompt. Dato un’immagine, puoi suggerire al modello CLIP una query in linguaggio naturale come “un’immagine di {}”. L’obiettivo è ottenere l’etichetta di classe come risposta.
  • OWL-ViT che consente la rilevazione degli oggetti zero-shot condizionata al linguaggio e la rilevazione degli oggetti one-shot condizionata all’immagine. Ciò significa che puoi rilevare gli oggetti in un’immagine anche se il modello sottostante non ha imparato a rilevarli durante l’addestramento! Puoi fare riferimento a questo notebook per saperne di più.
  • CLIPSeg che supporta la segmentazione delle immagini zero-shot condizionata al linguaggio e la segmentazione delle immagini one-shot condizionata all’immagine. Ciò significa che puoi segmentare gli oggetti in un’immagine anche se il modello sottostante non ha imparato a segmentarli durante l’addestramento! Puoi fare riferimento a questo post sul blog che illustra questa idea. GroupViT supporta anche il compito di segmentazione zero-shot.
  • X-CLIP che mostra la generalizzazione zero-shot ai video. In particolare, supporta la classificazione dei video zero-shot. Dai un’occhiata a questo notebook per ulteriori dettagli.

La comunità può aspettarsi di vedere più modelli zero-shot per la computer vision supportati da 🤗Transformers nei prossimi giorni.

Deploy

Come dice il nostro CTO Julien – “i veri artisti consegnano” 🚀

Supportiamo il deploy di questi modelli di visione attraverso 🤗Inference Endpoints. Inference Endpoints si integra direttamente con modelli compatibili relativi alla classificazione delle immagini, alla rilevazione degli oggetti e alla segmentazione delle immagini. Per altri compiti, puoi utilizzare i gestori personalizzati. Poiché forniamo anche molti modelli di visione in TensorFlow da 🤗Transformers per il loro deploy, consigliamo di utilizzare i gestori personalizzati o di seguire queste risorse:

  • Deploy di modelli vision in TensorFlow su Hugging Face con TF Serving
  • Deploy di 🤗 ViT su Kubernetes con TF Serving
  • Deploy di 🤗 ViT su Vertex AI
  • Deploy di ViT con TFX e Vertex AI

Conclusione

In questo post, ti abbiamo fornito una panoramica delle cose attualmente supportate dall’ecosistema di Hugging Face per potenziare la prossima generazione di applicazioni di Computer Vision. Speriamo che ti divertirai a utilizzare queste offerte per costruire in modo affidabile e responsabile.

C’è ancora molto da fare. Ecco alcune cose che puoi aspettarti di vedere:

  • Supporto diretto dei video da 🤗 Datasets
  • Supporto di compiti più rilevanti per l’industria come la similarità delle immagini
  • Interoperabilità dei dataset di immagini con TensorFlow
  • Un corso di Computer Vision dalla comunità di 🤗

Come sempre, accogliamo i tuoi patch, PR, checkpoint dei modelli, dataset e altre contribuzioni! 🤗

Riconoscimenti: Grazie a Omar Sanseviero, Nate Raw, Niels Rogge, Alara Dirik, Amy Roberts, Maria Khalusova e Lysandre Debut per le loro recensioni rigorose e tempestive sulla bozza del blog. Grazie a Chunte Lee per la creazione della miniatura del blog.