Инженерлік хаб

Instagram-бутиктерге арналған виртуалды киім ауыстыратын бөлме: Клиент фотосы бойынша Imagen 3 / Vertex AI-да Image-to-Image генерациясы

03.09.2026
Шарафутдинов Р.

«Ал бұл көйлек маған қалай жарасады? Менің бөксем мына корей моделіне қарағанда кеңірек қой!» — Алматы мен Астанадағы Instagram-шоурум иелері осы классикалық сұрақтың кесірінен ыстық сатылымдардың 40%-ын жоғалтады. Клиент киім «жараспай қалады» деп қорқады, қосымша фото, видео, өлшемдер сұрайды, ал ақырында «ойланайын» деп кетіп қалады. Қазақстандағы классикалық e-commerce сәйкес келмеу қорқынышынан туындаған қайтарымдар мен тасталған себеттерден тұншығуда. OZAT-та біз каталогыңыздағы кез келген киімді 4 секунд ішінде сатып алушының нақты фотосына «кигізетін» Vertex AI Imagen 3 негізінде Telegram-да виртуалды киім ауыстыратын бөлмені қалай жинайтынымызды көрсетеміз.

Неліктен қарапайым шешімдер жұмыс істемейді? Кәдімгі Photoshop бір фотоға дизайнердің 15 минут уақытын алады — бұл масштабталмайды. Фильтрлері бар танымал Telegram-боттар көбінесе кринж береді: көйлекті футболканың үстіне жапсырады немесе бет-әлпетті бұзатыны сонша, клиент қорқып кетеді. Ал Stable Diffusion үшін қуатты GPU бар жеке серверлерді көтеру — бұл шағын бизнес көтере алмайтын ғарыштық CapEx (темір үшін айына $3000-нан бастап). Бізге тек генерация фактісі үшін ақы алатын API бар Serverless-тәсіл қажет.

Fashion-ритейл үшін Imagen 3 революциясы неде?

  • Жарықтандыруды терең түсіну (Lighting & Shadows): Ескі модельдерден айырмашылығы, Imagen 3 тек текстураны қабаттастырмайды. Ол клиент тұрған бөлменің көлеңкелерін және жаңа көйлектің матасындағы жарқылдарды есептейді.
  • Маталардың фотореализмі: Жібек жібектей жарқырайды, ал дөрекі жүн күңгірт болып көрінеді. Модель мәтіндік промпт бойынша материалдардың фактурасын мінсіз өңдейді.
  • Сәйкестікті сақтау: Inpainting-insert режимі бет-әлпетке, шаш үлгісіне, фонға және клиенттің қолындағы смартфонға тиіспей, қатаң түрде маска аймағын (ескі киім) өзгертеді.
  • Құны (FinOps): Бір генерация үшін бар болғаны $0.03. 15 теңгеге сіз клиенттің қарсылығын жабасыз және көйлекті 35 000 теңгеге сатасыз.

Google-дың бұлтты инфрақұрылымын пайдалана отырып, бұл конвейерді бағдарламалық түрде қалай жинауға болатынын көрейік.


1. Архитектура: Маскалау + Vertex AI-да Inpainting

VTON (Virtual Try-On) пайплайны әрқашан екі кезеңнен тұрады. Алдымен, нейрожеліге: «Жаңа көйлекті фигураны ескере отырып, қатаң түрде осы шекараларда сал» деп айту үшін, клиенттің фотосуретінде оның қазіргі киімі дәл қай жерде орналасқанын түсінуіміз керек.

  • 1-қадам: Auto-Masking. Жеңіл сегментация моделі (мысалы, Segment Anything немесе U-Net) фотосуретті жылдам сканерлейді және ақ-қара масканы (киімнің сұлбасы) жасайды.
  • 2-қадам: Vertex AI Imagen 3. Біз түпнұсқа фотосуретті, масканы және жаңа заттың мәтіндік сипаттамасын edit_image API-іне береміз. Imagen 3 ескі киімді «кесіп алып», оның орнына жаңасын жасайды, жиектерін пиксель-пиксельге тігеді.
