Дайджесты новостей
Синтез флакона с нативным прозрачным фоном по десяти референсам в Qwen Image 2.1

Прозрачный фон и 10 референсов: возможности мультимодальной модели Qwen Image 2.1

Если ты хоть раз готовил карточки товаров для интернет-магазина или верстал рекламный промо-лендинг, ты отлично знаешь эту боль. Тебе присылают фото реального флакона духов или кроссовок на пестром складе, и начинается бесконечная возня в графическом редакторе: вырезать маску, аккуратно стереть фон, попытаться сохранить тонкие полупрозрачные грани стекла или волоски меха, а потом часами бороться с «паразитной» зеленой или серой каймой по краям.

Автоматические утилиты вроде rembg или сегментационные нейросети типа Segment Anything (SAM) часто делают картинку топорной: срезают естественные блики, превращают стеклянные стенки в непрозрачный пластик и безжалостно убивают капли воды и дым. В классических диффузионных моделях вроде Midjourney или Stable Diffusion фон всегда генерируется монолитным — приходится сначала генерировать объект на белом фоне, а затем вырезать его сторонними скриптами.

Команда Alibaba выкатила открытую мультимодальную модель Qwen Image 2.1 с 7 миллиардами параметров, которая переворачивает этот пайплайн с ног на голову. Модель умеет генерировать прозрачный фон нативно прямо в процессе диффузии и способна одновременно ориентироваться на до 10 референсных изображений.

Как работает нативный RGBA VAE

Главный технологический трюк релиза кроется в архитектуре автоэнкодера (VAE). Традиционные диффузионные модели работают в трехканальном латентном пространстве ($R, G, B$) — для них прозрачности как физической величины просто не существует. Любая попытка отрезать задний план — это внешняя хирургическая операция над уже готовыми пикселями.

Инженеры Qwen внедрили 64-канальный RGBA VAE, в котором альфа-канал ($A$) кодируется и диффундирует наравне с цветовыми каналами. Модель буквально «понимает», какая часть объекта является полностью непрозрачной, где находится полупрозрачное затемненное стекло, а где пиксели должны быть абсолютно пустыми ($A = 0$).

На выходе ты сразу получаешь честный 32-битный PNG-файл без каких-либо артефактов обтравки, ореолов или фальшивых теней.

До 10 референсов: контроль геометрии и айдентики

Вторая большая проблема генеративных сетей при работе с брендами — «галлюцинации» геометрии. Если тебе нужно показать один и тот же товар в пяти ракурсах или вписать физический продукт в новый интерьер, промпт-инжиниринг обычно бессилен: флакон меняет пропорции, этикетка сползает, а шрифт превращается в эльфийские руны.

В Qwen Image 2.1 встроили механизм мультиреференсного кондиционирования. Ты можешь «скормить» сети пачку до 10 кадров одновременно:

  • 3–4 снимка реального товара с разных ракурсов для фиксации геометрии;
  • 2 кадра с фирменной палитрой бренда и паттернами;
  • 2 примера желаемой студийной схемы освещения;
  • референс позы человека или композиции кадра.

Трансформерная архитектура с перекрестным вниманием (cross-attention) сопоставляет элементы референсов и воссоздает предмет в новой сцене с поразительной точностью формы, надписей и текстуры материала.

Скрипт сборки предметной карточки через API

Покажу, как это выглядит на практике при вызове официального эндпоинта DashScope. Мы кодируем пачку референсов в Base64, задаем текстовую инструкцию и активируем режим нативной прозрачности.

import os
import requests
import base64

API_KEY = os.getenv("DASHSCOPE_API_KEY")
ENDPOINT = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis"

def encode_image(file_path: str) -> str:
    """Кодируем локальный графический референс в формат base64 data URI."""
    with open(file_path, "rb") as image_file:
        encoded = base64.b64encode(image_file.read()).decode("utf-8")
        return f"data:image/png;base64,{encoded}"

# Собираем до 10 исходных референсов (ракурсы товара, текстура стекла, студийный свет)
reference_list = [
    encode_image(f"./references/perfume_view_{i}.png")
    for i in range(1, 4)
]

payload = {
    "model": "qwen-image-2.1-turbo",
    "input": {
        "prompt": (
            "A luxury cosmetic glass perfume bottle, emerald green frosted glass with gold spray cap. "
            "Isolated subject on a completely transparent background, clean edges, studio product lighting, "
            "realistic reflections on the glass surface."
        ),
        "negative_prompt": "opaque background, white background, solid color backdrop, clipping artifacts",
        "reference_images": reference_list,
        "output_format": "rgba_png",
        "transparency_mode": "native_alpha"
    },
    "parameters": {
        "width": 1024,
        "height": 1024,
        "steps": 8,  # Ускоренный дистиллированный режим инференса
        "guidance_scale": 5.0,
        "seed": 42
    }
}

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
    "X-DashScope-Async": "enable"
}

response = requests.post(ENDPOINT, headers=headers, json=payload).json()
task_id = response["output"]["task_id"]
print(f"Генерация запущена. Идентификатор задачи: {task_id}")

После старта генерации мы опрашиваем статус фоновой задачи и забираем чистый PNG:

import time

def download_transparent_result(task_id: str, save_path: str = "product_isolated.png"):
    status_url = f"https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}"
    req_headers = {"Authorization": f"Bearer {API_KEY}"}

    while True:
        task_data = requests.get(status_url, headers=req_headers).json()
        status = task_data["output"]["task_status"]

        if status == "SUCCEEDED":
            download_url = task_data["output"]["results"][0]["url"]
            img_bytes = requests.get(download_url).content
            with open(save_path, "wb") as f:
                f.write(img_bytes)
            print(f"Готово! Чистый RGBA-файл сохранен в {save_path}")
            break
        elif status in ["FAILED", "CANCELED"]:
            error_msg = task_data["output"].get("message", "Неизвестная ошибка")
            raise RuntimeError(f"Сбой генерации изображения: {error_msg}")

        time.sleep(2)

download_transparent_result(task_id)

Скорость инференса и локальный запуск

Особого внимания заслуживает режим Turbo: благодаря продвинутой дистилляции шаг сэмплирования удалось сократить всего до 8 итераций. На современных ускорителях (уровня NVIDIA RTX 4090 или серверных A100) синтез кадра в разрешении $1024 \times 1024$ занимает от 2 до 4 секунд.

Если ты планируешь разворачивать веса локально через ComfyUI или Diffusers:

  • Для работы полной 7B-модели со всеми 10 активными референсами требуется около 24 ГБ VRAM.
  • Если использовать квантование NF4 или GGUF, модель комфортно помещается в 12–16 ГБ VRAM, позволяя запускать студийный генератор прямо на рабочей станции разработчика.

При всей мощи архитектуры держи в голове важное ограничение: если скормить модели 10 референсов с конфликтующими стилями (например, один снимок в жестком контровом свете неонового клуба, а другой — в рассеянном полуденном солнце), внимание трансформера размывается, и результирующий объект может получить смазанные текстуры или странные пропорции. Референсы должны дополнять друг друга, а не спорить между собой.