Delivery Hero가 AI 생성 이미지를 위한 안전 시스템을 구현한 방법
다국적 온라인 음식 배달 기업인 Delivery Hero는 고객을 각자의 지역에 있는 레스토랑과 연결합니다. 따라서 회사가 Delivery Hero 서비스에 대한 전반적인 만족도를 유지하기 위해서는 양쪽 모두의 니즈를 이해하는 것이 매우 중요합니다.
베를린에서 열린 Zilliz Unstructured Data Meetup 발표에서, Delivery Hero의 데이터 과학자 두 명인 Iaroslav Amerkhanov와 Nikolay Ulyanov는 레스토랑 판매자와 고객의 니즈를 간소화하기 위한 연구 프로젝트에 대해 논의했습니다.
<< 밋업 발표 다시 보기 >>
내부 통계를 바탕으로 Delivery Hero는 흥미로운 사실을 발견했습니다. 앱에서 이미지가 첨부된 제품은 이미지가 없는 제품보다 훨씬 더 자주 주문된다는 것입니다. 구체적으로, 앱에서 주문된 제품의 86%에는 이미지가 첨부되어 있습니다. A/B 테스트를 실시한 후, 제품에 이미지를 추가하는 것만으로도 전환율이 6-8% 증가한다는 사실도 발견했습니다. 이 발견은 Delivery Hero 앱에서 판매자로부터 음식을 주문하기 전에 고객에게 제품 이미지가 중요한 요소 중 하나라는 것을 의미합니다.
하지만 모든 판매자가 매력적인 사진을 제공할 수 있는 것은 아니기 때문에, 각 레스토랑이나 판매자에게 제품 이미지를 제공해 달라고 요청하는 것은 번거로울 수 있습니다. 따라서 Delivery Hero의 데이터 과학자들은 AI 발전을 활용하여 제품의 고품질 사진을 생성하는 정교한 접근 방식을 제안했습니다. 이들의 접근 방식은 음식 이미지 생성과 안전 시스템이라는 두 단계로 구성됩니다.
먼저 음식 이미지 생성 단계에 대해 논의해 보겠습니다.
음식 이미지 생성
Delivery Hero는 제품 이미지를 생성하기 위해 두 가지 접근 방식을 구현합니다. 하나는 사용 가능한 생성형 AI 플랫폼의 API를 호출하는 것이고, 다른 하나는 이미지 인페인팅 방법을 사용하는 것입니다.
인기 이미지 생성 모델을 활용한 음식 이미지 생성
DALL-E, Midjourney, stable diffusion을 포함하여 고품질의 사실적인 이미지를 생성할 수 있는 여러 AI 모델이 있습니다. 이를 위해 Delivery Hero는 DALL-E를 사용하여 음식 이미지를 생성합니다.
GPT-3 모델과 마찬가지로 DALL-E는 Transformer-decoder 블록을 백본으로 사용합니다. Transformer 아키텍처는 매우 다재다능하며 텍스트와 이미지 같은 다양한 모달리티의 데이터를 생성할 수 있기 때문에 이는 놀라운 일이 아닙니다. 본질적으로 DALL-E는 텍스트 설명으로부터 이미지를 생성하도록 훈련됩니다.
텍스트 설명으로부터 DALL-E가 생성한 예시 이미지
DALL-E를 사용하여 이미지를 생성하는 것은 간단합니다. 유일한 요구 사항은 생성하고자 하는 이미지를 설명하는 텍스트 프롬프트를 제공하는 것입니다. Delivery Hero가 음식 이미지를 생성하는 데 사용한 프롬프트는 다음과 같습니다:
a professional photo of {dish} and {dish\_attributes} on a nice plate, {background} background
이 프롬프트를 통해 Delivery Hero는 특정 속성과 배경을 가진 요리의 고품질 이미지를 생성합니다.
DALL-E가 생성한 특정 속성과 배경을 가진 요리의 고품질 이미지.png
이미지 인페인팅을 활용한 음식 이미지 생성
Delivery Hero의 두 번째 음식 이미지 생성 접근 방식은 인페인팅 기법을 포함합니다. 이미지 인페인팅은 이미지의 특정 영역을 대체하는 과정을 의미합니다.
전반적으로, Delivery Hero가 이 접근 방식을 사용하여 음식 이미지를 생성하기 위해 구현한 단계는 네 가지입니다:
이미지 선택: 데이터 허브에서 요리 이미지를 선택합니다.
객체 감지: 객체 감지 모델을 사용하여 이미지에서 음식 객체를 감지합니다. 출력으로 감지된 음식의 바운딩 박스를 얻습니다.
이미지 마스킹: 경계 상자 내부 영역을 픽셀 값을 검은색 또는 흰색으로 대체하여 제거합니다.
이미지 인페인팅: 이미지 생성 모델을 사용하여 이미지에서 제거된 영역을 우리가 선택한 요리로 채웁니다.
인페인팅 기법을 사용한 이미지 생성
Delivery Hero는 이 접근 방식에 두 가지 모델을 사용합니다: 객체 감지를 위한 Grounding DINO와 이미지 인페인팅을 위한 DALL-E입니다.
이제 위의 이미지 인페인팅 접근 방식의 각 지점을 자세히 살펴보겠습니다. 이미지 선택 단계는 간단하므로 건너뛸 수 있습니다. 더 흥미로운 것은 Grounding DINO를 사용한 객체 감지 단계입니다.
간단히 말해, Grounding DINO는 텍스트와 이미지를 한 쌍으로 입력받는 객체 감지 모델입니다. 이 모델은 텍스트와 이미지 입력을 효과적으로 결합하여 강력한 객체 감지 모델을 생성하기 위해 세 가지 입력 융합 접근 방식, 즉 feature enhancer, language-guided query selection, cross-modality decoder를 사용합니다.
feature enhancer와 cross-modality decoder의 고수준 아키텍처는 attention layer와 feed-forward neural network를 포함하는 Transformer-block 아키텍처와 상당히 유사합니다. 그러나 두 구성 요소 모두 아래 시각화에 표시된 것처럼 텍스트와 이미지 입력을 융합하기 위해 정교한 image-to-text 및 text-to-image cross-attention layer를 갖추고 있습니다.
feature enhancer와 cross-modality decoder의 고수준 아키텍처 .png
HuggingFace를 사용하면 Grounding DINO를 쉽게 구현할 수 있습니다. 함께 따라 해보고 싶다면, 이 글에서 시연한 코드는 이 노트북에서 확인할 수 있습니다.
아래에 표시된 이미지에서 컵케이크를 감지하고 싶다고 가정해 보겠습니다. 다음 코드 스니펫은 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 # 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)
Grounding DINO가 감지한 콘텐츠 마스킹.png
이제 이미지의 마스킹된 버전이 있으므로, 이미지 인페인팅 단계를 구현해 보겠습니다.
DALL-E는 오픈소스 모델이 아니고 API 사용이 무료가 아니므로, 다음 예제에서는 이 모델을 오픈소스 이미지 생성 모델로 대체하겠습니다. 구체적으로는 HuggingFace의 도움을 받아 이미지 인페인팅을 위한 Stable Diffusion 모델을 구현하겠습니다.
이미지 속 컵케이크를 커피 한 잔으로 바꾸고 싶다고 가정해 보겠습니다. 다음 코드로 이를 수행할 수 있습니다.
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가 구현한 AI 생성 이미지의 품질은 매우 좋습니다. 이 접근 방식을 통해 벤더가 선택할 수 있는 고품질 제품 음식 이미지 카탈로그를 추천할 수 있습니다.
그러나 음식 이미지 생성 과정에서 한 가지 중요한 문제가 발생합니다. 바로 안전 측면입니다. 이 문제는 다음 단계에서 논의하겠습니다.
안전 시스템 구축
이전 섹션에서 논의한 정교한 이미지 생성 접근 방식은 텍스트 프롬프트에 의존합니다. 이는 때때로 이미지 생성 모델이 우리의 의도를 오해할 수 있음을 의미합니다.
예를 들어, 접시 위에 놓인 닭고기 음식 이미지를 생성하고 싶다고 가정해 보겠습니다. 안전 제어가 전혀 없다면, 모델은 다음과 같은 이미지를 생성할 수 있습니다.
우리가 원하는 이미지 vs. 안전 제어 없이 AI가 생성한 이미지 .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가 생성한 이러한 태그 설명은 각 태그의 의미론적 의미를 확장하여 이미지의 시각적 개념 범위를 향상시킵니다.
그런 다음 텍스트와 태그 설명은 텍스트 인코더로 전달되고, 이미지는 이미지 인코더로 전달됩니다. 이 인코더들의 결과는 이후 교차 어텐션 및 피드포워드 레이어로 구성된 이른바 정렬 디코더 블록 내부에서 융합되어 이미지의 최종 태그를 생성합니다.
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
그런 다음 RAM++ 모델이 예측한 태그를 기반으로 각 AI 생성 음식 이미지에 점수를 부여했습니다.
이미지에 하나 이상의 "food" 태그가 포함되어 있고 "negative" 태그가 없는 경우 점수는 1입니다.
이미지에 "negative" 태그가 포함된 경우 점수는 0입니다.
이미지 중앙 정렬
AI 생성 이미지의 안전성을 향상시키기 위해 Delivery Hero의 데이터 과학자들이 구현한 또 다른 구성 요소는 이미지 중앙 정렬입니다. 이 구성 요소에서는 생성된 이미지의 비례성이 평가됩니다. 이미 알고 계시겠지만, 이미지 중앙에 있는 음식은 가장자리에 있거나 이미지에서 잘린 음식보다 더 매력적입니다.
이미지의 비례성을 평가하기 위해 Delivery Hero는 이전 섹션에서 설명한 Grounding DINO를 활용하여 이미지에서 음식 객체를 감지합니다. 그런 다음 모델이 생성한 바운딩 박스를 평가하여 이미지의 품질을 판단합니다.
점수 체계는 다음과 같습니다:
음식이나 접시 객체가 감지되지 않으면 0
바운딩 박스가 이미지 가장자리에 닿으면 0.5
바운딩 박스가 이미지 중앙에 있으면 1
마지막 단계는 가중 함수로 각 구성 요소의 점수를 결합하는 것입니다. 최종적으로 각 이미지는 네 가지 구성 요소로부터 가중 점수를 갖게 됩니다. 임계값을 적용하면, 가중 점수가 해당 임계값보다 낮은 이미지는 필터링되어 벤더에게 추천되지 않습니다.
Image scoring.png
결론
이 글에서는 Delivery Hero의 두 데이터 과학자가 사용자 경험과 전환율을 개선하기 위해 AI 모델을 사용하여 고품질 음식 이미지를 생성하는 방법에 대해 논의했습니다. 이들의 접근 방식은 음식 이미지 생성과 안전 시스템 구축이라는 두 단계로 구성됩니다.
그들은 이미지를 생성하기 위해 OpenAI의 DALL-E를 사용했으며, Grounding DINO와 DALL-E의 도움을 받아 이미지 인페인팅 방법을 구현했습니다. 팀은 생성된 이미지의 안전성을 판단하기 위한 최종 점수를 생성하기 위해 이미지 태깅, 이미지 중심 정렬, 텍스트 감지, 이미지 선명도라는 네 가지 구성 요소를 채택했습니다. 이 네 가지 구성 요소에서 얻은 점수는 그런 다음 가중 함수와 결합되어 각 이미지에 하나의 최종 점수 값을 부여합니다. 임계값을 적용하면, 최종 점수가 임계값보다 낮은 이미지는 필터링되어 벤더에게 추천되지 않습니다.
이 글에서 시연한 코드는 이 노트북을 통해 확인할 수 있습니다.
Delivery Hero 팀의 발표 다시보기는 YouTube에서 시청할 수 있습니다.
계속 읽기

What Is a Vector Lakebase?
A Vector Lakebase is a unified, lake-native data architecture for AI that combines vector-database-grade serving with open lake storage, reusable lake-level indexes, and a shared semantic layer.

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.
Milvus/Zilliz + Surveillance: How Vector Databases Transform Multi-Camera Tracking
See how Milvus vector database enhances multi-camera tracking with similarity-based matching for better surveillance in retail, warehouses and transport hubs.