Сәулет сұлбасы / Деректер ағыны (ASCII)
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                          VIRTUAL TRY-ON (VTON) PIPELINE ON VERTEX AI                                        │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

 [ Покупательница в Telegram / Instagram Direct ]
       │ (Отправляет свое фото в зеркале и ссылку на красное платье)
       ▼
 ┌─────────────────────────────────────────────────────────┐
 │ Cloud Run Webhook (FastAPI)                             │
 └────────────────────────────┬────────────────────────────┘
                              │ Извлечение фото + формирование промпта
                              ▼
 ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 │ ЭТАП 1: Segmentation Model (Auto-Masking)                                                                 │
 │    • Определение силуэта клиентки и контуров её текущей одежды                                            │
 │    • Генерация альфа-маски (зона для inpainting)                                                          │
 └────────────────────────────┬──────────────────────────────────────────────────────────────────────────────┘
                              │ Базовое фото + Маска + Промпт
                              ▼
 ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 │ ЭТАП 2: Vertex AI Imagen 3 (EditImage API / Inpainting-insert)                                            │
 │    • Учитывает позу, комплекцию, оригинальное освещение и тени                                            │
 │    • Промпт: "A photorealistic elegant red evening dress, silk, perfect fit on the subject..."            │
 └────────────────────────────┬──────────────────────────────────────────────────────────────────────────────┘
                              │
                              ▼ Сгенерированное фото (JPEG)
 ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
 │ Отправка результата клиентке (Latency: ~4-6 секунд)                                                       │
 └───────────────────────────────────────────────────────────────────────────────────────────────────────────┘

2. 1-листинг: Vertex AI Imagen 3 интеграциясы (Python)

Төменде ресми Google Cloud SDK негізіндегі сервистің коды берілген. Біз inpainting-insert режимімен edit_image әдісін қолданамыз. guidance_scale=21 параметрі модельді қиялдап кетпеуі үшін біздің промптқа (заттың сипаттамасына) қатаң сүйенуге мәжбүр етеді.

import os
import logging
from typing import Optional
import vertexai
from vertexai.preview.vision_models import ImageGenerationModel, Image as VertexImage

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Инициализация Vertex AI
PROJECT_ID = os.environ.get("GOOGLE_CLOUD_PROJECT", "ozat-cloud-kz")
LOCATION = os.environ.get("VERTEX_LOCATION", "us-central1")
vertexai.init(project=PROJECT_ID, location=LOCATION)

# Загрузка модели Imagen 3
# Используем latest версию для генерации и inpainting
generation_model = ImageGenerationModel.from_pretrained("imagen-3.0-generate-001")

def generate_virtual_tryon(
    client_image_bytes: bytes, 
    mask_bytes: bytes, 
    garment_prompt: str
) -> Optional[bytes]:
    """
    Пайплайн Virtual Try-On (VTON) на базе Imagen 3 Edit API (Inpainting).
    :param client_image_bytes: Исходное фото клиента.
    :param mask_bytes: Маска старой одежды (белый цвет - зона замены, черный - фон).
    :param garment_prompt: Детальное описание новой вещи.
    """
    try:
        base_img = VertexImage(client_image_bytes)
        mask_img = VertexImage(mask_bytes)
        
        logger.info(f"Запуск Imagen 3 Inpainting с промптом: {garment_prompt}")
        
        # Inpainting-insert позволяет модели гармонично "вписать" новую текстуру 
        # с учетом освещения и теней базового фото
        response = generation_model.edit_image(
            base_image=base_img,
            mask=mask_img,
            prompt=garment_prompt,
            edit_mode="inpainting-insert",
            guidance_scale=21, # Высокий guidance для точного следования промпту
            number_of_images=1
        )
        
        if not response.images:
            logger.error("Imagen 3 не вернул изображений (возможно сработал фильтр безопасности).")
            return None
            
        return response.images[0]._image_bytes

    except Exception as e:
        logger.error(f"Ошибка вызова Vertex AI: {str(e)}")
        return None

