Comment Delivery Hero a mis en œuvre le système de sécurité pour les images générées par l’IA
En tant qu’entreprise multinationale de livraison de repas en ligne, Delivery Hero met en relation les clients avec les restaurants de leurs zones respectives. Il est donc crucial pour l’entreprise de comprendre les besoins des deux parties afin de maintenir leur satisfaction globale à l’égard des services de Delivery Hero.
Lors d’une présentation au Zilliz Unstructured Data Meetup à Berlin, Iaroslav Amerkhanov et Nikolay Ulyanov, deux data scientists chez Delivery Hero, ont présenté leur projet de recherche visant à rationaliser les besoins des restaurateurs partenaires et des clients.
<< Regarder le replay de l’intervention au meetup >>
Sur la base de statistiques internes, Delivery Hero a découvert un fait intéressant : les produits auxquels une image est associée dans l’application sont commandés beaucoup plus fréquemment que les produits sans image. Plus précisément, 86 % des produits commandés dans l’application ont une image associée. Après avoir mené des tests A/B, ils ont également constaté que le taux de conversion augmente de 6 à 8 % simplement en ajoutant une image à un produit. Cette découverte signifie que l’image d’un produit est l’un des facteurs cruciaux pour les clients avant de commander des plats auprès des vendeurs sur l’application Delivery Hero.
Cependant, demander à chaque restaurant ou vendeur de fournir une image de ses produits peut être fastidieux, car tous les vendeurs ne sont pas en mesure de fournir des photos attrayantes. Par conséquent, les data scientists de Delivery Hero ont proposé une approche sophistiquée pour générer des images de haute qualité d’un produit en tirant parti des avancées de l’IA. Leur approche comporte deux étapes : la génération d’images de nourriture et le système de sécurité.
Commençons par discuter de l’étape de génération d’images de nourriture.
Génération d’images de nourriture
Delivery Hero met en œuvre deux approches pour générer une image de produit : l’une consiste à appeler l’API de plateformes d’IA générative disponibles, et l’autre utilise la méthode d’inpainting d’images.
Génération d’images de nourriture avec un modèle populaire de génération d’images
Plusieurs modèles d’IA sont disponibles pour générer des images photoréalistes de haute qualité, notamment DALL-E, Midjourney et stable diffusion. À cette fin, Delivery Hero utilise DALL-E pour générer une image de nourriture.
Comme le modèle GPT-3, DALL-E utilise des blocs Transformer-décodeur comme architecture de base. Ce n’est pas surprenant, car l’architecture Transformer est très polyvalente et capable de générer des données dans différentes modalités, telles que des textes et des images. En substance, DALL-E est entraîné à générer des images à partir de descriptions textuelles.
Exemples d’images générées par DALL-E à partir de descriptions textuelles
Utiliser DALL-E pour générer une image est simple. La seule exigence est de fournir un prompt textuel qui décrit l’image que vous voulez qu’il génère. Le prompt utilisé par Delivery Hero pour générer une image de nourriture est le suivant :
a professional photo of {dish} and {dish\_attributes} on a nice plate, {background} background
Avec ce prompt, Delivery Hero génère des images de haute qualité d’un plat avec des attributs et des arrière-plans spécifiques.
Images de haute qualité d’un plat avec des attributs et des arrière-plans spécifiques générées par DALL-E.png
Génération d’images de nourriture avec l’inpainting d’images
La deuxième approche de Delivery Hero pour générer des images de nourriture repose sur une technique d’inpainting. L’inpainting d’images désigne le processus consistant à remplacer des zones spécifiques d’une image.
Dans l’ensemble, Delivery Hero met en œuvre quatre étapes pour générer des images de nourriture à l’aide de cette approche :
Sélection de l’image : Sélectionner une image d’un plat dans leur hub de données.
Détection d’objets : Détecter l’objet alimentaire dans l’image à l’aide d’un modèle de détection d’objets. En sortie, une boîte englobante de l’aliment détecté est obtenue.
Masquage d’image : Supprimer les zones à l’intérieur de la boîte englobante en remplaçant les valeurs des pixels par du noir ou du blanc.
Inpainting d’image : Utiliser un modèle de génération d’images pour remplir les zones supprimées de l’image avec le plat de notre choix.
Génération d’image avec la technique d’inpainting
Delivery Hero utilise deux modèles pour cette approche : Grounding DINO pour la détection d’objets et DALL-E pour l’inpainting d’image.
Maintenant, analysons chaque point de l’approche d’inpainting d’image ci-dessus. Nous pouvons ignorer l’étape de sélection de l’image, car elle est simple. La plus intéressante est l’étape de détection d’objets utilisant Grounding DINO.
En résumé, Grounding DINO est un modèle de détection d’objets qui prend en entrée une paire composée de texte et d’images. Il utilise trois approches différentes de fusion des entrées : un amplificateur de caractéristiques, une sélection de requêtes guidée par le langage et un décodeur intermodal pour combiner efficacement les entrées texte et image afin de produire un puissant modèle de détection d’objets.
L’architecture de haut niveau de l’amplificateur de caractéristiques et du décodeur intermodal est assez similaire à l’architecture en blocs Transformer, qui comprend des couches d’attention et des réseaux de neurones feed-forward. Cependant, les deux composants disposent de couches sophistiquées d’attention croisée image-vers-texte et texte-vers-image pour fusionner les entrées texte et image, comme le montre la visualisation ci-dessous
L’architecture de haut niveau de l’amplificateur de caractéristiques et du décodeur intermodal .png
Vous pouvez facilement implémenter Grounding DINO avec HuggingFace. Si vous souhaitez suivre, le code présenté dans cet article se trouve dans ce notebook.
Disons que nous voulons détecter un cupcake dans l’image ci-dessous. L’extrait de code suivant permet d’obtenir la boîte englobante du gâteau avec 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]])}]
"""
Utilisation de Grounding DINO pour détecter un cupcake dans l’image.png
Nous pouvons détecter l’objet gâteau dans l’image fournie !
Ensuite, nous pouvons supprimer l’objet détecté par Grounding DINO à l’aide de la méthode de masquage. Après avoir appliqué la méthode de masquage, nous devrions obtenir une image de sortie avec des valeurs de pixels contrastées pour la zone entre l’extérieur et l’intérieur de la boîte englobante détectée.
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)
Masquer le contenu détecté par Grounding DINO.png
Maintenant que nous avons la version masquée de l’image, implémentons l’étape d’inpainting d’image.
Étant donné que DALL-E n’est pas un modèle open source et que l’utilisation de son API n’est pas gratuite, nous remplacerons ce modèle par un modèle de génération d’images open source dans l’exemple suivant. Plus précisément, nous implémenterons le modèle Stable Diffusion pour l’inpainting d’image avec l’aide de HuggingFace.
Disons que nous voulons remplacer un cupcake dans l’image par une tasse de café. Nous pouvons le faire avec le code suivant :
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)
Remplacer le cupcake dans l’image par une tasse de café à l’aide de Stable Diffusion.png
C’est tout ce que nous devons faire pour recréer la méthode d’inpainting d’image implémentée par Delivery Hero !
La qualité des images générées par l’IA implémentées par Delivery Hero est très bonne. Grâce à cette approche, ils peuvent recommander un catalogue d’images alimentaires de haute qualité d’un produit parmi lesquelles les vendeurs peuvent choisir.
Cependant, ils rencontrent un problème important lors du processus de génération d’images alimentaires : l’aspect sécurité. Nous aborderons cette question à l’étape suivante.
Construire un système de sécurité
L’approche sophistiquée de génération d’images abordée dans la section précédente repose sur une invite textuelle. Cela signifie que, parfois, le modèle de génération d’images peut mal comprendre notre intention.
Par exemple, disons que nous voulons générer une image alimentaire d’un poulet dans une assiette. Sans aucun contrôle de sécurité, le modèle pourrait générer des images comme suit :
L’image que nous voulons vs. l’image générée par l’IA sans aucun contrôle de sécurité .png
Par conséquent, nous avons besoin d’un composant pour contrôler la qualité de l’image générée par le modèle. C’est là que le système de sécurité entre en jeu.
Delivery Hero implémente le système de sécurité sur la base de quatre composants : étiquetage d’image, centrage d’image, détection de texte et netteté de l’image. Dans la présentation du meetup, l’équipe de Delivery Hero s’est concentrée sur deux composants : étiquetage d’image et centrage d’image.
Étiquetage d’image
La première approche implémentée par Delivery Hero comme système de sécurité consiste à étiqueter l’image générée par le modèle de génération d’images. L’étiquetage d’image désigne le processus de prédiction des étiquettes d’une image à l’aide d’un modèle d’apprentissage automatique. À cette fin, Delivery Hero a utilisé un modèle appelé Recognize-Anything Plus Model (RAM++).
RAM++ est un puissant modèle d’étiquetage d’images doté d’une généralisation zero-shot exceptionnelle. Grâce à son intégration avec un LLM, il peut reconnaître 4 585 étiquettes uniques.
RAM++ reçoit trois entrées différentes pendant le processus d’entraînement : image, texte et étiquette. La combinaison du texte et de l’étiquette enrichit l’étendue des concepts visuels qui peuvent être déduits d’une image. Pour améliorer encore davantage la généralisation du modèle, RAM++ utilise ChatGPT pour créer différentes variétés de descriptions de chaque étiquette à partir de cinq prompts différents :
Décrivez brièvement à quoi ressemble un(e) {tag}.
Comment pouvez-vous identifier brièvement un(e) {tag} ?
À quoi ressemble brièvement un(e) {tag} ?
Quelles sont les caractéristiques identifiées d’un(e) {tag} ?
Veuillez fournir une description concise des caractéristiques visuelles de {tag}.
Image tagging- tag-to-text:RAM:RAM++ architecture .png
Ces descriptions d’étiquettes générées par GPT 3.5 Turbo élargissent la signification sémantique de chaque étiquette, améliorant ainsi l’étendue des concepts visuels d’une image.
Les descriptions de texte et d’étiquettes sont ensuite transmises à un encodeur de texte, tandis que l’image est transmise à un encodeur d’image. Les résultats de ces encodeurs sont ensuite fusionnés dans un bloc appelé décodeur d’alignement, composé de couches d’attention croisée et de couches feed-forward, afin de générer les étiquettes finales de l’image.
Pour implémenter RAM++ afin de générer une étiquette d’image, nous devons d’abord installer la bibliothèque recognize-anything, puis utiliser la ligne de commande pour générer l’étiquette de l’image. Dans l’exemple suivant, nous allons prédire l’étiquette de l’image que nous avons utilisée dans la section précédente.
!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
Dans l’exemple de commande ci-dessus, nous utilisons le modèle Swin-Transformer comme encodeur d’image, et ci-dessous se trouve la sortie que nous devrions obtenir :
The tags generated by the Swin-Transformer model .png
Comme vous pouvez le voir, nous obtenons des étiquettes telles que « beverage », « cloth », « coffee », « coffee cup », « cup », « cupcake », « table », « dining table », « plate », etc. pour nos images.
Parmi les 4585 catégories d’étiquettes, les data scientists de Delivery Hero ont identifié 10 étiquettes « food » et 50 étiquettes « negative ». Les étiquettes « negative » comprennent plusieurs étiquettes associées aux animaux, telles que « bug », « beetle », « ant », « hornet », etc.
Image tagging with the Swin-Transformer model.png
Ensuite, ils ont attribué un score à chaque image de nourriture générée par l’IA en fonction des étiquettes prédites par le modèle RAM++.
Le score est de 1 si l’image contient au moins une étiquette « food » et aucune étiquette « negative ».
Le score est de 0 si l’image contient une étiquette « negative ».
Centrage de l’image
Un autre composant mis en œuvre par les data scientists de Delivery Hero pour améliorer la sécurité des images générées par l’IA est le centrage de l’image. Dans ce composant, la proportionnalité de l’image générée est évaluée. Comme vous le savez peut-être déjà, un aliment au centre d’une image est plus attrayant qu’un aliment situé au bord ou coupé dans l’image.
Pour évaluer la proportionnalité de l’image, Delivery Hero utilise Grounding DINO, décrit dans la section précédente, afin de détecter l’objet alimentaire dans une image. Ensuite, la boîte englobante produite par le modèle sera évaluée pour déterminer la qualité de l’image.
Le système de notation est le suivant :
0 si aucun aliment ou objet de type assiette n’est détecté
0,5 si la boîte englobante touche le bord de l’image
1 si la boîte englobante est au centre de l’image
L’étape finale consiste à combiner le score de chaque composant avec une fonction pondérée. À la fin, chaque image obtient un score pondéré à partir des quatre composants. En appliquant une valeur seuil, une image dont le score pondéré est inférieur à ce seuil serait filtrée et ne serait pas recommandée aux vendeurs.
Image scoring.png
Conclusion
Dans cet article, nous avons expliqué comment deux data scientists chez Delivery Hero utilisent des modèles d’IA pour générer des images alimentaires de haute qualité afin d’améliorer l’expérience utilisateur et le taux de conversion. Leur approche se compose de deux étapes : la génération d’images alimentaires et la création d’un système de sécurité.
Ils ont utilisé DALL-E d’OpenAI pour générer l’image et ont mis en œuvre une méthode d’inpainting d’image avec l’aide de Grounding DINO et de DALL-E. L’équipe a adopté quatre composants pour générer un score final afin de déterminer la sécurité d’une image générée : le balisage d’image, le centrage de l’image, la détection de texte et la netteté de l’image. Les scores obtenus à partir de ces quatre composants sont ensuite combinés avec une fonction pondérée pour donner à chaque image une valeur de score finale. En appliquant un seuil, une image dont le score final est inférieur au seuil sera filtrée et ne sera pas recommandée aux vendeurs.
Vous pouvez accéder au code présenté dans cet article via ce notebook.
Vous pouvez regarder la rediffusion de la présentation de l’équipe Delivery Hero sur YouTube.
Continuer à lire

Build Multimodal Search for 3D Assets with Tripo and Zilliz Cloud
Generate 3D assets with Tripo, then search them by text, image, and metadata with multimodal embeddings and Zilliz Cloud.

Introducing Business Critical Plan: Enterprise-Grade Security and Compliance for Mission-Critical AI Applications
Discover Zilliz Cloud’s Business Critical Plan—offering advanced security, compliance, and uptime for mission-critical AI and vector database workloads.

Demystifying the Milvus Sizing Tool
Explore how to use the Sizing Tool to select the optimal configuration for your Milvus deployment.


