Cómo Delivery Hero implementó el sistema de seguridad para imágenes generadas por IA
Como empresa multinacional de entrega de comida en línea, Delivery Hero conecta a los clientes con restaurantes en sus respectivas zonas. Por lo tanto, es crucial que la empresa comprenda las necesidades de ambas partes para mantener su satisfacción general con los servicios de Delivery Hero.
En una presentación en el Zilliz Unstructured Data Meetup en Berlín, Iaroslav Amerkhanov y Nikolay Ulyanov, dos científicos de datos de Delivery Hero, hablaron sobre su proyecto de investigación para optimizar las necesidades de los proveedores de restaurantes y los clientes.
<< Mira la repetición de la charla del meetup >>
Basándose en estadísticas internas, Delivery Hero descubrió un hecho interesante: los productos que tienen una imagen adjunta en la app se piden con mucha más frecuencia que los productos sin imagen. Específicamente, el 86% de los productos pedidos en la app tienen una imagen adjunta. Después de realizar pruebas A/B, también descubrieron que la tasa de conversión aumenta entre un 6 y un 8% con solo añadir una imagen a un producto. Este hallazgo significa que la imagen de un producto es uno de los factores cruciales para los clientes antes de pedir comida a los proveedores en la app de Delivery Hero.
Sin embargo, pedir a cada restaurante o proveedor que proporcione una imagen de sus productos puede ser engorroso, ya que no todos los proveedores pueden ofrecer fotos atractivas. Por lo tanto, los científicos de datos de Delivery Hero propusieron un enfoque sofisticado para generar imágenes de alta calidad de un producto aprovechando los avances de la IA. Su enfoque consta de dos etapas: la generación de imágenes de comida y el sistema de seguridad.
Analicemos primero la etapa de generación de imágenes de comida.
Generación de imágenes de comida
Delivery Hero implementa dos enfoques para generar una imagen de producto: uno consiste en llamar a la API de plataformas de IA generativa disponibles, y el otro utiliza el método de inpainting de imágenes.
Generación de imágenes de comida con un modelo popular de generación de imágenes
Hay varios modelos de IA disponibles para generar imágenes fotorrealistas de alta calidad, incluidos DALL-E, Midjourney y stable diffusion. Para este propósito, Delivery Hero utiliza DALL-E para generar una imagen de comida.
Al igual que el modelo GPT-3, DALL-E utiliza bloques Transformer-decoder como columna vertebral. Esto no es sorprendente, ya que la arquitectura Transformer es muy versátil y capaz de generar datos en diferentes modalidades, como textos e imágenes. En esencia, DALL-E está entrenado para generar imágenes a partir de descripciones de texto.
Imágenes de ejemplo generadas por DALL-E a partir de descripciones de texto
Usar DALL-E para generar una imagen es sencillo. El único requisito es proporcionar un prompt de texto que describa la imagen que quieres que genere. El prompt utilizado por Delivery Hero para generar una imagen de comida es el siguiente:
a professional photo of {dish} and {dish\_attributes} on a nice plate, {background} background
Con este prompt, Delivery Hero genera imágenes de alta calidad de un plato con atributos y fondos específicos.
Imágenes de alta calidad de un plato con atributos y fondos específicos generadas por DALL-E.png
Generación de imágenes de comida con inpainting de imágenes
El segundo enfoque de Delivery Hero para generar imágenes de comida implica una técnica de inpainting. El inpainting de imágenes se refiere al proceso de reemplazar áreas específicas de una imagen.
En general, Delivery Hero implementa cuatro pasos para generar imágenes de comida usando este enfoque:
Selección de imagen: Seleccionar una imagen de un plato de su data hub.
Detección de objetos: Detectar el objeto de comida en la imagen utilizando un modelo de detección de objetos. Como resultado, se obtiene un cuadro delimitador del alimento detectado.
Enmascaramiento de imágenes: Eliminar las áreas dentro del cuadro delimitador reemplazando los valores de los píxeles con negro o blanco.
Inpainting de imágenes: Usar un modelo de generación de imágenes para rellenar las áreas eliminadas de la imagen con el plato de nuestra elección.
Generación de imágenes con la técnica de inpainting
Delivery Hero usa dos modelos para este enfoque: Grounding DINO para la detección de objetos y DALL-E para el inpainting de imágenes.
Ahora, analicemos cada punto del enfoque de inpainting de imágenes anterior. Podemos omitir el paso de selección de imágenes, ya que es sencillo. El más interesante es el paso de detección de objetos usando Grounding DINO.
En pocas palabras, Grounding DINO es un modelo de detección de objetos que toma como entrada un par de texto e imágenes. Usa tres enfoques diferentes de fusión de entradas: un potenciador de características, una selección de consultas guiada por lenguaje y un decodificador de modalidad cruzada para combinar eficazmente la entrada de texto e imagen y producir un potente modelo de detección de objetos.
La arquitectura de alto nivel del potenciador de características y del decodificador de modalidad cruzada es bastante similar a la arquitectura de bloques Transformer, que incluye capas de atención y redes neuronales feed-forward. Sin embargo, ambos componentes tienen capas sofisticadas de atención cruzada de imagen a texto y de texto a imagen para fusionar la entrada de texto e imagen, como se muestra en la visualización a continuación
La arquitectura de alto nivel del potenciador de características y del decodificador de modalidad cruzada .png
Puedes implementar fácilmente Grounding DINO usando HuggingFace. Si quieres seguir el ejemplo, el código demostrado en este artículo se puede encontrar en este notebook.
Digamos que queremos detectar un cupcake en la imagen que se muestra a continuación. El siguiente fragmento de código puede obtener el cuadro delimitador del pastel 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]])}]
"""
Usando Grounding DINO para detectar un cupcake en la imagen.png
¡Podemos detectar el objeto pastel en la imagen proporcionada!
A continuación, podemos eliminar el objeto detectado por Grounding DINO usando el método de enmascaramiento. Después de aplicar el método de enmascaramiento, deberíamos obtener una salida de imagen con valores de píxel contrastantes para el área entre el exterior y el interior del cuadro delimitador detectado.
left, top, right, bottom = results[0]["boxes"][0].tolist()
left = int(left)
top = int(top)
right = int(right)
bottom = int(bottom)
# Crear una imagen negra vacía
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)
Enmascarar el contenido detectado por Grounding DINO.png
Ahora que tenemos la versión enmascarada de la imagen, implementemos el paso de inpainting de imágenes.
Dado que DALL-E no es un modelo de código abierto y consumir su API no es gratuito, reemplazaremos este modelo con un modelo de generación de imágenes de código abierto en el siguiente ejemplo. Específicamente, implementaremos el modelo Stable Diffusion para el inpainting de imágenes con la ayuda de HuggingFace.
Supongamos que queremos reemplazar un cupcake en la imagen con una taza de café. Podemos hacerlo con el siguiente código:
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)
Reemplazar el cupcake en la imagen con una taza de café usando Stable Diffusion.png
¡Eso es todo lo que necesitamos hacer para recrear el método de inpainting de imágenes implementado por Delivery Hero!
La calidad de las imágenes generadas por IA implementadas por Delivery Hero es muy buena. Con este enfoque, pueden recomendar un catálogo de imágenes de comida de alta calidad de un producto entre las que los proveedores pueden elegir.
Sin embargo, encuentran un problema significativo durante el proceso de generación de imágenes de comida: el aspecto de seguridad. Discutiremos este problema en el siguiente paso.
Construcción de un sistema de seguridad
El sofisticado enfoque de generación de imágenes discutido en la sección anterior se basa en un prompt de texto. Esto significa que, a veces, el modelo de generación de imágenes puede malinterpretar nuestra intención.
Por ejemplo, supongamos que queremos generar una imagen de comida de un pollo en un plato. Sin ningún control de seguridad, el modelo podría generar imágenes como las siguientes:
La imagen que queremos vs. la imagen generada por IA sin ningún control de seguridad .png
Por lo tanto, necesitamos un componente para controlar la calidad de la imagen generada por el modelo. Aquí es donde entra en juego el sistema de seguridad.
Delivery Hero implementa el sistema de seguridad basado en cuatro componentes: etiquetado de imágenes, centrado de imágenes, detección de texto y nitidez de imagen. En la presentación del meetup, el equipo de Delivery Hero se centró en dos componentes: etiquetado de imágenes y centrado de imágenes.
Etiquetado de imágenes
El primer enfoque implementado por Delivery Hero como sistema de seguridad es etiquetar la imagen generada por el modelo de generación de imágenes. El etiquetado de imágenes se refiere al proceso de predecir las etiquetas de una imagen con la ayuda de un modelo de aprendizaje automático. Para este propósito, Delivery Hero utilizó un modelo llamado Recognize-Anything Plus Model (RAM++).
RAM++ es un potente modelo de etiquetado de imágenes con una generalización zero-shot excepcional. Gracias a su integración con LLM, puede reconocer 4.585 etiquetas únicas.
RAM++ recibe tres entradas diferentes durante el proceso de entrenamiento: imagen, texto y etiqueta. La combinación de texto y etiqueta enriquece el alcance de los conceptos visuales que pueden inferirse a partir de una imagen. Para mejorar aún más la generalización del modelo, RAM++ utiliza ChatGPT para crear diferentes variedades de descripciones de cada etiqueta basadas en cinco prompts distintos:
Describe concisamente cómo se ve un(a) {tag}.
¿Cómo puedes identificar concisamente un(a) {tag}?
¿Cómo se ve concisamente un(a) {tag}?
¿Cuáles son las características identificadas de un(a) {tag}?
Proporciona una descripción concisa de las características visuales de {tag}.
Etiquetado de imágenes- etiqueta a texto:arquitectura RAM:RAM++ .png
Estas descripciones de etiquetas generadas por GPT 3.5 Turbo amplían el significado semántico de cada etiqueta, mejorando por tanto el alcance de los conceptos visuales de una imagen.
Las descripciones de texto y etiquetas se pasan luego a un codificador de texto, mientras que la imagen se pasa a un codificador de imagen. Los resultados de estos codificadores se fusionan después dentro de un llamado bloque decodificador de alineación que consta de capas de atención cruzada y feed-forward para generar las etiquetas finales de la imagen.
Para implementar RAM++ para generar una etiqueta de imagen, primero debemos instalar la biblioteca recognize-anything y luego usar la línea de comandos para generar la etiqueta de la imagen. En el siguiente ejemplo, predeciremos la etiqueta de la imagen que usamos en la sección anterior.
!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
En el comando de ejemplo anterior, usamos el modelo Swin-Transformer como codificador de imagen, y a continuación se muestra la salida que deberíamos obtener:
Las etiquetas generadas por el modelo Swin-Transformer .png
Como puedes ver, obtenemos etiquetas como “beverage,” “cloth,” “coffee,” “coffee cup,” “cup,” “cupcake,” “table,” “dining table,” “plate,” etc. para nuestras imágenes.
Entre las 4585 categorías de etiquetas, los científicos de datos de Delivery Hero identificaron 10 etiquetas de "food" y 50 etiquetas "negative". Las etiquetas "negative" incluyen varias etiquetas asociadas con animales, como “bug”, “beetle”, “ant”, “hornet”, etc.
Etiquetado de imágenes con el modelo Swin-Transformer.png
Luego, asignaron una puntuación para cada imagen de comida generada por IA en función de las etiquetas predichas por el modelo RAM++.
La puntuación es 1 si la imagen contiene al menos una etiqueta "food" y ninguna etiqueta "negative".
La puntuación es 0 si la imagen contiene una etiqueta "negative".
Centrado de imágenes
Otro componente implementado por los científicos de datos de Delivery Hero para mejorar la seguridad de las imágenes generadas por IA es el centrado de imágenes. En este componente, se evalúa la proporcionalidad de la imagen generada. Como quizá ya sepas, la comida en el centro de una imagen resulta más atractiva que una situada en el borde o recortada de la imagen.
Para evaluar la proporcionalidad de la imagen, Delivery Hero utiliza Grounding DINO, descrito en la sección anterior, para detectar el objeto de comida en una imagen. Luego, se evaluará el cuadro delimitador producido por el modelo para determinar la calidad de la imagen.
El sistema de puntuación es el siguiente:
0 si no se detecta ningún alimento ni objeto de plato
0.5 si el cuadro delimitador toca el borde de la imagen
1 si el cuadro delimitador está en el centro de la imagen
El paso final es combinar la puntuación de cada componente con una función ponderada. Al final, cada imagen tiene una puntuación ponderada de los cuatro componentes. Al aplicar un valor umbral, una imagen con una puntuación ponderada por debajo de ese umbral se filtraría y no se recomendaría a los proveedores.
Image scoring.png
Conclusión
En este artículo, hemos discutido cómo dos científicos de datos de Delivery Hero utilizan modelos de IA para generar imágenes de alimentos de alta calidad con el fin de mejorar la experiencia del usuario y la tasa de conversión. Su enfoque consta de dos etapas: generación de imágenes de alimentos y creación de un sistema de seguridad.
Utilizaron DALL-E de OpenAI para generar la imagen e implementaron un método de inpainting de imágenes con la ayuda de Grounding DINO y DALL-E. El equipo adoptó cuatro componentes para generar una puntuación final que determine la seguridad de una imagen generada: etiquetado de imágenes, centrado de imágenes, detección de texto y nitidez de la imagen. Las puntuaciones obtenidas de estos cuatro componentes se combinan luego con una función ponderada para dar a cada imagen un valor de puntuación final. Al aplicar un umbral, una imagen con una puntuación final por debajo del umbral se filtrará y no se recomendará a los proveedores.
Puedes acceder al código demostrado en este artículo a través de este cuaderno.
Puedes ver la repetición de la charla del equipo de Delivery Hero en YouTube.
Sigue leyendo

Zilliz Cloud Just Landed in Claude Code
The Zilliz Cloud Plugin brings the full power of Zilliz Cloud directly into your Claude Code terminal as natural-language conversations.

What is the K-Nearest Neighbors (KNN) Algorithm in Machine Learning?
KNN is a supervised machine learning technique and algorithm for classification and regression. This post is the ultimate guide to KNN.

Introducing DeepSearcher: A Local Open Source Deep Research
In contrast to OpenAI’s Deep Research, this example ran locally, using only open-source models and tools like Milvus and LangChain.


