Реализация AI-генерации рекламных баннеров

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Реализация AI-генерации рекламных баннеров
Средняя
~5 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

AI-генерация рекламных баннеров

AI-генерация баннеров автоматизирует создание рекламных материалов для контекстной рекламы, таргетинга, медийных размещений. Один набор ассетов → сотни форматов и вариаций за минуты вместо часов дизайнера.

Стек для баннерной генерации

from PIL import Image, ImageDraw, ImageFont
import io

class BannerGenerator:
    STANDARD_SIZES = {
        # Яндекс.Директ
        "yandex_240x400": (240, 400),
        "yandex_300x250": (300, 250),
        "yandex_728x90": (728, 90),
        # Google Ads
        "google_300x250": (300, 250),
        "google_160x600": (160, 600),
        "google_970x250": (970, 250),
        # ВКонтакте
        "vk_1080x607": (1080, 607),
        # Telegram Ads
        "telegram_800x418": (800, 418),
    }

    def __init__(self):
        self.image_gen = FluxImageGenerator()  # или DALL-E / SDXL

    async def generate_banner_set(
        self,
        product_image: bytes,
        headline: str,
        subtext: str,
        cta: str,
        brand_color: str,
        sizes: list[str] = None
    ) -> dict[str, bytes]:
        target_sizes = sizes or list(self.STANDARD_SIZES.keys())
        results = {}

        # Генерируем базовое background изображение
        bg_prompt = f"abstract background, {brand_color} color scheme, modern minimalist, no text, banner design"
        background = await self.image_gen.generate(bg_prompt, width=1920, height=1080)

        for size_name in target_sizes:
            w, h = self.STANDARD_SIZES[size_name]
            banner = self.compose_banner(
                background=background,
                product_image=product_image,
                headline=headline,
                subtext=subtext,
                cta=cta,
                brand_color=brand_color,
                size=(w, h)
            )
            results[size_name] = banner

        return results

    def compose_banner(
        self,
        background: bytes,
        product_image: bytes,
        headline: str,
        subtext: str,
        cta: str,
        brand_color: str,
        size: tuple
    ) -> bytes:
        w, h = size
        bg = Image.open(io.BytesIO(background)).resize(size, Image.LANCZOS)
        canvas = bg.copy()
        draw = ImageDraw.Draw(canvas)

        # Накладываем полупрозрачный оверлей
        overlay = Image.new("RGBA", size, (0, 0, 0, 100))
        canvas = Image.alpha_composite(canvas.convert("RGBA"), overlay).convert("RGB")
        draw = ImageDraw.Draw(canvas)

        # Товар (если горизонтальный баннер — слева, иначе по центру)
        if w > h:  # горизонтальный
            product = Image.open(io.BytesIO(product_image)).convert("RGBA")
            product.thumbnail((h - 20, h - 20))
            canvas.paste(product, (10, (h - product.height) // 2), product.split()[3])
            text_x = h + 10
        else:
            product = Image.open(io.BytesIO(product_image)).convert("RGBA")
            product.thumbnail((w - 20, h // 2))
            canvas.paste(product, ((w - product.width) // 2, 10), product.split()[3])
            text_x = 10

        # Текст
        try:
            font_headline = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", max(12, h // 8))
            font_sub = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", max(10, h // 12))
        except:
            font_headline = ImageFont.load_default()
            font_sub = font_headline

        draw.text((text_x, h // 2), headline, fill="white", font=font_headline)
        draw.text((text_x, h // 2 + h // 8 + 5), subtext, fill="#DDDDDD", font=font_sub)

        # CTA кнопка
        cta_y = h - h // 5
        draw.rounded_rectangle([text_x, cta_y, text_x + w // 3, cta_y + h // 8], radius=5, fill=brand_color)
        draw.text((text_x + 10, cta_y + 5), cta, fill="white", font=font_sub)

        buf = io.BytesIO()
        canvas.save(buf, format="PNG")
        return buf.getvalue()

A/B тестирование вариаций

async def generate_ab_variants(
    base_brief: dict,
    num_variants: int = 5
) -> list[dict]:
    """Генерируем варианты для A/B тестирования"""
    client = AsyncOpenAI()

    response = await client.chat.completions.create(
        model="gpt-4o",
        messages=[{
            "role": "system",
            "content": f"Создай {num_variants} вариантов текста для рекламного баннера. Для каждого: headline (до 30 символов), subtext (до 60 символов), cta (до 20 символов). Верни JSON массив."
        }, {
            "role": "user",
            "content": f"Продукт: {base_brief['product']}\nЦА: {base_brief['audience']}\nОффер: {base_brief['offer']}"
        }],
        response_format={"type": "json_object"}
    )

    variants_text = json.loads(response.choices[0].message.content)["variants"]
    results = []

    for variant in variants_text:
        banners = await generator.generate_banner_set(
            product_image=base_brief["product_image"],
            **variant,
            brand_color=base_brief["brand_color"]
        )
        results.append({"text": variant, "banners": banners})

    return results

Интеграция с рекламными кабинетами

class AdPlatformUploader:
    async def upload_to_yandex_direct(self, banners: dict, campaign_id: str): ...
    async def upload_to_vk_ads(self, banners: dict, account_id: str): ...
    async def upload_to_google_ads(self, banners: dict, customer_id: str): ...

Сроки: генератор баннеров с шаблоном → размеры → текст наложение — 1 неделя. Полноценная система с A/B тестами и загрузкой в рекламные кабинеты — 3–4 недели.