Полтора года назад один B2B-производитель мебели залил 400 CAD-моделей новой линейки в популярную облачную сетку через API, чтобы сэкономить на услугах фотостудии. Через две недели концепт их флагманского кресла всплыл на китайском маркетплейсе, а сгенерированные текстуры шпона выглядели как дешевая пленка ПВХ. Запуск сорвали, убытки списали.
Все вокруг продают идею, что генерация картинок — это магия из пары промптов. Для селлеров чехлов на смартфоны — возможно. Но когда у вас суровый B2B, NDA на будущие релизы, а чертежи запрещено отдавать в облака, дефолтный подход летит в стену. Если у вас номенклатура на тысячи позиций, генерация фото товаров нейросетью on-prem становится единственным инженерно адекватным способом не слить коммерческую тайну конкурентам и не разориться на студийном свете. Ритейлу и SaaS-сервисам плевать на ваши допуски. Вам нужна своя инфраструктура. Без подписок, без сливов за периметр и с полным контролем над пикселями.
Экономика инференса: когда железо бьет софиты
Считаем в лоб. 5000 SKU. Стандартная предметная съёмка — это 800–2000 рублей за кадр. Итого около 7.5 миллионов рублей только на фотографа и базовую ретушь. Добавьте скрытые косты: логистику, аренду фур, риск повредить образцы при транспортировке, зарплаты грузчикам. А через год при ревизии линейки вы будете повторять этот цирк заново.
Своя карточка товара без фотостудии для каталога мебели или промышленных деталей ломает эту экономику на старте. Сервер с мощными GPU обойдется в 1.5–2.5 миллиона рублей. Точка окупаемости on-prem-стенда наступает на отметке примерно в 1500–2000 позиций. Дальше стоимость генерации одного кадра — это стоимость потребленных киловатт-часов.
Пайплайн, которому плевать на красоту
Скармливать диффузии сырые рендеры и ждать чуда — прямой путь к увольнению. В B2B-сегменте консистентность на порядок важнее художественной выразительности. Если у вас в каталоге пятьдесят видов стальных фланцев, они обязаны стоять под одним углом, отбрасывать идентичную тень и лежать на едином фоне. Покупатель не должен думать, что вы собирали ассортимент по барахолкам.
Мы не пишем абстрактные промпты, мы жестко фиксируем геометрию. Берется исходный CAD, из него извлекаются карта глубин и геометрические грани. Генерация изображений из CAD напрямую через ControlNet запрещает модели менять форму детали. Шаг вправо, шаг влево — расстрел. Чтобы зафиксировать бренд-стиль, ракурсы и освещение, используется IP-Adapter или кастомная LoRA, натренированная на 50 эталонных снимках вашего старого каталога. Она заставляет пайплайн светить правильным студийным светом и не выдумывать отсебятину.
Здесь же решается критичная проблема сохранения узнаваемости материала. Модель обожает замыливать фактуры. ЛДСП «дуб сонома» должна читаться как пористая деревянная структура. Шлифованный металл требует микроцарапин и холодного блика. Это достигается точечными масками и промптами материалов. Но самая страшная беда любой AI — потеря фактической достоверности. Нейросеть не знает сопромата. Она легко дорисовывает несуществующий крепеж для композиции или замазывает технологический паз. Когда мы в Morana Labs катили генеративный пайплайн для завода металлоконструкций, первая же итерация безжалостно слизала все фаски на силовых узлах, превратив рабочие детали в монолитные куски мыла. Решается это исключительно внедрением human-in-the-loop: оператор визуально сверяет результат с исходным чертежом, а модель перерисовывает ошибочные зоны локально.
import torch
from diffusers import StableDiffusionXLControlNetPipeline, ControlNetModel
controlnets = [
ControlNetModel.from_pretrained("diffusers/controlnet-depth-sdxl-1.0", torch_dtype=torch.float16),
ControlNetModel.from_pretrained("diffusers/controlnet-canny-sdxl-1.0", torch_dtype=torch.float16)
]
pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
controlnet=controlnets,
torch_dtype=torch.float16
).to("cuda")
# LoRA enforces brand lighting and materials
pipe.load_lora_weights("/models/lora/b2b_brand_lighting_v3.safetensors")
def generate_b2b_sku(cad_depth, cad_edges, material):
generator = torch.Generator(device="cuda").manual_seed(42) # Strict determinism
return pipe(
prompt=f"{material}, industrial product photography, unified studio lighting",
negative_prompt="plastic, rendering, deformations, extra bolts, organic shapes",
image=[cad_depth, cad_edges],
controlnet_conditioning_scale=[0.8, 0.5],
generator=generator
).images[0]Железо под 152-ФЗ и предел применимости
Дефицит чипов нарастает, но для закрытого периметра вам не нужны кластеры H100. Рабочий product photography AI on-prem стенд собирается на базе серверов с парой карт класса RTX 4090 или энтерпрайз-аналогов L40S. Связка TensorRT и оптимизированного пайплайна выдает throughput на уровне 300–400 готовых карточек в час. Весь каталог на 5000 SKU машина переварит за пару выходных. При этом данные не покидают закрытую сеть предприятия, а если для масштаба в кадр генерируются лица людей-моделей, вы не нарушаете 152-ФЗ, потому что ни один пиксель не уходит на зарубежные сервера.
Но выкидывать софиты на свалку рано. Есть три сценария, когда арендовать живую фотостудию дешевле и быстрее:
- Специфический текстиль со сложной драпировкой (нейросети пока не умеют физически корректно складывать ткань под уникальную 3D-модель).
- Ювелирные изделия с камнями (каждое преломление света критично для стоимости, а фейковый блик рушит доверие).
- Каталог меньше 300 SKU, который обновляется раз в пять лет (разворачивать локальную ML-инфраструктуру ради одной сессии тупо нерентабельно).
Своя генеративная фотостудия окупается только на промышленных объемах, параноидальном контроле данных и скорости вывода новых линеек на рынок. Вы инвестируете в стенд, настраиваете инференс, а дальше режете логистические косты под ноль. Считайте математику для своей номенклатуры через /calculator и приходите пилотировать генеративку Morana on-prem на нашем железе, прежде чем сжигать бюджеты на закупку собственных GPU.