745. Пластмассовый мир победил (третья часть)

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

Это архитектура нейронной сети, которая служит «надстройкой» для диффузионных моделей и позволяет жестко контролировать процесс генерации изображений с помощью дополнительных условий. Если обычная нейросеть создает картинку по текстовому описанию, то ControlNet добавляет в этот процесс «скелет» или «чертёж», которому ИИ обязан следовать.

ControlNet бывают разные. Например, Canny (детализированные контуры) получает границы объектов, чтобы сохранить их точную форму. Преобразовать особым образом фотографию можно получить композиционно такую же сцену на сгенерированном изображении. Scribble (каракули) превратит ваш карандашный набросок в произведение искусства. Depth (карта глубины) фиксирует расстояние до объектов, позволяя правильно разместить объекты в пространстве и создать глубокую сцену. Для работы с персонажами используют OpenPose. Это стандарт, позволяющий задать позу с помощью специального скелета, который можно сделать в специальном редакторе. И это далеко не всё.

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

Первый опыт наброска. Я — Художник =)

К сожалению, когда я делал свой графический интерфейс, я ещё не знал о таких фантастических возможностях и не заложил поддержку ControlNet. Поэтому для теста решил просто запустить генерацию из командной строки. В результате получил не анатомически правильный рисунок, а сообщение об ошибке: «тензоры отсутствуют в файле модели». Над решением я бился две ночи, но так его и не нашёл. Чтобы сэкономить время, нужно было просто прочесть описание sd-cli, который я использую. Он не поддерживает ControlNet для модели SDXL. Просто не поддерживает.

Пришлось писать на питоне специальный скрипт для запуска нейросети с ControlNet. В итоге вместо создания изображений я опять погрузился в тонкости работы нейросетей. Начинать пришлось с самого начала. Сперва попытка запустить просто генератор картинок, потом добавить поддержку LoRA и, наконец, перейти к ControlNet. LoRA в принципе можно было пропустить, но я хотел сделать сразу универсальный инструмент, чтобы потом ничего не доделывать.

Scribble фиксирует позу руки

На разработку всего этого я потратил довольно много времени. Рисовать интерфейс сил уже не было, и я наконец-то перешёл к опытам. У меня было скачано три ControlNet: Canny, Scribble и OpenPose. Больше всего понравился Scribble. Рисуешь картинку линером на бумаге, фотографируешь телефоном, приводишь в графическом редакторе к необходимому формату (белые линии на чёрном фоне) и на выходе получается изображение повторяющее твой рисунок. Если ты умеешь рисовать, то это отличный инструмент.

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

Продолжение может быть последует.