SD Studio: свой Midjourney на своей видеокарте с LLM-помощником. Go.. Go. golang.. Go. golang. llm.. Go. golang. llm. ollama.. Go. golang. llm. ollama. Open source.. Go. golang. llm. ollama. Open source. stable diffusion.. Go. golang. llm. ollama. Open source. stable diffusion. wails.. Go. golang. llm. ollama. Open source. stable diffusion. wails. генерация изображений.. Go. golang. llm. ollama. Open source. stable diffusion. wails. генерация изображений. десктопное приложение.. Go. golang. llm. ollama. Open source. stable diffusion. wails. генерация изображений. десктопное приложение. искусственный интеллект.

Сперва — откуда взялась идея?

Мы с женой делаем текстовую игру по её фэнтези-вселенной. Что-то вроде совместного хобби: ей интересно писать, мне нравится программировать. Но суть не в этом. Рисовать никто из нас не умеет, а картинки в тексте нужны.

Сейчас это не проблема — нейросетей куча, особенно для генерации изображений. Но есть минусы: на платных сервисах можно хорошо так разориться, особенно для пет-проекта. Есть решение — Stable Diffusion, генерировать на своей видеокарте.

Первые шаги с Stable Diffusion

Для работы с локальным SD есть несколько инструментов. Взял первый и, наверное, самый популярный — Automatic1111. Сгенерировал — получил полную фигню. Начал читать, что пишут. Оказывается, уже создано огромное количество предобученных моделей и LoRA для добавления тех функций, что модель не умеет. Результат стал сильно лучше.

Дальше — промпты, то есть текстовое описание того, что мы должны получить на итоговом изображении. Там тоже есть свои рекомендации. Модель не читает мысли пользователя, ей нужно более точно и в понятном ей виде предоставить описание. Дополнительно разбираемся с настройками генерации — samplers, steps и т.д. Всё осуществимо, но получаем другую проблему: для генерации одной картинки мы очень долго подбираем все эти значения и тексты.

Первая автоматизация

Чтобы упростить процесс, я сделал следующее. Для наполнения контента в игре есть админка — обычный CRUD на Symfony. Дополнительно в отдельной папке лежат файлы со всем лором книги/игры.

В итоге я создал два провайдера. Первый — для общения с локальной LLM, которая по нужному запросу берёт необходимый контент из папки с лором и составляет корректный промпт для SD. Второй — для SD, где заданы предварительные настройки: используемая модель, LoRA и вместе с промптом всё это отправляется в SD, и мы получаем итоговую картинку. Несколько попыток, потому что с первого раза вряд ли получим нужное. Получаем более-менее адекватный результат и идём в Photoshop — убрать лишнее, сжать и т.п.

Уже лучше, но не идеально.

В определённый момент я захотел подобное, но для другого контекста, с другой моделью и прочим. Можно переписать под нужды. А если опять захочу что-то другое? Снова переписывать?

Тут я, как довольно ленивый человек, написал свою проблему ИИ. И в ходе брейншторма мы решили: вынести уже готовый код, чтобы переиспользовать, и написать новый инструмент, решающий эту задачу раз и навсегда.

Почему десктоп и почему Go

Что мне было важно: работаю я на Linux, жена на Windows, на диване я лежу с макбуком. LLM и SD запущены на игровом ПК с Windows.

Можно было сделать проект на Symfony, но мне захотелось десктоп-приложение. В C или Rust я не то чтобы силён, поэтому вариант по сути один — Go для бэкенда и Vue для фронтенда. Обернуть это всё ИИ предложил с помощью Wails.

Кстати, Wails мне очень понравился. До того работал в Electron и думал, что это будет чем-то подобным, но нет. Исполняемый файл получается довольно компактным, работает везде и быстро.

В итоге получилась SD Studio.

Как это выглядит и работает

Генерация по тексту

На странице Generate выбрали пресет (ниже напишу подробнее), пишем текст, жмём Generate, ждём и получаем результат.

Наш кот

Наш кот

Что такое пресеты? По сути, это сгруппированные настройки с предустановками: какие модели, LoRA-файлы и параметры использовать для генерации картинки. Плюс там есть свой промпт, на основе которого LLM дорабатывает ваше текстовое описание, чтобы получить итоговое изображение в стиле пресета — аниме, кино, реалистичное и прочее.

Если не знаете, какой пресет выбрать — на вкладке Generate есть кнопка для рекомендации. LLM знает все ваши пресеты и советует лучший.

