Stable Diffusion, часть 1
Автор: Константин БояндинЭто часть рабочих записок, которые становятся справочным материалом - для тех, кого заинтересовал SD в качестве инструмента.
Сюда идёт копия всего того, что я объединяю в справочный документ - прежде всего для себя самого. Учитывая, что в целом и общем познания людей в области нейронных сетей оставляют желать лучшего - возможно, будет польза и ещё для кого-то.
Начну с интересного. Уже есть действующий образец и открытый код для желающих проверить т.н. Riffusion - проект, построенный на SD, невероятно простой идеей: генерировать средствами SD спектрограммы и преобразовывать их в аудиофайл. Простыми словами, порождать музыкальные файлы по словесному описанию.
Чувствуете перспективы?
Но начнём с сухой и скучной теории. Если она вас и в самом деле не интересует, можно пролистать эту секцию.
Теоретическая часть
Математический базис под всем этим хорошо описан в этом документе (на английском языке). Любителям подлинной, сухой и точной математики посвящается.
На Хабре (где есть в принципе неплохая подборка статей об SD) я хотел бы выделить научно-популярную, Шерудим под капотом Stable Diffusion. Написано в сентябре того года, но теоретическая часть от этого не потеряла актуальности.
Ну и, наконец, хотя бы ради ссылок в подвале, имеет смысл ознакомиться и со статьёй в Википедии.
Попробовать SD без установки можно на множестве бесплатных сервисов, например Nightcafe Studio.
Исходный репозиторий SD - это для использования из командной строки. Конкретно я предпочитаю максимум удобств там, где это возможно, а потому использую графическую (браузерную) надстройку над SD, конкретно вот эту: stable-diffusion-webui (AUTOMATIC1111).
Соответственно, в своих дальнейших утверждениях я опираюсь на то, что позволяет сделать упомянутая обёртка.
Что он умеет?
Вкратце, очень вкратце.
SD + stable-diffusion-webui может
- создавать картинку по текстовому описанию (все конкретные параметры и их значения рассмотрим позже), txt2img
- создавать картинку по текстовому описанию и другой исходной картинке (т.е., художественно изменить исходную картинку по описанию), img2img
- дорисовать картинку за её пределами
- изменить указанную часть картинки (скажем, удалить объект или добавить что-то другое)
- масштабировать картинку (так, что картинка не утратит качества)
Весь перечень - в кратком описании - в секции Features на странице stable-diffusion-webui.
Покажите уже картинку!
Примеры ниже - в значениях параметров по умолчанию, для модели по умолчанию (Stable Diffusion v1.5 pruned): CFG 7, самплер Euler a, двадцать итераций, размер 512x512.
Подробнее о параметрах - в следующий раз; они, скажем так, неоптимальные для создания действительно качественной картинки, но надо же с чего-то начать.
Запросим рисунок хвойного леса (т.е., просто "хвойный лес", оставим все подробности на усмотрение двигателя):
fir forest
Добавим "божественное" - объёмное - освещение.
fir forest, volumetric lighting
Дополнительно запросим, чтобы использовался стиль Ивана Шишкина:
fir forest, volumetric lighting, by Ivan Shishkin
Наконец, укажем, что требуется качественный по композиции и исполнению выход, и уточним, что это должна быть картина маслом по холсту.
masterpiece, fir forest, highly detailed oil painting on canvas, volumetric lighting, by Ivan Shishkin
В каждом прогоне использовалась случайная затравка; это даёт нам возможность порождать минимум 2**64 (два в степени шестьдесят четыре) варианта картинки. Всему населению Земли, если каждый человек будет просматривать по варианту в секунду, потребуется 73 года, чтобы просмотреть все возможные вариации такого изображения.
Вопросы и утверждения
Ниже список того, что мне довелось уже услышать или прочитать по поводу SD. Не очень информативно, возможно, но если благодаря этой секции я лишний раз НЕ прочту что-то такое - значит, уже не зря написано.
Слишком сложно! Жизни не хватит понять, что и как настраивать!
SD обычно занимаются именно те, кому интересно "залезть под капот", испачкаться, фигурально выражаясь, машинным маслом и посмотреть на вращение шестерёнок. Да, собрать компьютер, способный считать типовую картинку за доли секунды - это недёшево, а существующие сервисы, помимо ограничений на подбор параметров, ещё и ограничивают по ресурсам - там с экспериментами не особо развернёшься.
Но всегда есть возможность скооперироваться с кем-то. Нужно ещё учесть, что собственная (локальная) установка - это ещё и полная свобода действий в смысле выбора всех интересующих компонент.
Но если вам это всё кисло, а лучше всего было бы поле ввода описания картинки и большая кнопка "Сделай классно", то вам - во что-нибудь вроде Midjourney.
Ваш хвалёный SD никогда не сможет нарисовать картинку вроде такой (пример картинки)
А откуда вы знаете?
Говоря о конфигурации, с которой я работаю, можно сделать очень условную оценку нижней границы количества изображений, которые SD в состоянии выдать для данной конкретной модели (тренировочной базы) и текстового описания. Это величина порядка 2**100 (два в степени сто, число с тридцать одной значащей десятичной цифрой).
Чтобы осознать масштаб: если мы заставим восемь миллиардов человек без устали просматривать этот объём картинок (без сна и отдыха) и дадим ровно одну секунду на просмотр каждой, потребуется несколько триллионов лет, чтобы завершить эту задачу. Это на пару порядков больше оцениваемого срока существования Солнечной системы, как мы её сейчас видим (и Земли в том числе).
SD позволяет использовать не только разные модели (которые есть в изобилии на CivitAI и Huggingface), но и относительно мелкие дополнения (embeddings, hypernetworks, Loras и т.д.) - с их помощью становится возможным адаптировать вывод SD к заданной конечной цели.
Сотни моделей и дополнений, описание практически неограниченной длины - число возможных изображений настолько велико, а временной масштаб для проверки их всех настолько велик, что срок существования наблюдаемой Вселенной может оказаться ничтожно малым по сравнению со временем, которое потребуется для просмотра всего, что может породить SD уже сейчас.
Ну и не забываем о бремени доказательства - если вы заявите, что во всей Вселенной нет и быть не может семигранной гайки, выточенной из алмаза, это не означает, что вашему оппоненту необходимо проверить всю Вселенную, чтобы опровергнуть ваше утверждение. Бремя доказательства всё равно останется на вас. Ну а в сочетании с невообразимым количеством возможных изображений сама идея перебора среди них становится бессмысленной: нет технической возможности ни опровергнуть такое утверждение ни подтвердить его.
SD не умеет рисовать людей с нормальными руками, ногами, ушами и т.д.
Отчасти верно.
Модель по умолчанию тренировалась на картинках, где именно человеческие фигуры представлены в низком разрешении и плохом качестве. Неудивительно, что стандартная модель в большинстве случаев рисует вместо людей жутких страховидлов.
Чтобы исправить ситуацию, энтузиасты создали (натренировали) модели вроде Art&Eros, HassanBlend, URPM (все доступны с Civitai), которые позволяют добиться значительно лучших результатов.
Ситуация далека от идеальной, но работа продолжается и над моделями, и над дополнительными дополнениями (модулями) для коррекции. Наконец, не забываем про негативное определение (иногда позволяет отсеять откровенный брак ещё до попадания его вам на глаза).
Но что-то же SD не умеет?
Многое.
Всё упирается в первую очередь в модель (тренировочную базу). SD не в состоянии сделать то, чего в той базе нет принципиально. Простыми словами, он не в состоянии нарисовать "что-нибудь на свой выбор" - в любом случае используется то, что внесено в модель и хоть как-то обозначено (для каждой картинки, сильно упрощая, при добавлении её в модель, указывается набор меток - тегов - обозначающих, что же именно на этой картинке (хотя часть объектов SD, по мере обучения, способен опознавать своими средствами).
Кроме того, есть надписи. Распознавание текста и средств его передачи не входит в модель. Когда SD создаёт изображения, где могут быть надписи - в лучшем случае ожидайте увидеть там бессмысленный набор букв и прочего; в худшем - невнятный геометрический узор. Это принципиальное ограничение подхода; как только при построении модели начнёт опознаваться и учитываться текст - простыми словами, когда дойдёт дело до гибридного двигателя, что-то вроде SD + ChatGPT - только тогда надписи будут хотя бы иногда осмысленными.
Все эти картинки от SD и прочих нейросетей очень просто отличить от настоящих фото или работ живых художников
Иногда да, иногда нет. Человеческие фигуры - особенно уши, конечности и пальцы - остаются сложным вопросом при использовании SD. В остальном - практика показывает, что при аккуратном подборе работ (чтобы очевидные слабые места SD не проявлялись), отличить работу SD от работы художника из плоти и крови перестаёт быть лёгкой задачей.
Если хотите, можно устраивать конкурсы - там и посмотрим, насколько легко вы сумеете опознать, что породило картинку - алгоритм и "железяка", или же мысль и воображение.