GitHub-тағы кодты көру (OZAT-kz)


3. 2-листинг: Telegram-ботқа арналған FastAPI Webhook

Бұл эндпоинт Telegram-нан клиенттің фотосуретін және ол таңдаған тауардың сипаттамасын қабылдайды. Бот деректерді конвейерге жіберіп, дайын нәтижені қайтарады. Барлық сиқыр «капоттың астында» жасырылған, пайдаланушы үшін бұл бар болғаны 4 секунд күту.

from fastapi import FastAPI, UploadFile, File, Form, HTTPException
from fastapi.responses import Response
import os
from vton_service import generate_virtual_tryon
from masking_service import generate_auto_mask # Гипотетический сервис (например, SAM)

app = FastAPI(title="OZAT VTON Bot API")

@app.post("/api/v1/try-on")
async def virtual_try_on_endpoint(
    photo: UploadFile = File(...),
    garment_description: str = Form(...)
):
    """
    Эндпоинт для Telegram-бота: принимает фото клиентки и текстовое описание одежды.
    Возвращает сгенерированное фото (JPEG).
    """
    if not photo.content_type.startswith("image/"):
        raise HTTPException(status_code=400, detail="Только изображения")
        
    client_image_bytes = await photo.read()
    
    # 1. Автоматическая генерация маски (сегментация текущей одежды)
    # В production здесь вызывается легковесная модель типа U-Net или Segment Anything (SAM)
    mask_bytes = await generate_auto_mask(client_image_bytes)
    
    if not mask_bytes:
        raise HTTPException(status_code=422, detail="Не удалось выделить силуэт одежды")

    # 2. Вызов Vertex AI Imagen 3
    result_bytes = generate_virtual_tryon(
        client_image_bytes=client_image_bytes,
        mask_bytes=mask_bytes,
        garment_prompt=f"A highly photorealistic full-body shot. The person is wearing {garment_description}. Perfect fit, studio lighting, highly detailed fabric texture, no artifacts."
    )

    if not result_bytes:
        raise HTTPException(status_code=500, detail="Ошибка генерации Imagen 3")

    return Response(content=result_bytes, media_type="image/jpeg")

4. Пайданы цифрландыру: Метрикалар және ROI

Біз бұл пайплайндı жергілікті fashion-брендтердің бірі үшін тест режимінде енгіздік. Метрикалар Директке түскен 1 200 бірегей өтініш таңдамасында өлшенді.

Конверсия из диалога в покупку (Direct Sales %)

Возвраты из-за несоответствия посадки (Returns %)

Бизнес-нәтижелер:

  • Диалогтан сатып алуға конверсия: +22.4 п.п.-ға өсті (клиенттер «ойланайын» деп кетуді қойды).
  • Қайтарымдарды азайту (Returns Rate): -18%-ға төмендеді, өйткені күту/шынайылық жақындай түсті.
  • Жылдамдық (Latency): Генерацияға 4.8 секунд (p95).
  • FinOps (Құны): 1000 генерация (киіп көру) Vertex AI-да бар болғаны $30 тұрады. Бұл тірі модельдерді жалдаумен және әр өлшем үшін фотосессия ұйымдастырумен салыстыруға келмейді.

5. 3-листинг: Terraform-дағы инфрақұрылым

GPU бар арнайы серверлер жоқ. Біз Cloud Run (Scale-to-Zero) ішінде stateless-микросервисті өрістетеміз және оған Vertex AI-ға жүгіну құқығын береміз. Бот жұмысының миллисекундтары үшін ғана төлейміз.

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 5.0"
    }
  }
}

variable "project_id" { type = string }
variable "region" { default = "europe-west1" } # Cloud Run
variable "vertex_region" { default = "us-central1" } # Imagen 3 Availability

provider "google" {
  project = var.project_id
  region  = var.region
}

# Активация API Vertex AI
resource "google_project_service" "aiplatform" {
  service = "aiplatform.googleapis.com"
  disable_on_destroy = false
}

