Почему нейросети генерируют корявые руки: разбираем 10 причин

Почему нейросети генерируют корявые руки: разбираем 10 причин

Наверное, каждый из вас задумывался, почему приходится прогонять генерацию десятки раз для получения приемлемых рук. Что они, особенные какие-то?

Оказывается, действительно особенные, и давайте рассмотрим почему:

1. Руки вносят меньший вклад в функцию ошибки

Нейросеть стремится минимизировать ошибку на более крупных и значимых для восприятия объектах, таких как лицо или фон. В результате сеть может «пренебрегать» руками, поскольку ошибки в их генерации имеют меньший вес при обновлении весов сети модели.

Это особенно важно в глубоких нейросетях, где функция потерь (loss function) получает информацию со всего изображения, а влияние мелких объектов может теряться среди более значимых визуальных деталей.

Распределение внимания модели на примере кота
Распределение внимания модели на примере кота

Как вы можете видеть на примере выше, модель фокусирует внимание неравномерно, отчего некоторые части (особенно отдаленные от главного объекта) могут страдать в детализации.

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

2. Сложность анатомической структуры и вариативность поз

Руки имеют очень сложную структуру: много подвижных частей (пальцы, суставы) и огромное количество возможных положений и форм. Пальцы могут изгибаться, перекрывать друг друга, руки могут быть частично скрыты.

Как вот это сгенерировать?
Как вот это сгенерировать?

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

3. Недостаток качественных данных

Во многих обучающих датасетах не уделяется достаточного внимания точной разметке рук. В результате нейросети обучаются на данных, где информация о руках либо отсутствует, либо расписана недостаточно точно.

Пример выборки из датасета
Пример выборки из датасета

К этой проблеме прибавим еще и тот факт, что все изображения в датасете небольшого разрешения! Даже при 1024px по обеим сторонам руки плохо различимы, и я молчу про пальцы.

4. Нечеткость на ранних этапах генерации

Пример генерации изображения
Пример генерации изображения

Нейросеть, как правило, плохо восстанавливает мелкие детали, которые были потеряны на начальных этапах генерации. Это связано с тем, что процесс построения изображения на низком разрешении может упрощать мелкие объекты, такие как пальцы.

Если на этих ранних этапах сеть упустила важные детали руки, они могут так и не появиться на финальном изображении.

5. Нарушение пропорций и симметрии

Руки часто требуют точного соблюдения пропорций и симметрии между пальцами и ладонями, что сложно для нейросети. Даже небольшие отклонения в симметрии или масштабе могут привести к заметным искажениям.

Руки могут иметь разные пропорции, что заметно
Руки могут иметь разные пропорции, что заметно

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

6. Ошибки в механизмах внимания (Attention)

Attention-механизмы, такие как self-attention и cross-attention, могут не выделять руки как важные элементы для генерации. Внимание модели часто концентрируется на более крупных и визуально привлекательных объектах (лицо, центральные части тела). Руки же могут быть не так очевидны, особенно если находятся на периферии изображения или занимают малую его часть.

Рука сгенерировалась с 4 пальцами
Рука сгенерировалась с 4 пальцами

Чем дальше руки от главного объекта, тем сложнее на них сконцентрироваться модели. На примере видно, что левая рука персонажа отведена в сторону, поэтому возникли артефакты в виде 4 пальцев.

7. Проблемы с контекстом

Руки обычно взаимодействуют с другими объектами или частями тела (например, держат предметы или касаются лица). Контекстуальная связь между руками и этими объектами также важна для правильной генерации. Руки должны взаимодействовать с окружением, особенно если такие взаимодействия сложны или необычны — а у модели попросту может не быть знаний именно об этой сложной ситуации.

Генерация рук в сложном контексте от FLUX 1 dev
Генерация рук в сложном контексте от FLUX 1 dev

За это также отвечают механизмы внимания, так важные при концентрации на объектах при генерации.

На примере выше видно, как за сферой пальцы начинают глючить — все это говорит о непонимании контекста.

8. Неполные или неоднозначные текстовые описания

Когда генерация изображения происходит на основе текстового описания, например, с использованием cross-attention (снова механизмы внимания), текстовые инструкции о руках могут быть неясными или неполными.

Пример генерации с подробным описанием руки
Пример генерации с подробным описанием руки

Такие подсказки, как «человек держит что-то в руках», не дают точной информации о том, как именно должны быть сгенерированы руки — какая у них поза, как расположены пальцы. Это приводит к тому, что нейросеть может генерировать руки с ошибками, так как ей не хватает конкретных указаний.

9. Ограничение двумерной природы данных

Нейросети, особенно те, что работают с изображениями, обычно обучаются на 2D-данных (фотографиях или картинках), и не всегда могут корректно интерпретировать трёхмерные взаимоотношения между объектами.

А, как мы уже выяснили, у рук есть свои позы и жесты, а также контекст. Без понимания пространства сложно воспроизвести руки качественно во всем их многообразии.

Датасет, учитывающий 3D-позиционирование рук
Датасет, учитывающий 3D-позиционирование рук

Со временем появляются продвинутые датасеты, где руки размечены в пространстве, вследствие чего модель начинает лучше понимать контекст и положение рук пространстве.

10. Неправильное восприятие перспективы и глубины

Большинство современных архитектур нейросетей работают с локальными паттернами, а не с глобальной сценой. Они не могут «видеть» всё изображение сразу или оценивать, как объекты должны быть расположены относительно друг друга в 3D-пространстве.

Генерация разных кусочков изображения
Генерация разных кусочков изображения

Т.е. нейросеть собирает изображение как бы по кусочкам, а затем пытается эти кусочки состыковать между собой. Этакий фотобашинг на максималках. Но модель при этом не моделирует 3D-сцену, из-за чего вылазят проблемы с неестественными руками.

Как улучшить генерацию рук

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

Способ 1 — Bad hands LyCORIS

Использование моделей LoRA или LyCORIS в негативной подсказке.

Использование LoRA или LyCORIS в negative prompt
Использование LoRA или LyCORIS в negative prompt

Подобные модели натренированы на плохих примерах рук, что позволяет с помощью негативного промпта исключить неправильные и корявые руки из генерации.

Способ 2 — использование ControlNet

Чтобы модель не генерировала руки с нуля, вы можете задать нужную позу в виде наброска / карты глубины или специального скелета, переносящего позу рук на генерацию.

Пример использования мульти-ControlNet
Пример использования мульти-ControlNet

И, что самое интересное: никто не запрещает вам использовать все это вместе!

Способ можете изучить здесь.

Заключение

Современным моделям генерации изображений еще далеко до идеальной архитектуры и понимания реального мира, поэтому приходится идти на ухищрения.

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

Заглядывайте ко мне на канал в телеге, если хотите узнать больше о нейросетях.

Ничего важного не пропустите, обещаю!

55
11
3 комментария

Толково.
А есть средства (если есть, то какие?), восстанавливающие глаза и меняющие/восстанавливающие текстуру кожи вместо "сглаженного силикона'?

1
Ответить

Глаза восстанавливает расширение ADetailer, а вот для кожи нужно либо LoRA использовать, либо экспериментировать с токенами на реализм

1
Ответить

Спасибо за статью

1
Ответить