
Летнее утро на даче… Как такое не запечатлеть с помощью нейросетей! Цветущий сад, собака под ногами и тихо урчащая кофемашина, наливающая чашку крепкого ароматного напитка. Одну чашку.
Казалось бы, ничего сложного. Садимся и набираем простой линейный промпт «что вижу, то пою», а модель сама всё нарисует. Не тут-то было.
Зачастую простейшая казалось бы задача упирается в серьезную проблему в результате скрытых настроек и правил инструмента. Например, мы просим нарисовать одну чашку, а на картинке их постоянно две или больше.
Исправить это можно либо с помощью множества итераций с применением средств отладки и перебором промптов. Но также интересно решить задачу через понимание и использование принципов работы нейросетей. Тут я покажу второй путь.
Меня зовут Андрей Сенченко, я бизнес-архитектор решений розницы и логистики в MWS. На работе я занимаюсь автоматизацией сети магазинов “МТС”, а в свободное время увлекаюсь нейросетями.
Дисклеймер: автор — не дипломированный нейрохудожник, и вообще не художник. Этот материал — лабораторный журнал IT-аналитика, увлеченного разбором поведения нейросетей. Я ищу в txt2img (и не только там) в первую очередь методы стабильной генерации ожидаемого результата.
Во многих сервисах для широкой аудитории нет привычных разработчикам и контекстным инженерам модификаторов и дополнительных инструментов: весов, cfg, ControlNet. Зато есть мобильные версии, и их можно использовать, сидя на качелях на даче. Речь пойдет о поиске решения проблемы исключительно текстовым промптом на примере двух разных моделей. Я не называю их специально, ведь такое поведение будет наблюдаться почти у любых сервисов.
Первая попытка
Промпт:
digital art слева: кофемашина (черный, хром) стоит на столике (темное дерево) в дачной беседке; из кофемашины в чашку (белый фарфор) льётся ароматный кофе с густой пенкой; за кофемашиной стоит небольшая ваза с пёстрыми лилиями; на полу — собака (зенненхунд); фон: перила беседки, сад, газон, плиточная дорожка, кусты гортензий, большое грушевое дерево; за кустами — небольшой деревянный дом с террасой.


С породой собаки всё понятно. Зенненхундов так-то четыре вида, и они у модели или есть, или нет. Но вот вторая чашка на столе явно лишняя. Мне нужна именно ОДНА чашка в кофемашине.
Пробуем поставить ОДНУ чашку в кофемашину
Задачу будем решать комплексно:
Перенесем «чашку» в начало промпта и строго пропишем, что она ОДНА.
Явно укажем место — на подставке кофемашины.
Направим струю напитка в центр чашки.
Сделаем ее отражение в аппарате, чтобы физически сблизить объекты.
Добавим NOT на вторую чашку (наверняка, как обычно, не сработает, но надо).
И посмотрим, что получится.
Промпт:
digital art слева: ОДНА чашка (белый фарфор) стоит на подставке кофемашины (черный, хром) на столике (темное дерево) в дачной беседке; из кофемашины в центр чашки льётся ароматный кофе с густой пенкой; на столе за кофемашиной стоит небольшая ваза с пёстрыми лилиями; NOT чашки на столе; на полу беседки у стола сидит собака (зенненхунд); фон: перила беседки, сад, газон, плиточная дорожка, кусты гортензий, большое грушевое дерево; за кустами — небольшой деревянный дом с террасой.