# Сервисный аккаунт для Cloud Run с доступом к Vertex AI
resource "google_service_account" "vton_sa" {
  account_id   = "vton-backend-sa"
  display_name = "SA for VTON Cloud Run"
}

resource "google_project_iam_member" "vertex_user" {
  project = var.project_id
  role    = "roles/aiplatform.user"
  member  = "serviceAccount:${google_service_account.vton_sa.email}"
}

# Cloud Run микросервис
resource "google_cloud_run_v2_service" "vton_backend" {
  name     = "vton-bot-backend"
  location = var.region
  ingress  = "INGRESS_TRAFFIC_ALL"

  template {
    service_account = google_service_account.vton_sa.email
    scaling {
      max_instance_count = 5
    }
    containers {
      image = "${var.region}-docker.pkg.dev/${var.project_id}/apps/vton-backend:latest"
      resources {
        limits = {
          memory = "1024Mi"
          cpu    = "1"
        }
      }
      env {
        name  = "VERTEX_LOCATION"
        value = var.vertex_region
      }
    }
  }
  depends_on = [google_project_iam_member.vertex_user]
}

GitHub-тағы кодты көру (OZAT-kz)


6. 4-листинг: Жинау және деплой жасау

Google Cloud CLI арқылы жариялаудың стандартты циклі.

# 1. Настройка проекта
gcloud auth login
gcloud config set project ozat-cloud-kz

# 2. Включение Vertex AI API
gcloud services enable aiplatform.googleapis.com

# 3. Сборка Docker-образа
gcloud builds submit --tag europe-west1-docker.pkg.dev/ozat-cloud-kz/apps/vton-backend:latest

# 4. Применение Terraform
terraform init
terraform apply -var="project_id=ozat-cloud-kz" -auto-approve

GitHub-тағы кодты көру (OZAT-kz)


7. Шешімнің шынайы шектеулері мен компромисстері

Инженерлік аудит: шынайы шектеулер мен компромисстер
  • 1. Күрделі принттер мен логотиптер: Imagen 3 фактураны (жібек, зығыр, былғары) өте жақсы салады, бірақ егер футболкада жазулары бар нақты күрделі принт болса, модель оны бұрмалауы мүмкін (мәтін галлюцинациясы). Ірі логотиптері бар қатаң брендтер үшін бұл мәселе.
  • 2. Күрделі позалар (Окклюзия): Егер фотосуретте клиент қолын кеудесіне айқастырса немесе денесінің жартысын жауып тұрған сөмке ұстаса, Inpainting табиғи емес саусақтарды жасауы немесе сөмкені көйлек матасымен «біріктіруі» мүмкін. Клиенттерге: «Тік тұрыңыз, қолыңызды түсіріңіз» деп ескерту қажет.
  • 3. Auto-Masking сапасына тәуелділік: Imagen 3 өздігінен киімді кесіп алмайды. Егер алдын ала сегментациялау моделі қателесіп, фонның бір бөлігін ұстап қалса, жаңа көйлек бөлменің тұсқағазына «жайылып» кетеді.
  • 4. Vertex AI квоталары: Әдепкі бойынша Google Cloud-тың жаңа жобаларында суреттерді генерациялауға қатаң квоталар (QPM) қойылған. Вирустық ботты іске қосқан кезде лимиттерді көтеру үшін қолдау қызметіне алдын ала сұрау жазу қажет болады.

💡 ОЗАТ кеңесі: Енгізуге дайынсыз ба? Архитектура мен бюджетті Scope Builder арқылы есептеңіз немесе тегін ЖИ-аудиттен өтіңіз.

Рустам Шарафутдинов

Рустам Шарафутдинов

Инженерлік хаб авторы

Google Cloud архитектурасы саласындағы сарапшы және 15 жылдан астам тәжірибесі бар Senior Full-Stack әзірлеушісі. Ақауға төзімді архитектураларға, жоғары жүктемелі жобаларды оңтайландыруға және AI (Vertex AI) интеграциясына маманданған.

Сараптама: GCP, Kubernetes, Микросервистер, React, Node.js

Пікірлер (0)