Как Delivery Hero внедрила систему безопасности для изображений, сгенерированных ИИ
Будучи многонациональной компанией онлайн-доставки еды, Delivery Hero соединяет клиентов с ресторанами в их соответствующих районах. Поэтому для компании крайне важно понимать потребности обеих сторон, чтобы поддерживать их общую удовлетворенность сервисами Delivery Hero.
В презентации на Zilliz Unstructured Data Meetup в Берлине Иарослав Амерханов и Николай Ульянов, два data scientist в Delivery Hero, рассказали о своем исследовательском проекте по оптимизации потребностей ресторанов-партнеров и клиентов.
<< Посмотрите запись выступления на митапе >>
На основе внутренней статистики Delivery Hero обнаружила интересный факт: продукты, к которым в приложении прикреплено изображение, заказывают гораздо чаще, чем продукты без изображения. В частности, 86% продуктов, заказанных в приложении, имеют прикрепленное изображение. После проведения A/B-тестирования они также выяснили, что коэффициент конверсии увеличивается на 6–8% просто за счет добавления изображения к продукту. Этот вывод означает, что изображение продукта является одним из ключевых факторов для клиентов перед заказом еды у партнеров в приложении Delivery Hero.
Однако просить каждый ресторан или каждого партнера предоставить изображение своих продуктов может быть обременительно, поскольку не каждый партнер способен предоставить привлекательные фотографии. Поэтому data scientists в Delivery Hero предложили продвинутый подход к созданию высококачественных изображений продукта с использованием достижений AI. Их подход состоит из двух этапов: генерации изображения еды и системы безопасности.
Сначала обсудим этап генерации изображения еды.
Генерация изображения еды
Delivery Hero реализует два подхода к генерации изображения продукта: один предполагает вызов API доступных платформ генеративного AI, а другой использует метод дорисовки изображения.
Генерация изображения еды с помощью популярной модели генерации изображений
Доступно несколько AI-моделей для генерации высококачественных фотореалистичных изображений, включая DALL-E, Midjourney и stable diffusion. Для этой цели Delivery Hero использует DALL-E для генерации изображения еды.
Как и модель GPT-3, DALL-E использует блоки Transformer-декодера в качестве своей основы. Это неудивительно, поскольку архитектура Transformer чрезвычайно универсальна и способна генерировать данные в разных модальностях, таких как тексты и изображения. По сути, DALL-E обучена генерировать изображения по текстовым описаниям.
Примеры изображений, сгенерированных DALL-E по текстовым описаниям
Использовать DALL-E для генерации изображения просто. Единственное требование — предоставить текстовый prompt, который описывает изображение, которое вы хотите сгенерировать. Prompt, используемый Delivery Hero для генерации изображения еды, выглядит следующим образом:
a professional photo of {dish} and {dish\_attributes} on a nice plate, {background} background
С помощью этого prompt Delivery Hero генерирует высококачественные изображения блюда с конкретными атрибутами и фонами.
Высококачественные изображения блюда с конкретными атрибутами и фонами, сгенерированные DALL-E.png
Генерация изображения еды с помощью дорисовки изображения
Второй подход Delivery Hero к генерации изображений еды предполагает технику inpainting. Image inpainting относится к процессу замены определенных областей изображения.
В целом Delivery Hero реализует четыре шага для генерации изображений еды с использованием этого подхода:
Выбор изображения: Выбрать изображение блюда из их data hub.
Обнаружение объектов: Обнаружить объект еды на изображении с помощью модели обнаружения объектов. На выходе получается bounding box обнаруженной еды.
Маскирование изображений: Удаление областей внутри ограничивающей рамки путём замены значений пикселей на чёрные или белые.
Inpainting изображений: Использование модели генерации изображений для заполнения удалённых областей изображения блюдом по нашему выбору.
Генерация изображений с помощью техники inpainting
Delivery Hero использует две модели для этого подхода: Grounding DINO для обнаружения объектов и DALL-E для inpainting изображений.
Теперь давайте разберём каждый пункт подхода к inpainting изображений выше. Мы можем пропустить этап выбора изображения, так как он достаточно прост. Более интересным является этап обнаружения объектов с использованием Grounding DINO.
Вкратце, Grounding DINO — это модель обнаружения объектов, которая принимает на вход пару из текста и изображений. Она использует три разных подхода к объединению входных данных: улучшитель признаков, управляемый языком выбор запросов и кросс-модальный декодер, чтобы эффективно объединять текстовый и визуальный вход и создавать мощную модель обнаружения объектов.
Высокоуровневая архитектура улучшителя признаков и кросс-модального декодера довольно похожа на архитектуру Transformer-блока, которая включает слои внимания и полносвязные нейронные сети. Однако оба компонента имеют сложные слои кросс-внимания image-to-text и text-to-image для объединения текстового и визуального входа, как показано на визуализации ниже
Высокоуровневая архитектура улучшителя признаков и кросс-модального декодера .png
Вы можете легко реализовать Grounding DINO с помощью HuggingFace. Если хотите выполнять шаги вместе с нами, код, продемонстрированный в этой статье, можно найти в этом notebook.
Допустим, мы хотим обнаружить капкейк на изображении ниже. Следующий фрагмент кода может получить ограничивающую рамку торта с помощью 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]])}]
"""
Использование Grounding DINO для обнаружения капкейка на изображении.png
Мы можем обнаружить объект торта на предоставленном изображении!
Далее мы можем удалить объект, обнаруженный Grounding DINO, с помощью метода маскирования. После применения метода маскирования мы должны получить выходное изображение с контрастными значениями пикселей для области между внешней и внутренней частью обнаруженной ограничивающей рамки.
left, top, right, bottom = results[0]["boxes"][0].tolist()
left = int(left)
top = int(top)
right = int(right)
bottom = int(bottom)
# Создайте пустое черное изображение
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 # Вы можете задать желаемые размеры изображения
mask = np.zeros((height, width), dtype=np.uint8)
# Установите область внутри ограничивающей рамки в белый цвет (255)
mask[top:bottom, left:right] = 255
mask_image = Image.fromarray(mask)
Замаскируйте содержимое, обнаруженное Grounding DINO.png
Теперь, когда у нас есть замаскированная версия изображения, давайте реализуем шаг дорисовки изображения.
Поскольку DALL-E не является моделью с открытым исходным кодом, а использование ее API не бесплатно, в следующем примере мы заменим эту модель на модель генерации изображений с открытым исходным кодом. В частности, мы реализуем модель Stable Diffusion для дорисовки изображений с помощью HuggingFace.
Допустим, мы хотим заменить кекс на изображении чашкой кофе. Мы можем сделать это с помощью следующего кода:
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)
Замените кекс на изображении чашкой кофе с помощью Stable Diffusion.png
Это все, что нам нужно сделать, чтобы воссоздать метод дорисовки изображений, реализованный Delivery Hero!
Качество изображений, сгенерированных ИИ и реализованных Delivery Hero, очень хорошее. Благодаря этому подходу они могут рекомендовать каталог высококачественных изображений еды для продукта, из которого поставщики могут выбирать.
Однако в процессе генерации изображений еды они сталкиваются с одной существенной проблемой: аспектом безопасности. Мы обсудим эту проблему на следующем шаге.
Создание системы безопасности
Сложный подход к генерации изображений, обсуждавшийся в предыдущем разделе, основан на текстовом запросе. Это означает, что иногда модель генерации изображений может неправильно понять наше намерение.
Например, допустим, мы хотим сгенерировать изображение еды — курицы на тарелке. Без какого-либо контроля безопасности модель может сгенерировать изображения следующим образом:
Изображение, которое мы хотим, по сравнению с изображением, сгенерированным ИИ без какого-либо контроля безопасности .png
Поэтому нам нужен компонент для контроля качества изображения, генерируемого моделью. Именно здесь в игру вступает система безопасности.
Delivery Hero реализует систему безопасности на основе четырех компонентов: тегирование изображений, центрирование изображений, обнаружение текста и резкость изображения. В презентации на митапе команда Delivery Hero сосредоточилась на двух компонентах: тегировании изображений и центрировании изображений.
Тегирование изображений
Первый подход, реализованный Delivery Hero в качестве системы безопасности, — это тегирование изображения, сгенерированного моделью генерации изображений. Тегирование изображений относится к процессу прогнозирования тегов изображения с помощью модели машинного обучения. Для этой цели Delivery Hero использовала модель под названием Recognize-Anything Plus Model (RAM++).
RAM++ — это мощная модель тегирования изображений с исключительным zero-shot обобщением. Благодаря интеграции с LLM она может распознавать 4 585 уникальных тегов.
RAM++ получает три разных входных данных во время процесса обучения: изображение, текст и тег. Комбинация текста и тега расширяет область визуальных концепций, которые могут быть выведены из изображения. Чтобы еще больше улучшить обобщающую способность модели, RAM++ использует ChatGPT для создания различных вариантов описаний каждого тега на основе пяти разных подсказок:
Кратко опишите, как выглядит {tag}.
Как можно кратко идентифицировать {tag}?
Как кратко выглядит {tag}?
Каковы выявленные характеристики {tag}?
Пожалуйста, предоставьте краткое описание визуальных характеристик {tag}.
Image tagging- tag-to-text:RAM:RAM++ architecture .png
Эти описания тегов, сгенерированные GPT 3.5 Turbo, расширяют семантическое значение каждого тега, тем самым улучшая охват визуальных концепций изображения.
Затем текст и описания тегов передаются в текстовый энкодер, в то время как изображение передается в энкодер изображений. Результаты этих энкодеров затем объединяются внутри так называемого блока декодера выравнивания, который состоит из слоев cross-attention и feed-forward, чтобы сгенерировать итоговые теги изображения.
Чтобы реализовать RAM++ для генерации тега изображения, мы должны сначала установить библиотеку recognize-anything, а затем использовать командную строку для генерации тега изображения. В следующем примере мы предскажем тег изображения, который использовали в предыдущем разделе.
!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
В приведенной выше команде-примере мы используем модель Swin-Transformer в качестве энкодера изображений, и ниже приведен вывод, который мы должны получить:
The tags generated by the Swin-Transformer model .png
Как видите, для наших изображений мы получаем такие теги, как “beverage,” “cloth,” “coffee,” “coffee cup,” “cup,” “cupcake,” “table,” “dining table,” “plate,” и т. д.
Среди всех 4585 категорий тегов специалисты по данным в Delivery Hero определили 10 тегов "food" и 50 "negative" тегов. "negative" теги включают несколько тегов, связанных с животными, таких как “bug”, “beetle”, “ant”, “hornet” и т. д.
Image tagging with the Swin-Transformer model.png
Затем они присвоили оценку каждому AI-сгенерированному изображению еды на основе тегов, предсказанных моделью RAM++.
Оценка равна 1, если изображение содержит хотя бы один "food" тег и не содержит "negative" тегов.
Оценка равна 0, если изображение содержит "negative" тег.
Центрирование изображения
Еще один компонент, реализованный специалистами по данным в Delivery Hero для повышения безопасности AI-сгенерированных изображений, — это центрирование изображения. В этом компоненте оценивается пропорциональность сгенерированного изображения. Как вы, возможно, уже знаете, еда в центре изображения выглядит более привлекательно, чем еда у края или обрезанная на изображении.
Для оценки пропорциональности изображения Delivery Hero использует Grounding DINO, описанный в предыдущем разделе, для обнаружения объекта еды на изображении. Затем ограничивающая рамка, созданная моделью, оценивается для определения качества изображения.
Система оценки выглядит следующим образом:
0, если еда или объект тарелки не обнаружены
0,5, если ограничивающая рамка касается края изображения
1, если ограничивающая рамка находится в центре изображения
Последний шаг — объединение оценки каждого компонента с помощью взвешенной функции. В конце каждое изображение получает взвешенную оценку по четырем компонентам. При применении порогового значения изображение с взвешенной оценкой ниже этого порога будет отфильтровано и не рекомендовано поставщикам.
Image scoring.png
Заключение
В этой статье мы обсудили, как два дата-сайентиста в Delivery Hero используют модели ИИ для генерации высококачественных изображений еды, чтобы улучшить пользовательский опыт и коэффициент конверсии. Их подход состоит из двух этапов: генерации изображений еды и создания системы безопасности.
Они использовали DALL-E от OpenAI для генерации изображения и реализовали метод дорисовки изображений с помощью Grounding DINO и DALL-E. Команда применила четыре компонента для формирования итоговой оценки, определяющей безопасность сгенерированного изображения: тегирование изображения, центрирование изображения, обнаружение текста и резкость изображения. Оценки, полученные по этим четырем компонентам, затем объединяются с помощью взвешенной функции, чтобы присвоить каждому изображению одно итоговое значение оценки. При применении порога изображение с итоговой оценкой ниже порога будет отфильтровано и не рекомендовано поставщикам.
Вы можете получить доступ к коду, продемонстрированному в этой статье, через этот блокнот.
Вы можете посмотреть запись выступления команды Delivery Hero на YouTube.
Читать далее

Why We Built Vector Lakebase: Rethinking Unstructured Data Architecture for AI
Vector Lakebase: a unified, lake-native data foundation for AI workloads — and an answer to what happens after vector databases succeed.

How to Improve Retrieval Quality for Japanese Text with Sudachi, Milvus/Zilliz, and AWS Bedrock
Learn how Sudachi normalization and Milvus/Zilliz hybrid search improve Japanese RAG accuracy with BM25 + vector fusion, AWS Bedrock embeddings, and practical code examples.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.


