Wie Delivery Hero das Sicherheitssystem für KI-generierte Bilder implementierte
Als multinationales Online-Unternehmen für Essenslieferungen verbindet Delivery Hero Kund:innen mit Restaurants in ihren jeweiligen Gebieten. Daher ist es für das Unternehmen entscheidend, die Bedürfnisse beider Parteien zu verstehen, um ihre allgemeine Zufriedenheit mit den Dienstleistungen von Delivery Hero aufrechtzuerhalten.
In einer Präsentation beim Zilliz Unstructured Data Meetup in Berlin diskutierten Iaroslav Amerkhanov und Nikolay Ulyanov, zwei Data Scientists bei Delivery Hero, ihr Forschungsprojekt zur Optimierung der Bedürfnisse von Restaurantanbietern und Kund:innen.
<< Aufzeichnung des Meetup-Vortrags ansehen >>
Basierend auf internen Statistiken stellte Delivery Hero eine interessante Tatsache fest: Produkte, denen in der App ein Bild beigefügt ist, werden deutlich häufiger bestellt als Produkte ohne Bild. Konkret haben 86 % der in der App bestellten Produkte ein beigefügtes Bild. Nach der Durchführung von A/B-Tests stellten sie außerdem fest, dass die Conversion-Rate allein durch das Hinzufügen eines Bildes zu einem Produkt um 6–8 % steigt. Diese Erkenntnis bedeutet, dass das Bild eines Produkts einer der entscheidenden Faktoren für Kund:innen ist, bevor sie Essen von Anbietern in der Delivery Hero-App bestellen.
Allerdings kann es mühsam sein, jedes Restaurant oder jeden Anbieter zu bitten, ein Bild seiner Produkte bereitzustellen, da nicht jeder Anbieter ansprechende Bilder liefern kann. Daher schlugen Data Scientists bei Delivery Hero einen ausgefeilten Ansatz vor, um mithilfe von KI-Fortschritten hochwertige Bilder eines Produkts zu generieren. Ihr Ansatz besteht aus zwei Phasen: der Generierung von Essensbildern und dem Sicherheitssystem.
Lassen Sie uns zunächst die Phase der Generierung von Essensbildern besprechen.
Generierung von Essensbildern
Delivery Hero implementiert zwei Ansätze zur Generierung eines Produktbildes: Einer beinhaltet den Aufruf der API verfügbarer generativer KI-Plattformen, der andere verwendet die Methode des Image Inpainting.
Generierung von Essensbildern mit einem beliebten Bildgenerierungsmodell
Es stehen mehrere KI-Modelle zur Verfügung, um hochwertige, fotorealistische Bilder zu generieren, darunter DALL-E, Midjourney und stable diffusion. Zu diesem Zweck verwendet Delivery Hero DALL-E, um ein Essensbild zu generieren.
Wie das GPT-3-Modell verwendet DALL-E Transformer-Decoder-Blöcke als Rückgrat. Das ist nicht überraschend, da die Transformer-Architektur äußerst vielseitig ist und Daten in verschiedenen Modalitäten wie Texten und Bildern generieren kann. Im Wesentlichen wird DALL-E darauf trainiert, Bilder aus Textbeschreibungen zu generieren.
Beispielbilder, die von DALL-E aus Textbeschreibungen generiert wurden
Die Verwendung von DALL-E zur Generierung eines Bildes ist unkompliziert. Die einzige Voraussetzung ist die Bereitstellung eines Text-Prompts, der das Bild beschreibt, das generiert werden soll. Der von Delivery Hero zur Generierung eines Essensbildes verwendete Prompt lautet wie folgt:
a professional photo of {dish} and {dish\_attributes} on a nice plate, {background} background
Mit diesem Prompt generiert Delivery Hero hochwertige Bilder eines Gerichts mit spezifischen Attributen und Hintergründen.
Hochwertige Bilder eines Gerichts mit spezifischen Attributen und Hintergründen, generiert von DALL-E.png
Generierung von Essensbildern mit Image Inpainting
Der zweite Ansatz von Delivery Hero zur Generierung von Essensbildern beinhaltet eine Inpainting-Technik. Image Inpainting bezeichnet den Prozess des Ersetzens bestimmter Bereiche eines Bildes.
Insgesamt implementiert Delivery Hero vier Schritte, um mit diesem Ansatz Essensbilder zu generieren:
Bildauswahl: Wählen Sie ein Bild eines Gerichts aus ihrem Data Hub aus.
Objekterkennung: Erkennen Sie das Lebensmittelobjekt im Bild mithilfe eines Objekterkennungsmodells. Als Ausgabe wird eine Bounding Box des erkannten Lebensmittels erhalten.
Bildmaskierung: Entfernen Sie die Bereiche innerhalb der Bounding Box, indem Sie die Pixelwerte durch Schwarz oder Weiß ersetzen.
Bild-Inpainting: Verwenden Sie ein Bildgenerierungsmodell, um die entfernten Bereiche des Bildes mit dem Gericht unserer Wahl zu füllen.
Bildgenerierung mit der Inpainting-Technik
Delivery Hero verwendet für diesen Ansatz zwei Modelle: Grounding DINO für die Objekterkennung und DALL-E für das Bild-Inpainting.
Sehen wir uns nun jeden Punkt des oben beschriebenen Bild-Inpainting-Ansatzes genauer an. Den Schritt der Bildauswahl können wir überspringen, da er unkompliziert ist. Interessanter ist der Schritt der Objekterkennung mit Grounding DINO.
Kurz gesagt ist Grounding DINO ein Objekterkennungsmodell, das ein Paar aus Text und Bildern als Eingabe verwendet. Es nutzt drei verschiedene Ansätze zur Eingabefusion: einen Feature Enhancer, eine sprachgesteuerte Abfrageauswahl und einen Cross-Modality Decoder, um Text- und Bildeingabe effektiv zu kombinieren und ein leistungsstarkes Objekterkennungsmodell zu erzeugen.
Die High-Level-Architektur des Feature Enhancers und des Cross-Modality Decoders ist der Transformer-Block-Architektur recht ähnlich, die Attention-Schichten und Feed-Forward-Neuronale Netze umfasst. Beide Komponenten verfügen jedoch über ausgeklügelte Bild-zu-Text- und Text-zu-Bild-Cross-Attention-Schichten, um die Text- und Bildeingabe zu fusionieren, wie in der folgenden Visualisierung gezeigt
Die High-Level-Architektur des Feature Enhancers und Cross-Modality Decoders .png
Sie können Grounding DINO problemlos mit HuggingFace implementieren. Wenn Sie mitmachen möchten, finden Sie den in diesem Artikel gezeigten Code in diesem Notebook.
Nehmen wir an, wir möchten einen Cupcake aus dem unten gezeigten Bild erkennen. Das folgende Code-Snippet kann die Bounding Box des Kuchens mit Grounding DINO ermitteln.
!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]])}]
"""
Verwendung von Grounding DINO zur Erkennung eines Cupcakes aus dem Bild.png
Wir können das Kuchenobjekt im bereitgestellten Bild erkennen!
Als Nächstes können wir das von Grounding DINO erkannte Objekt mithilfe der Maskierungsmethode entfernen. Nach Anwendung der Maskierungsmethode sollten wir eine Bildausgabe mit kontrastierenden Pixelwerten für den Bereich zwischen außerhalb und innerhalb der erkannten Bounding Box erhalten.
left, top, right, bottom = results[0]["boxes"][0].tolist()
left = int(left)
top = int(top)
right = int(right)
bottom = int(bottom)
# Create an empty black image
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)
Den von Grounding DINO erkannten Inhalt maskieren.png
Da wir nun die maskierte Version des Bildes haben, implementieren wir den Schritt des Bild-Inpaintings.
Da DALL-E kein Open-Source-Modell ist und die Nutzung seiner API nicht kostenlos ist, werden wir dieses Modell im folgenden Beispiel durch ein Open-Source-Bildgenerierungsmodell ersetzen. Konkret werden wir das Stable-Diffusion-Modell für Bild-Inpainting mithilfe von HuggingFace implementieren.
Nehmen wir an, wir möchten einen Cupcake im Bild durch eine Tasse Kaffee ersetzen. Das können wir mit dem folgenden Code tun:
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)
Den Cupcake im Bild mit Stable Diffusion durch eine Tasse Kaffee ersetzen.png
Das ist alles, was wir tun müssen, um die von Delivery Hero implementierte Bild-Inpainting-Methode nachzubilden!
Die Qualität der von Delivery Hero implementierten KI-generierten Bilder ist sehr gut. Mit diesem Ansatz können sie einen Katalog hochwertiger Lebensmittelbilder eines Produkts empfehlen, aus dem Anbieter auswählen können.
Während des Prozesses der Lebensmittelbildgenerierung stoßen sie jedoch auf ein erhebliches Problem: den Sicherheitsaspekt. Dieses Thema besprechen wir im nächsten Schritt.
Aufbau eines Sicherheitssystems
Der im vorherigen Abschnitt besprochene ausgefeilte Ansatz zur Bildgenerierung basiert auf einem Text-Prompt. Das bedeutet, dass das Bildgenerierungsmodell manchmal unsere Absicht missverstehen kann.
Nehmen wir zum Beispiel an, wir möchten ein Lebensmittelbild von einem Hähnchen auf einem Teller erzeugen. Ohne jegliche Sicherheitskontrolle könnte das Modell Bilder wie die folgenden erzeugen:
Das gewünschte Bild im Vergleich zum von KI ohne jegliche Sicherheitskontrolle erzeugten Bild .png
Daher benötigen wir eine Komponente, um die Qualität der vom Modell erzeugten Bilder zu kontrollieren. Hier kommt das Sicherheitssystem ins Spiel.
Delivery Hero implementiert das Sicherheitssystem auf Basis von vier Komponenten: Bild-Tagging, Bildzentrierung, Texterkennung und Bildschärfe. In der Meetup-Präsentation konzentrierte sich das Delivery-Hero-Team auf zwei Komponenten: Bild-Tagging und Bildzentrierung.
Bild-Tagging
Der erste Ansatz, den Delivery Hero als Sicherheitssystem implementiert, besteht darin, das vom Bildgenerierungsmodell erzeugte Bild zu taggen. Bild-Tagging bezeichnet den Prozess der Vorhersage der Tags eines Bildes mithilfe eines Machine-Learning-Modells. Zu diesem Zweck nutzte Delivery Hero ein Modell namens Recognize-Anything Plus Model (RAM++).
RAM++ ist ein leistungsstarkes Bild-Tagging-Modell mit außergewöhnlicher Zero-Shot-Generalisierung. Dank seiner LLM-Integration kann es 4.585 eindeutige Tags erkennen.
RAM++ erhält während des Trainingsprozesses drei verschiedene Eingaben: Bild, Text und Tag. Die Kombination aus Text und Tag erweitert den Umfang visueller Konzepte, die aus einem Bild abgeleitet werden können. Um die Generalisierungsfähigkeit des Modells noch weiter zu verbessern, nutzt RAM++ ChatGPT, um auf Basis von fünf verschiedenen Prompts unterschiedliche Varianten von Beschreibungen jedes Tags zu erstellen:
Beschreibe prägnant, wie ein(e) {tag} aussieht.
Wie kann man ein(e) {tag} prägnant identifizieren?
Wie sieht ein(e) {tag} prägnant aus?
Was sind die identifizierten Merkmale eines/einer {tag}?
Bitte stelle eine prägnante Beschreibung der visuellen Merkmale von {tag} bereit.
Image tagging- tag-to-text:RAM:RAM++ Architektur .png
Diese von GPT 3.5 Turbo generierten Tag-Beschreibungen erweitern die semantische Bedeutung jedes Tags und verbessern dadurch den Umfang der visuellen Konzepte eines Bildes.
Die Text- und Tag-Beschreibungen werden anschließend an einen Text-Encoder übergeben, während das Bild an einen Bild-Encoder übergeben wird. Die Ergebnisse dieser Encoder werden dann innerhalb eines sogenannten Alignment-Decoder-Blocks fusioniert, der aus Cross-Attention- und Feed-Forward-Schichten besteht, um die finalen Tags des Bildes zu erzeugen.
Um RAM++ zur Generierung eines Bild-Tags zu implementieren, müssen wir zunächst die recognize-anything-Bibliothek installieren und anschließend die Befehlszeile verwenden, um den Bild-Tag zu generieren. Im folgenden Beispiel sagen wir den Bild-Tag voraus, den wir im vorherigen Abschnitt verwendet haben.
!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
Im obigen Beispielbefehl verwenden wir das Swin-Transformer-Modell als Bild-Encoder, und unten ist die Ausgabe, die wir erhalten sollten:
Die vom Swin-Transformer-Modell generierten Tags .png
Wie Sie sehen können, erhalten wir Tags wie „beverage“, „cloth“, „coffee“, „coffee cup“, „cup“, „cupcake“, „table“, „dining table“, „plate“ usw. für unsere Bilder.
Unter allen 4585 Tag-Kategorien identifizierten Data Scientists bei Delivery Hero 10 „food“-Tags und 50 „negative“ Tags. Die „negative“ Tags umfassen mehrere Tags, die mit Tieren verbunden sind, wie „bug“, „beetle“, „ant“, „hornet“ usw.
Image Tagging mit dem Swin-Transformer-Modell.png
Anschließend wiesen sie jedem KI-generierten Lebensmittelbild eine Bewertung basierend auf den vom RAM++-Modell vorhergesagten Tags zu.
Die Bewertung ist 1, wenn das Bild mindestens einen „food“-Tag und keine „negative“ Tags enthält.
Die Bewertung ist 0, wenn das Bild einen „negative“ Tag enthält.
Bildzentrierung
Eine weitere Komponente, die von Data Scientists bei Delivery Hero implementiert wurde, um die Sicherheit KI-generierter Bilder zu erhöhen, ist die Bildzentrierung. In dieser Komponente wird die Proportionalität des generierten Bildes bewertet. Wie Sie vielleicht bereits wissen, wirkt Essen in der Mitte eines Bildes ansprechender als Essen am Rand oder abgeschnitten im Bild.
Um die Bildproportionalität zu bewerten, nutzt Delivery Hero Grounding DINO, das im vorherigen Abschnitt beschrieben wurde, um das Lebensmittelobjekt in einem Bild zu erkennen. Anschließend wird die vom Modell erzeugte Bounding Box bewertet, um die Qualität des Bildes zu bestimmen.
Das Bewertungssystem ist wie folgt:
0, wenn kein Lebensmittel- oder Tellerobjekt erkannt wird
0,5, wenn die Bounding Box den Bildrand berührt
1, wenn sich die Bounding Box in der Bildmitte befindet
Der letzte Schritt besteht darin, die Bewertung jeder Komponente mit einer gewichteten Funktion zu kombinieren. Am Ende hat jedes Bild eine gewichtete Bewertung aus den vier Komponenten. Durch Anwenden eines Schwellenwerts würde ein Bild mit einer gewichteten Bewertung unterhalb dieses Schwellenwerts herausgefiltert und den Anbietern nicht empfohlen werden.
Image scoring.png
Fazit
In diesem Artikel haben wir besprochen, wie zwei Data Scientists bei Delivery Hero KI-Modelle nutzen, um hochwertige Lebensmittelbilder zu generieren, die Benutzererfahrung zu verbessern und die Conversion-Rate zu erhöhen. Ihr Ansatz besteht aus zwei Phasen: der Generierung von Lebensmittelbildern und dem Aufbau eines Sicherheitssystems.
Sie verwendeten DALL-E von OpenAI, um das Bild zu generieren, und implementierten mithilfe von Grounding DINO und DALL-E eine Image-Inpainting-Methode. Das Team nutzte vier Komponenten, um eine finale Bewertung zu generieren und die Sicherheit eines generierten Bildes zu bestimmen: Bild-Tagging, Bildzentrierung, Texterkennung und Bildschärfe. Die aus diesen vier Komponenten erhaltenen Bewertungen werden dann mit einer gewichteten Funktion kombiniert, um jedem Bild einen endgültigen Bewertungswert zu geben. Durch Anwenden eines Schwellenwerts wird ein Bild mit einer finalen Bewertung unterhalb des Schwellenwerts herausgefiltert und Anbietern nicht empfohlen.
Sie können über dieses Notebook auf den in diesem Artikel demonstrierten Code zugreifen.
Sie können sich die Aufzeichnung des Vortrags des Delivery-Hero-Teams auf YouTube ansehen.
Weiterlesen

Zilliz Cloud On-Demand Compute: Pay Only for What You Use
The customer case behind Zilliz Cloud On-Demand: how a $10K vector search bill came down to under $500, and the engineering changes that made it possible.

We spent 8 years making vector databases faster. Then we stopped.
Rarely queried embeddings still need to stay searchable. See how Vector Lakebase enables on-demand vector search without always-on compute costs.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.


