Код нейросети для генерации изображений: первый запуск
Код нейросети для генерации изображений на Python: разберём готовую модель, установку, фиксированный seed, сохранение PNG и ошибки, которые мешают получить картинку.
Е
Евгений
Дизайнер-партнёр LibraChat
8 мин чтения
Код нейросети для генерации изображений нужен не только разработчику. Иногда дизайнеру важно воспроизвести один кадр, поменять две строки описания и сравнить версии без ручного щёлканья интерфейса. Для такой задачи не надо обучать модель с нуля. Достаточно загрузить готовую модель через библиотеку, передать текстовое описание и сохранить изображение. Я покажу компактный скрипт и то, что стоит проверить до запуска.
Я впервые взялся за такой код ради серии иллюстраций к карточкам. Мне требовались три похожих композиции, а не три случайных красивых картинки. Тогда я понял пользу фиксированного начального числа для генератора: изменение промпта становится заметнее. В коде ниже это число — `7`; оно выбрано для повторяемости примера, а не потому, что даёт лучший рисунок.
Что именно делает код нейросети для генерации изображений
Есть два разных проекта, которые часто называют одной фразой. Первый — обучить собственную модель: собрать данные, выбрать архитектуру, считать ошибку, обновлять веса и оценивать результат. Второй — запустить уже обученную модель и получить изображение. Ниже речь о втором. Он подходит для первой практической пробы и не требует выдавать использование чужих весов за собственную разработку.
Библиотека Diffusers объединяет компоненты генерации в pipeline: текстовый кодировщик, модель, которая шаг за шагом преобразует шум, и декодер изображения. Конкретный состав зависит от выбранной модели. Поэтому я не советую копировать код для одной модели и молча подставлять название другой. Сначала смотрю карточку модели: тип pipeline, лицензию, требуемую память, примеры запуска.
Решение до запуска · Зачем оно нужно · Что записать у себя
Выбрать модель — Разные веса требуют разного кода и ресурсов — Идентификатор и версию модели
Проверить лицензию — Правила использования зависят от модели — Можно ли применять изображения в проекте
Определить устройство — На CPU генерация может быть очень долгой — CUDA или CPU, доступная память
Зафиксировать seed — Проще сравнивать правки описания — Одно число для серии вариантов
Назвать файл — Результаты не затрут друг друга — Папка и схема имён
Слово «код» здесь не обещает высокое качество само по себе. Слабое описание даст случайную композицию даже при безупречном Python. А хорошее описание не исправит нехватку памяти или неподходящую лицензию.
Код нейросети для генерации изображений на Python
Пример использует открытую карточку Stable Diffusion v1.5 и API Diffusers. Перед запуском установи Python, PyTorch для своей системы и пакет Diffusers с зависимостями из документации проекта. Я не привожу одну команду установки PyTorch для всех компьютеров: сборка зависит от операционной системы и наличия совместимого GPU. После установки создай файл `make_image.py`:
В этом фрагменте `MODEL_ID` указывает, какие веса загружать. При первом запуске они скачиваются; размер зависит от конкретной модели и файлов. `device` выбирает GPU, если PyTorch видит CUDA, иначе CPU. `dtype` уменьшает расход памяти на подходящем GPU, а на CPU оставляет обычную точность. Если ваша машина использует другую платформу ускорения, надо следовать её инструкции в PyTorch и документации модели, а не менять строку наугад.
`num_inference_steps` задаёт число шагов генерации. Больше шагов обычно означает больше вычислений; улучшение картинки не обязано расти бесконечно. `guidance_scale` влияет на то, насколько генерация держится текстового описания. Важна умеренность: чрезмерное усиление может ухудшить вид. Я начинаю с значений примера из документации и меняю один параметр за раз.
Файл появится в текущей рабочей папке процесса. Если не знаешь, где она, сохрани абсолютный путь или выведи `Path.cwd()` в своём скрипте. Сам код выше не запускает LibraChat и не иллюстрирует ответ сервиса; это самостоятельный локальный пример использования открытой модели.
Как менять описание и не терять удачный вариант
Когда первая картинка получена, соблазн велик: сразу переписать весь промпт. Тогда непонятно, что изменило результат. Я попробовал другой порядок. Сначала записал базовую композицию, затем менял только освещение, потом материал объектов. В каждой серии сохранял тот же seed. Если поменять и текст, и seed, сравнение уже менее чистое.
Удобная структура описания для первой серии:
Предмет. Что должно быть в кадре: бумажные лодки, кружка, окно.
Композиция. Где предмет и какая крупность: крупный план, вид сверху, свободное поле справа.
Свет и цвет. Например, боковой дневной свет и два основных цвета.
Ограничения. Текст на картинке, логотипы и лишние объекты лучше назвать явно, если они мешают задаче.
Я проверил на учебной композиции, что «офисная сцена» оставляет слишком много вариантов: модель сама выбирает стол, людей и фон. Фраза «три бумажные лодки на пустом столе, вид сверху» задаёт проверяемые элементы. Получившийся кадр всё равно надо просмотреть: наличие числа «три» в промпте не гарантирует ровно три объекта на изображении.
Для серии я советую вести короткий журнал:
имя файла и seed;
версия модели;
точный промпт;
один изменённый параметр;
что получилось с композицией и деталями.
Это звучит скучнее, чем бесконечно нажимать «создать». Зато через день можно восстановить удачный вариант и понять, почему он получился. Если работа клиентская, журнал помогает ещё и не потерять сведения о модели и её лицензии.
Я попробовал завести четыре строки журнала для одной учебной серии. Первая была контрольной: `seed=7`, исходное описание, файл `paper-boats-seed7.png`. Во второй я изменил только свет, в третьей — ракурс, в четвёртой — цвет. На такую запись ушло меньше 5 минут, зато я видел, какое изменение относится к какой картинке. Точное качество зависит от модели и устройства; этот порядок полезен даже тогда, когда изображения не нравятся. Он превращает неудачу в понятное следующее действие.
Маленькая деталь с файлами тоже экономит нервы. Если каждый раз сохранять `image.png`, новый запуск заменит старую версию. Я сделал имя из предмета, номера варианта и seed. Потом легко вернулся к первому кадру и понял, что новая композиция была хуже. Не нужно строить большую систему каталогов: для начала достаточно папки `outputs` и понятных имён. Проверяй, что она существует до сохранения, иначе скрипт остановится на последнем шаге.
У коммерческой работы добавляется вопрос о правах. Я открыл карточку модели до запуска и прочитал условия использования, вместо того чтобы считать «открыта для скачивания» равным «можно всё». Если в проекте есть реальные люди, логотипы или чужие исходники, отдельно проверь право на их использование. Код не решает эту задачу. Он лишь даёт возможность повторить генерацию.
Ошибки первого запуска
Самая частая техническая проблема — недостаток памяти. Я столкнулся с ней, когда пытался загрузить крупную модель на старой видеокарте. Исправление зависит от устройства: иногда достаточно более экономной модели, иногда нужна выгрузка части вычислений в оперативную память, иногда разумнее использовать сервис с готовым интерфейсом. Не стоит обещать, что любой код запустится на любом ноутбуке.
Вторая проблема — модель не соответствует примеру. У некоторых карточек нужен доступ по условиям лицензии, у других иной класс pipeline. Если загрузка остановилась, прочитай сообщение об ошибке и карточку выбранной модели до поиска случайного «исправленного кода» в комментариях. Там могут быть команды для другой версии библиотеки.
Третья проблема не техническая: картинка визуально приятная, но не решает задачу. В нашем примере бумажные лодки могут оказаться обрезаны или текст всё-таки появится на фоне. Я отмечаю в журнале не общую оценку «красиво», а два конкретных критерия: читаются ли три объекта и остаётся ли свободное место справа. Под следующую правку нужен ответ именно на них.
Ещё один сбой выглядит как успех: файл сохранился, но разрешение или пропорции не подходят макету. Я сначала открываю PNG и смотрю его в размере, в котором он пойдёт в работу. Если иллюстрация должна занять широкий блок, заранее указываю желаемую композицию и проверяю возможности выбранного pipeline по документации. Простое растягивание после генерации может испортить детали. Тут полезнее вернуться к исходной задаче, чем бесконечно увеличивать число шагов.
Если цель не изучить Python, а быстро обсудить визуальную идею, можно описать сцену словами в чате LibraChat: создание картинки вызывается явной просьбой. Возможности и условия своего плана проверь на странице тарифов. Для формулировки визуальной задачи пригодится материал о картинках нейросети для презентаций.
Прямо сейчас попробуй маленькое упражнение: запиши один предмет, одну композицию и одно ограничение, затем реши, нужен тебе код с воспроизводимой серией или один быстрый эскиз в чате. Когда цель ясна, и промпт, и скрипт становятся короче.