И ещё: на странице с пресетами отдельной вкладкой можно объединять несколько пресетов для генерации итогового изображения — Pipeline. Проще говоря, формируем картинку первым пресетом и дорабатываем другим.

Какой в этом смысл? Модели обучены по-разному, и фантазия у них сильно отличается. Очень много моделей, которые обучались на корейских девушках — умеют идеально рисовать кожу, людей, объекты, но с фантазией у них беда. А есть более простые в плане картинки, но с богатой фантазией. Pony, к примеру, очень хорошо придумывает, но результат сильно анимешный. Поэтому такую модель можно объединить в пайплайн и получить богатую на детали и красивую по реализации картинку.

Интеграция с локальной LLM

Есть провайдеры для работы с:

  • LM Studio — я начинал работу именно с этим инструментом

  • Ollama — сейчас использую, так как работает демоном, меняет модели по запросу и имеет удобный CLI

  • llama.cpp — самый шустрый инструмент, но с критичным для меня минусом: не меняет модели запросом через API

Зачем менять модели? В настройках SD Studio надо указать две: для генерации промптов из описания и для анализа изображений.

Generate From Image

Получили картинку, всё хорошо, но хочу другого кота. Открываем From Image.

Наши коты

Наши коты

Главные возможности:

  • Перерисовать картинку нужным пресетом

  • Inpaint — изменить часть изображения

  • Smart Remove — по сути тот же inpaint, но отправляет выделенную часть в LLM. LLM пытается понять, что там и какой фон вокруг, составляет промпт для inpaint и отправляет его в SD. В целом работает, но иногда лучше сделать inpaint руками.

Сессии

В процессе использования натолкнулся на проблему: добавил фото, изменил определённые части, нажал Export для сохранения. А там последняя генерация с кривой картинкой. И никакой отмены, нет возможности откатить последнее действие.

Поэтому добавил сессии. Можно создавать сколько угодно сессий и называть их, чтобы было понятно, что там делаем. В сессии хранятся все шаги обработки изображения. То есть можно вернуться к любому шагу и продолжить работу с ним. Ненужные — удаляем.

Multi-Scene

Проблема возникла из-за того же пет-проекта. Требовалось создать изображение, на котором были, к примеру, три персонажа: девушка-маг, воин и медведь. SD создавала что угодно, кроме нужного: женщина-медведь, три медведя, один воин, медведь с топором и т.д. Проблема в том, что SD пытается уместить всё описанное в одной сцене.

Я перебирал различные варианты из интернета для составления правильных промптов. Но реально работающим вариантом оказалось создание сцен генерацией нескольких элементов. Пишем текстовое описание сцены, LLM находит описание фона и всех персонажей и на форме предлагает разместить найденных персонажей — дополнительно можно поправить промпты для каждого.

Мульти-сцена

Мульти-сцена

Потом генерируется несколько изображений: для фона, для каждого персонажа отдельно в заданном пресете. Дальше появляется ещё один инструмент — Rembg (если мультисцены не нужны, можно его не использовать). Rembg аккуратно вырезает персонажа и вставляет на фон. И ещё один шаг — обрабатываем итоговое изображение нужным пресетом ещё раз, иначе видно, что персонажи «вклеены» в картинку.

Остальные инструменты

Batch — генерация картинок кучей. Иначе приходится долго тыкать Regenerate, пока не получим нужное. А так будет 10 картинок, из которых выбираем лучшую. И главное: работа с локальным GPU — это не очень быстро. Можно настроить Batch и пойти заниматься своими делами.

Compare — генерация промпта выбранными моделями, пресетами или пайплайнами. Видим превьюшки и можем подобрать нужный стиль.

Стильные коты

Стильные коты

File Browser — чаще всего требуется работать с одной папкой, например, в пет-проекте, где мы храним изображения. Из File Browser можно сразу загрузить картинку, к примеру, в Generate From Image.

SD Studio — open-source проект под лицензией AGPL v3. Все данные остаются на вашей машине, облако не используется.

Для чего еще использую SD Studio?

К примеру, жена занимается хенд-мейдом, делает косметику и гидролаты. Пофоткал баночки на столе, обработали в программе:

Гидролаты

Гидролаты

Проект доступен на github:

GitHub: https://github.com/Zazza/sd-ai

Стоит добавить, у меня локально 16GB Vram, на меньшем объеме не тестировал.

Автор: Zazza

Источник