Come Delivery Hero ha implementato il sistema di sicurezza per le immagini generate dall'IA
In qualità di azienda multinazionale di consegna di cibo online, Delivery Hero mette in contatto i clienti con i ristoranti nelle rispettive aree. Pertanto, è fondamentale per l'azienda comprendere le esigenze di entrambe le parti per mantenere la loro soddisfazione complessiva nei confronti dei servizi di Delivery Hero.
In una presentazione al Zilliz Unstructured Data Meetup a Berlino, Iaroslav Amerkhanov e Nikolay Ulyanov, due data scientist di Delivery Hero, hanno discusso il loro progetto di ricerca per ottimizzare le esigenze dei fornitori di ristoranti e dei clienti.
<< Guarda il replay dell'intervento al meetup >>
Sulla base di statistiche interne, Delivery Hero ha scoperto un fatto interessante: i prodotti con un'immagine associata sull'app vengono ordinati molto più frequentemente rispetto ai prodotti senza immagine. In particolare, l'86% dei prodotti ordinati sull'app ha un'immagine associata. Dopo aver condotto test A/B, hanno anche scoperto che il tasso di conversione aumenta del 6-8% semplicemente aggiungendo un'immagine a un prodotto. Questa scoperta significa che l'immagine di un prodotto è uno dei fattori cruciali per i clienti prima di ordinare cibo dai fornitori sull'app Delivery Hero.
Tuttavia, chiedere a ogni ristorante o fornitore di fornire un'immagine dei propri prodotti può essere gravoso, poiché non tutti i fornitori sono in grado di fornire foto accattivanti. Pertanto, i data scientist di Delivery Hero hanno proposto un approccio sofisticato per generare immagini di alta qualità di un prodotto sfruttando i progressi dell'IA. Il loro approccio consiste in due fasi: la generazione di immagini di cibo e il sistema di sicurezza.
Discutiamo prima la fase di generazione di immagini di cibo.
Generazione di immagini di cibo
Delivery Hero implementa due approcci per generare un'immagine di prodotto: uno prevede la chiamata all'API delle piattaforme di IA generativa disponibili, mentre l'altro utilizza il metodo di image inpainting.
Generazione di immagini di cibo con un modello popolare di generazione di immagini
Sono disponibili diversi modelli di IA per generare immagini fotorealistiche di alta qualità, tra cui DALL-E, Midjourney e stable diffusion. A questo scopo, Delivery Hero utilizza DALL-E per generare un'immagine di cibo.
Come il modello GPT-3, DALL-E utilizza blocchi Transformer-decoder come struttura portante. Ciò non sorprende, poiché l'architettura Transformer è estremamente versatile e in grado di generare dati in diverse modalità, come testi e immagini. In sostanza, DALL-E viene addestrato a generare immagini a partire da descrizioni testuali.
Immagini di esempio generate da DALL-E a partire da descrizioni testuali
Usare DALL-E per generare un'immagine è semplice. L'unico requisito è fornire un prompt testuale che descriva l'immagine che si desidera generare. Il prompt utilizzato da Delivery Hero per generare un'immagine di cibo è il seguente:
a professional photo of {dish} and {dish\_attributes} on a nice plate, {background} background
Con questo prompt, Delivery Hero genera immagini di alta qualità di un piatto con attributi e sfondi specifici.
Immagini di alta qualità di un piatto con attributi e sfondi specifici generate da DALL-E.png
Generazione di immagini di cibo con Image Inpainting
Il secondo approccio di Delivery Hero alla generazione di immagini di cibo prevede una tecnica di inpainting. L'image inpainting si riferisce al processo di sostituzione di aree specifiche di un'immagine.
Nel complesso, Delivery Hero implementa quattro passaggi per generare immagini di cibo utilizzando questo approccio:
Selezione dell'immagine: Selezionare l'immagine di un piatto dal loro data hub.
Rilevamento degli oggetti: Rilevare l'oggetto cibo nell'immagine utilizzando un modello di rilevamento degli oggetti. Come output, si ottiene un bounding box del cibo rilevato.
Mascheramento delle immagini: rimuove le aree all’interno del riquadro di delimitazione sostituendo i valori dei pixel con nero o bianco.
Inpainting delle immagini: utilizza un modello di generazione di immagini per riempire le aree rimosse dell’immagine con il piatto di nostra scelta.
Generazione di immagini con la tecnica di inpainting
Delivery Hero utilizza due modelli per questo approccio: Grounding DINO per il rilevamento degli oggetti e DALL-E per l’inpainting delle immagini.
Ora analizziamo ciascun punto dell’approccio di inpainting delle immagini sopra descritto. Possiamo saltare la fase di selezione dell’immagine, poiché è semplice. La fase più interessante è quella del rilevamento degli oggetti tramite Grounding DINO.
In poche parole, Grounding DINO è un modello di rilevamento degli oggetti che prende in input una coppia di testo e immagini. Utilizza tre diversi approcci di fusione degli input: un potenziatore di caratteristiche, una selezione delle query guidata dal linguaggio e un decoder cross-modale per combinare efficacemente l’input testuale e quello dell’immagine, producendo un potente modello di rilevamento degli oggetti.
L’architettura di alto livello del potenziatore di caratteristiche e del decoder cross-modale è piuttosto simile all’architettura a blocchi Transformer, che include livelli di attenzione e reti neurali feed-forward. Tuttavia, entrambi i componenti dispongono di sofisticati livelli di cross-attention da immagine a testo e da testo a immagine per fondere l’input testuale e quello dell’immagine, come mostrato nella visualizzazione seguente
L’architettura di alto livello del potenziatore di caratteristiche e del decoder cross-modale .png
Puoi implementare facilmente Grounding DINO usando HuggingFace. Se vuoi seguire passo passo, il codice mostrato in questo articolo è disponibile in questo notebook.
Supponiamo di voler rilevare un cupcake dall’immagine mostrata di seguito. Il seguente frammento di codice può ottenere il riquadro di delimitazione della torta con Grounding DINO.
!pip install diffusers
import requests
import torch
import os
from PIL import Image
from transformers import AutoProcessor, AutoModelForZeroShotObjectDetection
import numpy as np
from diffusers import AutoPipelineForInpainting
from diffusers.utils import make_image_grid
model_id = "IDEA-Research/grounding-dino-tiny"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForZeroShotObjectDetection.from_pretrained(model_id).to('cpu')
image_url = "<https://farm4.staticflickr.com/3688/9612791241_1484851c78_z.jpg>"
image = Image.open(requests.get(image_url, stream=True).raw)
# Check for a cake
text = "a cake."
inputs = processor(images=image, text=text, return_tensors="pt").to('cpu')
with torch.no_grad():
outputs = model(**inputs)
results = processor.post_process_grounded_object_detection(
outputs,
inputs.input_ids,
box_threshold=0.4,
text_threshold=0.3,
target_sizes=[image.size[::-1]]
)
print(results)
"""
Output:
[{'scores': tensor([0.8716]), 'labels': ['a cake'], 'boxes': tensor([[244.4494, 233.1335, 360.1640, 333.2773]])}]
"""
Utilizzo di Grounding DINO per rilevare un cupcake dall’immagine.png
Possiamo rilevare l’oggetto torta nell’immagine fornita!
Successivamente, possiamo rimuovere l’oggetto rilevato da Grounding DINO usando il metodo di mascheramento. Dopo aver applicato il metodo di mascheramento, dovremmo ottenere un’immagine di output con valori dei pixel contrastanti per l’area tra l’esterno e l’interno del riquadro di delimitazione rilevato.
left, top, right, bottom = results[0]["boxes"][0].tolist()
left = int(left)
top = int(top)
right = int(right)
bottom = int(bottom)
# Crea un'immagine nera vuota
image_url = "<https://farm4.staticflickr.com/3688/9612791241_1484851c78_z.jpg>"
image = Image.open(requests.get(image_url, stream=True).raw)
width, height = image.width, image.height # You can set the desired dimensions of the image
mask = np.zeros((height, width), dtype=np.uint8)
# Set the area inside the bounding box to white (255)
mask[top:bottom, left:right] = 255
mask_image = Image.fromarray(mask)
Maschera il contenuto rilevato da Grounding DINO.png
Ora che abbiamo la versione mascherata dell'immagine, implementiamo il passaggio di image inpainting.
Poiché DALL-E non è un modello open-source e l'uso della sua API non è gratuito, nel seguente esempio sostituiremo questo modello con un modello open-source di generazione di immagini. Nello specifico, implementeremo il modello Stable Diffusion per l'image inpainting con l'aiuto di HuggingFace.
Supponiamo di voler sostituire un cupcake nell'immagine con una tazza di caffè. Possiamo farlo con il seguente codice:
pipeline = AutoPipelineForInpainting.from_pretrained(
"runwayml/stable-diffusion-inpainting", torch_dtype=torch.float16, variant="fp16"
)
pipeline = pipeline.to("cuda")
generator = torch.Generator("cuda").manual_seed(92)
prompt = "a coffee, 8k"
inpaint_image = pipeline(prompt=prompt, image=image, mask_image=mask_image, generator=generator).images[0]
newsize = (image.width, image.height)
inpaint_image = inpaint_image.resize(newsize)
make_image_grid([image, inpaint_image], rows=1, cols=2)
Sostituisci il cupcake nell'immagine con una tazza di caffè usando Stable Diffusion.png
Questo è tutto ciò che dobbiamo fare per ricreare il metodo di image inpainting implementato da Delivery Hero!
La qualità delle immagini generate dall'AI implementata da Delivery Hero è molto buona. Con questo approccio, possono consigliare un catalogo di immagini alimentari di alta qualità di un prodotto tra cui i venditori possono scegliere.
Tuttavia, incontrano un problema significativo durante il processo di generazione di immagini alimentari: l'aspetto della sicurezza. Discuteremo questo problema nel passaggio successivo.
Creazione di un sistema di sicurezza
Il sofisticato approccio alla generazione di immagini discusso nella sezione precedente si basa su un prompt testuale. Ciò significa che, a volte, il modello di generazione di immagini può fraintendere la nostra intenzione.
Ad esempio, supponiamo di voler generare un'immagine alimentare di un pollo su un piatto. Senza alcun controllo di sicurezza, il modello potrebbe generare immagini come le seguenti:
L'immagine che vogliamo vs. l'immagine generata dall'AI senza alcun controllo di sicurezza .png
Pertanto, abbiamo bisogno di un componente per controllare la qualità dell'immagine generata dal modello. È qui che entra in gioco il sistema di sicurezza.
Delivery Hero implementa il sistema di sicurezza basato su quattro componenti: tagging delle immagini, centratura delle immagini, rilevamento del testo e nitidezza delle immagini. Nella presentazione del meetup, il team di Delivery Hero si è concentrato su due componenti: tagging delle immagini e centratura delle immagini.
Tagging delle immagini
Il primo approccio implementato da Delivery Hero come sistema di sicurezza è il tagging dell'immagine generata dal modello di generazione di immagini. Il tagging delle immagini si riferisce al processo di previsione dei tag di un'immagine con l'aiuto di un modello di machine learning. A tale scopo, Delivery Hero ha utilizzato un modello chiamato Recognize-Anything Plus Model (RAM++).
RAM++ è un potente modello di tagging delle immagini con un'eccezionale generalizzazione zero-shot. Grazie alla sua integrazione con LLM, può riconoscere 4.585 tag unici.
RAM++ riceve tre input diversi durante il processo di addestramento: immagine, testo e tag. La combinazione di testo e tag arricchisce l’ambito dei concetti visivi che possono essere inferiti da un’immagine. Per migliorare ulteriormente la generalizzazione del modello, RAM++ utilizza ChatGPT per creare diverse varietà di descrizioni di ciascun tag basate su cinque prompt diversi:
Descrivi in modo conciso che aspetto ha un(a) {tag}.
Come puoi identificare in modo conciso un(a) {tag}?
Che aspetto ha in modo conciso un(a) {tag}?
Quali sono le caratteristiche identificate di un(a) {tag}?
Fornisci una descrizione concisa delle caratteristiche visive di {tag}.
Image tagging- tag-to-text:RAM:RAM++ architecture .png
Queste descrizioni dei tag generate da GPT 3.5 Turbo ampliano il significato semantico di ciascun tag, migliorando quindi l’ambito dei concetti visivi di un’immagine.
Le descrizioni di testo e tag vengono quindi passate a un codificatore di testo, mentre l’immagine viene passata a un codificatore di immagine. I risultati di questi codificatori vengono poi fusi all’interno di un cosiddetto blocco decoder di allineamento, che consiste in livelli di cross-attention e feed-forward per generare i tag finali dell’immagine.
Per implementare RAM++ per generare un tag di immagine, dobbiamo prima installare la libreria recognize-anything e poi utilizzare la riga di comando per generare il tag dell’immagine. Nell’esempio seguente, prediremo il tag dell’immagine che abbiamo utilizzato nella sezione precedente.
!git clone <https://github.com/xinyu1205/recognize-anything.git>
%cd recognize-anything
!pip install -e .
if not os.path.exists('pretrained'):
os.makedirs('pretrained')
if not os.path.exists('images'):
os.makedirs('images')
# Download swin transformers checkpoint
!wget <https://huggingface.co/xinyu1205/recognize-anything-plus-model/resolve/main/ram_plus_swin_large_14m.pth> -O pretrained/ram_plus_swin_large_14m.pth
# Download input image
!wget <https://farm4.staticflickr.com/3688/9612791241_1484851c78_z.jpg> -O images/cupcake_and_coffee.jpg
%cd recognize-anything
# Image tagging inference
!python inference_ram_plus.py --image images/cupcake_and_coffee.jpg \\
--pretrained pretrained/ram_plus_swin_large_14m.pth
Nel comando di esempio sopra, utilizziamo il modello Swin-Transformer come codificatore di immagine, e di seguito è riportato l’output che dovremmo ottenere:
The tags generated by the Swin-Transformer model .png
Come puoi vedere, otteniamo tag come “beverage,” “cloth,” “coffee,” “coffee cup,” “cup,” “cupcake,” “table,” “dining table,” “plate,” ecc. per le nostre immagini.
Tra tutte le 4585 categorie di tag, i data scientist di Delivery Hero hanno identificato 10 tag "food" e 50 tag "negative". I tag "negative" includono diversi tag associati agli animali, come “bug”, “beetle”, “ant”, “hornet”, ecc.
Image tagging with the Swin-Transformer model.png
Quindi, hanno assegnato un punteggio a ciascuna immagine di cibo generata dall’AI in base ai tag previsti dal modello RAM++.
Il punteggio è 1 se l’immagine contiene almeno un tag "food" e nessun tag "negative".
Il punteggio è 0 se l’immagine contiene un tag "negative".
Centratura dell’immagine
Un altro componente implementato dai data scientist di Delivery Hero per migliorare la sicurezza delle immagini generate dall’AI è la centratura dell’immagine. In questo componente, viene valutata la proporzionalità dell’immagine generata. Come probabilmente già sai, il cibo al centro di un’immagine è più accattivante rispetto a uno al bordo o tagliato dall’immagine.
Per valutare la proporzionalità dell’immagine, Delivery Hero utilizza Grounding DINO, descritto nella sezione precedente, per rilevare l’oggetto cibo in un’immagine. Quindi, il bounding box prodotto dal modello verrà valutato per determinare la qualità dell’immagine.
Il sistema di punteggio è il seguente:
0 se non viene rilevato alcun cibo o oggetto piatto
0,5 se il riquadro di delimitazione tocca il bordo dell’immagine
1 se il riquadro di delimitazione si trova al centro dell’immagine
Il passaggio finale consiste nel combinare il punteggio di ciascun componente con una funzione ponderata. Alla fine, ogni immagine ha un punteggio ponderato derivante dai quattro componenti. Applicando un valore soglia, un’immagine con un punteggio ponderato inferiore a tale soglia verrebbe filtrata ed esclusa dalle raccomandazioni ai fornitori.
Image scoring.png
Conclusione
In questo articolo, abbiamo discusso di come due data scientist di Delivery Hero utilizzino modelli di IA per generare immagini di cibo di alta qualità al fine di migliorare l’esperienza utente e il tasso di conversione. Il loro approccio consiste in due fasi: generazione di immagini di cibo e creazione di un sistema di sicurezza.
Hanno utilizzato DALL-E di OpenAI per generare l’immagine e implementato un metodo di inpainting delle immagini con l’aiuto di Grounding DINO e DALL-E. Il team ha adottato quattro componenti per generare un punteggio finale per determinare la sicurezza di un’immagine generata: tagging dell’immagine, centratura dell’immagine, rilevamento del testo e nitidezza dell’immagine. I punteggi ottenuti da questi quattro componenti vengono poi combinati con una funzione ponderata per assegnare a ciascuna immagine un unico valore di punteggio finale. Applicando una soglia, un’immagine con un punteggio finale inferiore alla soglia verrà filtrata ed esclusa dalle raccomandazioni ai fornitori.
Puoi accedere al codice dimostrato in questo articolo tramite questo notebook.
Puoi guardare la replica dell’intervento del team di Delivery Hero su YouTube.
Continua a leggere

Why I’m Against Claude Code’s Grep-Only Retrieval? It Just Burns Too Many Tokens
Learn how vector-based code retrieval cuts Claude Code token consumption by 40%. Open-source solution with easy MCP integration. Try claude-context today.

The Real Bottlenecks in Autonomous Driving — And How AI Infrastructure Can Solve Them
Autonomous driving faces a data bottleneck. Learn how AI-native vector databases like Zilliz solve scale, cost, and insight challenges across AV pipelines.

Vector Databases vs. Time Series Databases
Use a vector database for similarity search and semantic relationships; use a time series database for tracking value changes over time.