Визуально мало что изменилось. Вот только кофе почти перестал литься мимо чашки из пустоты и из ручки (покрутите промпт, кому интересно).
В запросе явно есть то, что заставляет модель добавлять ещё одну чашку на арт. Ну ладно. Будем искать.
Разбираем промпт
Текст:
digital art слева: ОДНА чашка (белый фарфор) стоит на подставке кофемашины (черный, хром) на столике (темное дерево) в дачной беседке; из кофемашины в центр чашки льется ароматный кофе с густой пенкой; на столе за кофемашиной стоит небольшая ваза с пёстрыми лилиями; NOT чашки на столе; на полу беседки у стола сидит собака (зенненхунд); фон: перила беседки, сад, газон, плиточная дорожка, кусты гортензий, большое грушевое дерево; за кустами — небольшой деревянный дом с террасой.
Что мы имеем (жирным выделил нужные токены, включая NOT — неоднократно встречал совершенно противоположную его работу):
Стол упомянут 4,5 раза — 4 прямых токена + почти гарантированно в метаданных «стола» есть значение «подставка».
Кофемашина указана 3 раза.
Чашка — 3 раза.
Предположение. Такой запрос буквально загоняет модель в кластеры, где по связке «стол + кофемашина + чашка» хранятся картинки с полноценной сервировкой.
Если это так, то как раз чашка на столе — основная, а та, которую я заказал в кофемашине, — дополнительная.
Проверяем догадку
Давайте уберём из запроса чашку. Совсем. И посмотрим, что выдаст модель на запрос пустого стола.
Промпт:
digital art слева: кофемашина (никель, хром) на столике (темное дерево) в дачной беседке; на столе за кофемашиной стоит небольшая ваза с пёстрыми лилиями; на полу беседки у стола сидит собака (зенненхунд); фон: перила беседки, сад, газон, плиточная дорожка, кусты гортензий, большое грушевое дерево; за кустами — небольшой деревянный дом с террасой.


Все верно. Первый сервис почаще (~30%), а второй пореже (~10%) дорисовывают посуду.
Это не хорошо и не плохо, это понятное поведение «гражданской» модели, которая дорабатывает за пользователя сюжет. И надеяться обойти такое простыми методами вида «NOT-ключей» и последовательности записи — всё равно что ковырять стену зубочисткой. Однако осознание причины рождает и решение: нужно применить чужую силу себе на пользу.
Тотальная дорисовка
А давайте сделаем наоборот: уберем из запроса стол, чтобы он перестал таскать за собой лишнюю посуду. Дополнительно заменим “подставку” в кофемашине на “решетку”. Это должно уменьшить вероятную связь со “столами” в метаданных.
Пусть модель сама решит, куда ей приткнуть технику. Есть риск, что она поставит её просто на пол, но такого брака должно быть не много. Ведь мы уже убедились в наличии стабильной статистической связи «стол + кофемашина».
Промпт:
digital art слева: кофемашина (черный, хром); строго на решетке стоит ОДНА чашка (белый, фарфор; отражение на корпусе); из рожка В ЦЕНТР чашки льётся густой ароматный кофе с пенкой, ЗА кофемашиной стоит небольшая ваза с пёстрыми лилиями; на полу сидит собака (зенненхунд); фон: деревянные перила и стена беседки, сад, газон, плиточная дорожка, кусты гортензий, большое грушевое дерево; за кустами — небольшой деревянный дом с террасой. АТМОСФЕРА: теплый утренний свет сбоку.



Опасения относительно размещения техники на полу оправдались. У первого сервиса всё в порядке: стол с кофемашиной и одной чашкой есть почти в 100% случаев. Вторая модель больше чем в половине артов не дорисовывает стол и оставляет аппарат на земле. И здесь как раз поможет привычный перебор вариантов.
Но самое главное, лишней посуды нигде нет. Строго одна чашка строго в кофемашине. Чего и добивались.
В чем же секрет успеха?
Даже на не очень сильных в плане расширенных настроек моделях вполне реально вытянуть требуемые детали сюжета, если начать мыслить немного векторно. Нужно понять, что и почему делает модель, и сыграть по ее правилам:
Проанализировать результат и понять каком кластере мы оказались в результате нашего запроса. В нашем случае - запрос привёл в область, где хранятся изображения полностью сервированных столов.
Понять что именно в нашем запросе привело в этот кластер. Для этого конечно нужно понимать что такое метаданные и их веса, то есть “физику” вектора в многомерном пространстве. В нашем случае была явная сильная статистическая связь “стол + кофемашина + набор посуды”
Изменить запрос так, чтобы модель попала в нужный нам или соседний кластер, и была вынуждена сама дорисовать за нас то, что мы от нее хотим.
Данный сюжет - лишь пример. В целом, эта схема отлично показывает себя на любых сценах, в которых нужно обойти те или иные ограничения модели.
Если у вас есть комментарии и советы по улучшению моих работ, пишите — приму их с огромной благодарностью. Спасибо за уделенное время. До новых встреч!
pol_pot
Точно есть?
Первый промпт - по чеклисту есть вопросики к вазе, она какая то крупноватая получилась.