Como a Delivery Hero Implementou o Sistema de Segurança para Imagens Geradas por IA
Como uma empresa multinacional de entrega de comida online, a Delivery Hero conecta clientes a restaurantes em suas respectivas áreas. Portanto, é crucial para a empresa entender as necessidades de ambas as partes para manter sua satisfação geral com os serviços da Delivery Hero.
Em uma apresentação no Zilliz Unstructured Data Meetup em Berlim, Iaroslav Amerkhanov e Nikolay Ulyanov, dois cientistas de dados da Delivery Hero, discutiram seu projeto de pesquisa para otimizar as necessidades de fornecedores de restaurantes e clientes.
<< Assista ao replay da palestra do meetup >>
Com base em estatísticas internas, a Delivery Hero encontrou um fato interessante: produtos com uma imagem anexada a eles no aplicativo são pedidos com muito mais frequência do que produtos sem imagem. Especificamente, 86% dos produtos pedidos no aplicativo têm uma imagem anexada. Após realizar testes A/B, eles também descobriram que a taxa de conversão aumenta em 6-8% apenas ao adicionar uma imagem a um produto. Essa descoberta significa que a imagem de um produto é um dos fatores cruciais para os clientes antes de pedir comida de fornecedores no aplicativo da Delivery Hero.
No entanto, pedir a cada restaurante ou fornecedor que forneça uma imagem de seus produtos pode ser trabalhoso, pois nem todo fornecedor consegue fornecer fotos atraentes. Portanto, os cientistas de dados da Delivery Hero propuseram uma abordagem sofisticada para gerar fotos de alta qualidade de um produto aproveitando os avanços da IA. Sua abordagem consiste em duas etapas: a geração de imagens de comida e o sistema de segurança.
Vamos discutir primeiro a etapa de geração de imagens de comida.
Geração de Imagens de Comida
A Delivery Hero implementa duas abordagens para gerar uma imagem de produto: uma envolve chamar a API de plataformas de IA generativa disponíveis, e a outra usa o método de inpainting de imagem.
Geração de Imagens de Comida com Modelo Popular de Geração de Imagens
Vários modelos de IA estão disponíveis para gerar imagens fotorrealistas de alta qualidade, incluindo DALL-E, Midjourney e stable diffusion. Para esse propósito, a Delivery Hero usa o DALL-E para gerar uma imagem de comida.
Assim como o modelo GPT-3, o DALL-E usa blocos Transformer-decoder como sua base. Isso não é surpreendente, pois a arquitetura Transformer é altamente versátil e capaz de gerar dados em diferentes modalidades, como textos e imagens. Em essência, o DALL-E é treinado para gerar imagens a partir de descrições de texto.
Exemplos de imagens geradas pelo DALL-E a partir de descrições de texto
Usar o DALL-E para gerar uma imagem é simples. O único requisito é fornecer um prompt de texto que descreva a imagem que você deseja que ele gere. O prompt usado pela Delivery Hero para gerar uma imagem de comida é o seguinte:
a professional photo of {dish} and {dish\_attributes} on a nice plate, {background} background
Com esse prompt, a Delivery Hero gera imagens de alta qualidade de um prato com atributos e planos de fundo específicos.
Imagens de alta qualidade de um prato com atributos e planos de fundo específicos geradas pelo DALL-E.png
Geração de Imagens de Comida com Inpainting de Imagem
A segunda abordagem da Delivery Hero para gerar imagens de comida envolve uma técnica de inpainting. Inpainting de imagem refere-se ao processo de substituir áreas específicas de uma imagem.
No geral, há quatro etapas implementadas pela Delivery Hero para gerar imagens de comida usando essa abordagem:
Seleção de imagem: Selecione uma imagem de um prato do hub de dados deles.
Detecção de objetos: Detecte o objeto de comida na imagem usando um modelo de detecção de objetos. Como saída, é obtida uma caixa delimitadora da comida detectada.
Mascaramento de imagem: Remova as áreas dentro da caixa delimitadora substituindo os valores dos pixels por preto ou branco.
Inpainting de imagem: Use um modelo de geração de imagens para preencher as áreas removidas da imagem com o prato de nossa escolha.
Geração de imagens com a técnica de inpainting
A Delivery Hero usa dois modelos para essa abordagem: Grounding DINO para detecção de objetos e DALL-E para inpainting de imagens.
Agora, vamos analisar cada ponto da abordagem de inpainting de imagem acima. Podemos pular a etapa de seleção de imagem, pois ela é simples. A mais interessante é a etapa de detecção de objetos usando o Grounding DINO.
Em poucas palavras, o Grounding DINO é um modelo de detecção de objetos que recebe um par de texto e imagens como entrada. Ele usa três abordagens diferentes de fusão de entrada: um aprimorador de recursos, uma seleção de consulta guiada por linguagem e um decodificador de modalidade cruzada para combinar efetivamente a entrada de texto e imagem e produzir um modelo poderoso de detecção de objetos.
A arquitetura de alto nível do aprimorador de recursos e do decodificador de modalidade cruzada é bastante semelhante à arquitetura de bloco Transformer, que inclui camadas de atenção e redes neurais feed-forward. No entanto, ambos os componentes possuem camadas sofisticadas de atenção cruzada de imagem para texto e de texto para imagem para fundir a entrada de texto e imagem, como mostrado na visualização abaixo
A arquitetura de alto nível do aprimorador de recursos e do decodificador de modalidade cruzada .png
Você pode implementar facilmente o Grounding DINO usando o HuggingFace. Se quiser acompanhar, o código demonstrado neste artigo pode ser encontrado em este notebook.
Digamos que queremos detectar um cupcake a partir da imagem mostrada abaixo. O trecho de código a seguir pode obter a caixa delimitadora do bolo com o 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 o Grounding DINO para detectar um cupcake a partir da imagem.png
Podemos detectar o objeto bolo na imagem fornecida!
Em seguida, podemos remover o objeto detectado pelo Grounding DINO usando o método de mascaramento. Depois de aplicar o método de mascaramento, devemos obter uma imagem de saída com valores de pixel contrastantes para a área entre o exterior e o interior da caixa delimitadora detectada.
left, top, right, bottom = results[0]["boxes"][0].tolist()
left = int(left)
top = int(top)
right = int(right)
bottom = int(bottom)
# Crie uma imagem preta vazia
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 # Você pode definir as dimensões desejadas da imagem
mask = np.zeros((height, width), dtype=np.uint8)
# Defina a área dentro da caixa delimitadora como branca (255)
mask[top:bottom, left:right] = 255
mask_image = Image.fromarray(mask)
Mascare o conteúdo detectado pelo Grounding DINO.png
Agora que temos a versão mascarada da imagem, vamos implementar a etapa de inpainting da imagem.
Como o DALL-E não é um modelo de código aberto e o uso de sua API não é gratuito, substituiremos esse modelo por um modelo de geração de imagens de código aberto no exemplo a seguir. Especificamente, implementaremos o modelo Stable Diffusion para inpainting de imagens com a ajuda da HuggingFace.
Digamos que queremos substituir um cupcake na imagem por uma xícara de café. Podemos fazer isso com o seguinte 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)
Substitua o cupcake na imagem por uma xícara de café usando Stable Diffusion.png
Isso é tudo o que precisamos fazer para recriar o método de inpainting de imagens implementado pela Delivery Hero!
A qualidade das imagens geradas por IA implementadas pela Delivery Hero é muito boa. Com essa abordagem, eles podem recomendar um catálogo de imagens de alimentos de alta qualidade de um produto para que os vendedores possam escolher.
No entanto, eles encontram um problema significativo durante o processo de geração de imagens de alimentos: o aspecto de segurança. Discutiremos essa questão na próxima etapa.
Construindo um sistema de segurança
A abordagem sofisticada de geração de imagens discutida na seção anterior depende de um prompt de texto. Isso significa que, às vezes, o modelo de geração de imagens pode interpretar mal nossa intenção.
Por exemplo, digamos que queremos gerar uma imagem de comida de um frango em um prato. Sem nenhum controle de segurança, o modelo pode gerar imagens como as seguintes:
A imagem que queremos vs. a imagem gerada por IA sem nenhum controle de segurança .png
Portanto, precisamos de um componente para controlar a qualidade da imagem gerada pelo modelo. É aqui que o sistema de segurança entra em ação.
A Delivery Hero implementa o sistema de segurança com base em quatro componentes: marcação de imagens, centralização de imagens, detecção de texto e nitidez da imagem. Na apresentação do meetup, a equipe da Delivery Hero se concentrou em dois componentes: marcação de imagens e centralização de imagens.
Marcação de imagens
A primeira abordagem implementada pela Delivery Hero como sistema de segurança é marcar a imagem gerada pelo modelo de geração de imagens. A marcação de imagens refere-se ao processo de prever as tags de uma imagem com a ajuda de um modelo de machine learning. Para esse fim, a Delivery Hero utilizou um modelo chamado Recognize-Anything Plus Model (RAM++).
O RAM++ é um poderoso modelo de marcação de imagens com excepcional generalização zero-shot. Graças à sua integração com LLM, ele consegue reconhecer 4.585 tags únicas.
O RAM++ recebe três entradas diferentes durante o processo de treinamento: imagem, texto e tag. A combinação de texto e tag enriquece o escopo de conceitos visuais que podem ser inferidos a partir de uma imagem. Para melhorar ainda mais a generalização do modelo, o RAM++ utiliza o ChatGPT para criar diferentes variedades de descrições de cada tag com base em cinco prompts diferentes:
Descreva de forma concisa como é um(a) {tag}.
Como você pode identificar um(a) {tag} de forma concisa?
Como é um(a) {tag}, de forma concisa?
Quais são as características identificadas de um(a) {tag}?
Forneça uma descrição concisa das características visuais de {tag}.
Marcação de imagens- tag-para-texto:RAM:arquitetura RAM++ .png
Essas descrições de tags geradas pelo GPT 3.5 Turbo expandem o significado semântico de cada tag, melhorando, portanto, o escopo dos conceitos visuais de uma imagem.
As descrições de texto e tags são então passadas para um codificador de texto, enquanto a imagem é passada para um codificador de imagem. Os resultados desses codificadores são então fundidos dentro de um chamado bloco decodificador de alinhamento, que consiste em camadas de atenção cruzada e feed-forward para gerar as tags finais da imagem.
Para implementar o RAM++ a fim de gerar uma tag de imagem, primeiro precisamos instalar a biblioteca recognize-anything e, em seguida, usar a linha de comando para gerar a tag da imagem. No exemplo a seguir, vamos prever a tag da imagem que usamos na seção 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
No comando de exemplo acima, usamos o modelo Swin-Transformer como codificador de imagem, e abaixo está a saída que devemos obter:
As tags geradas pelo modelo Swin-Transformer .png
Como você pode ver, obtemos tags como “bebida,” “pano,” “café,” “xícara de café,” “xícara,” “cupcake,” “mesa,” “mesa de jantar,” “prato,” etc. para nossas imagens.
Entre todas as 4585 categorias de tags, cientistas de dados da Delivery Hero identificaram 10 tags de "comida" e 50 tags "negativas". As tags "negativas" incluem várias tags associadas a animais, como “inseto”, “besouro”, “formiga”, “vespão”, etc.
Marcação de imagens com o modelo Swin-Transformer.png
Então, eles atribuíram uma pontuação para cada imagem de comida gerada por IA com base nas tags previstas pelo modelo RAM++.
A pontuação é 1 se a imagem contiver pelo menos uma tag de "comida" e nenhuma tag "negativa".
A pontuação é 0 se a imagem contiver uma tag "negativa".
Centralização da Imagem
Outro componente implementado por cientistas de dados da Delivery Hero para aumentar a segurança das imagens geradas por IA é a centralização da imagem. Neste componente, a proporcionalidade da imagem gerada é avaliada. Como você talvez já saiba, a comida no centro de uma imagem é mais atraente do que uma na borda ou cortada da imagem.
Para avaliar a proporcionalidade da imagem, a Delivery Hero utiliza o Grounding DINO, descrito na seção anterior, para detectar o objeto de comida em uma imagem. Em seguida, a caixa delimitadora produzida pelo modelo será avaliada para determinar a qualidade da imagem.
O sistema de pontuação é o seguinte:
0 se nenhum alimento ou objeto de prato for detectado
0,5 se a caixa delimitadora tocar a borda da imagem
1 se a caixa delimitadora estiver no centro da imagem
A etapa final é combinar a pontuação de cada componente com uma função ponderada. No final, cada imagem tem uma pontuação ponderada dos quatro componentes. Ao aplicar um valor de limite, uma imagem com uma pontuação ponderada abaixo desse limite seria filtrada e não recomendada aos fornecedores.
Image scoring.png
Conclusão
Neste artigo, discutimos como dois cientistas de dados da Delivery Hero usam modelos de IA para gerar imagens de alimentos de alta qualidade a fim de melhorar a experiência do usuário e a taxa de conversão. A abordagem deles consiste em duas etapas: geração de imagens de alimentos e construção de um sistema de segurança.
Eles usaram o DALL-E da OpenAI para gerar a imagem e implementaram um método de inpainting de imagens com a ajuda do Grounding DINO e do DALL-E. A equipe adotou quatro componentes para gerar uma pontuação final para determinar a segurança de uma imagem gerada: marcação de imagens, centralização de imagens, detecção de texto e nitidez da imagem. As pontuações obtidas a partir desses quatro componentes são então combinadas com uma função ponderada para dar a cada imagem um valor de pontuação final. Ao aplicar um limite, uma imagem com uma pontuação final abaixo do limite será filtrada e não recomendada aos fornecedores.
Você pode acessar o código demonstrado neste artigo via este notebook.
Você pode assistir à reprise da palestra da equipe da Delivery Hero no YouTube.
Continue lendo

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.

3 Easiest Ways to Use Claude Code on Your Mobile Phone
Run Claude Code from your phone with Remote Control, Happy Coder, or SSH + Tailscale. Comparison table, setup steps, and tools for typing, memory, and parallel tasks.

Announcing the General Availability of Zilliz Cloud BYOC on Google Cloud Platform
Zilliz Cloud BYOC on GCP offers enterprise vector search with full data sovereignty and seamless integration.


