Прежде чем приступать к более детальному, чем это было в прошлый раз, знакомству с ControlNet, нелишним будет напомнить о содержании предыдущих статей цикла «Практикум по ИИ-рисованию»:
Однако последний представляет собой существенно более многофункциональное средство — по сути, набор дополнительных нейросетей, способных значительно обогатить арсенал ИИ-художника. О том, что это за нейросети и как именно они могут пригодиться, и начнём говорить в настоящей статье, — пожалуй, только начнём, потому что полное описание возможностей ControlNet поневоле выйдет достаточно пространным.
Любое активно развивающееся ПО непрестанно получает обновления, и рабочая среда AUTOMATIC1111 исключением не является. В пятой серии «Практикума по ИИ-рисованию» мы уже показывали, как проверять наличие новых версий, — достаточно в окне Git Bash, открытом в установочном каталоге этой среды, исполнить команду git pull.
После того как исполнение этой команды завершится, AUTOMATIC1111 окажется обновлена — и её нужно будет запустить привычным уже образом, дважды щёлкнув мышкой по файлу webui-user.bat в «Проводнике». На момент написания настоящей статьи актуальная версия рабочей среды — 1.8.0, и как раз этот номер отобразился в верхней части открывшегося окна сервера AUTOMATIC1111.
Рабочая среда при первом после обновления запуске сама обнаружит недостающие пакеты (а именно свежие версии torch и xformers), если таковые имеются, и предложит проинсталлировать их. Можно этого и не делать, но, как правило, новые варианты этих пакетов обеспечивают ускоренную генерацию изображений и более корректную обработку подсказок, — так что пренебрегать ими не стоит.
Собственно, установка torch версии 2.1.2 и xformers версии 0.0.23.post1 будет производиться в полуавтоматическом режиме, не требуя от оператора рабочей среды каких бы то ни было познаний в программировании на Python или в тонкостях системы апдейтов Git. Достаточно лишь добавить в стартовый файл, webui-user.bat, пару соответствующих аргументов — так, чтобы строка передачи системе параметров вызова выглядела следующим образом:
set COMMANDLINE_ARGS=--reinstall-torch --reinstall-xformers --xformers --medvram --no-half-vae --no-half
а не как прежде:
set COMMANDLINE_ARGS=--xformers --medvram --no-half-vae --no-half
Разумеется, чтобы корректно всё проделать, необходимо остановить сервер AUTOMATIC1111 (лучше не просто закрыв его окошко по «Alt» + «F4», а сначала исполнив команду прерывания, «Ctrl» + «C», и введя в ответ на появившуюся подсказку «y»), после чего открыть webui-user.bat в простейшем текстовом редакторе вроде Notepad и внести соответствующие исправления, после чего вновь запустить систему.
Можно, по идее, оставить команды на переустановку torch и xformers в стартовом файле навсегда, — в этом случае они будут обновляться при каждом запуске рабочей среды, как только соответствующие апдейты появятся в онлайновом репозитории. Однако из соображений устойчивости системы разумнее всё же внимательно следить за сообщениями сервера AUTOMATIC1111 при старте — и обновлять соответствующее ПО лишь после того, как рабочая среда сама это предложит. Поэтому, дождавшись завершения загрузки и установки свежих пакетов, имеет смысл вновь закрыть сервер, вернуть файл webui-user.bat в прежнее состояние (без --reinstall-torch —reinstall-xformers), и опять запустить систему — уже полностью готовую к эксплуатации.
Напомним, что, если в процессе установки система укажет на появление новой версии пакета pip, который используется для управления обновлениями в Git, проапдейтить его проще всего прямиком из командной строки в «Панели управления» Windows. Нужно только указать корректный путь к той версии Python, которую использует AUTOMATIC1111, и верные аргументы запуска.
И то и другое будет явно указано при запуске рабочей среды: достаточно скопировать команду, которая приводится после слов «to update, run:» — в случае нашей тестовой системы это «C:\Fun-n-Games\Git\stable-diffusion-webui\venv\Scripts\python.exe -m pip install --upgrade pip», — а затем вставить её в поле ввода в левой части панели и нажать на «Enter».
Обновив саму рабочую среду, поинтересуемся, не появилось ли свежих версий установленных в ней ранее (на протяжении предшествующих шести серий «Практикума по ИИ-рисованию») расширений. Для этого следует, как и прежде, перейти на вкладку «Extensions» веб-интерфейса и нажать на большую серую кнопку «Check for updates». Если обновления имеются — об этом свидетельствует пометка «new commits» в графе «Updates», — надо будет нажать на «Apply and restart UI», после чего для верности, на всякий случай, ещё и полностью перезапустить сервер AUTOMATIC1111 (снова с «Ctrl» + «C» и очередным исполнением webui-user.bat).
В основе нейросетевой архитектуры, известной ИИ-энтузиастам как ControlNet, лежит научная статья 2023 г. о добавлении дополнительного контролирующего инструмента в диффузионные модели конвертации текстовых подсказок в статические изображения.
Суть предложенного исследователями метода проста: вместо того, чтобы всякий раз перетренировывать оригинальную модель, добавляя в неё какие-то дополнительные связи, нужно тренировать её копию. В результате модифицированная копия приобретает возможность делать то, на что оригинал исходно тоже был способен, но с гораздо меньшей эффективностью: например, обнаруживать и корректно распознавать на картинках позы человеческих фигур, края объектов, «глубину кадра» (какие предметы располагаются на переднем плане, какие дальше по линии зрения) и проч.
Да, натренированная на один какой-то трюк копия теряет широту возможностей оригинала, — но ведь сама исходная модель никуда при этом не девается; зато размер (выраженный в количестве используемых моделью ненулевых весов или же напрямую в информационных единицах, мега- и гигабайтах) этой копии становится значительно меньше. Комбинировать же оригинальную и дополнительно натренированную — контролирующую — модель в рамках единой рабочей циклограммы позволяет нейронная архитектура с «нулевыми свёртками» (zero convolutions; слоями свёртки с нулевой инициализацией), которые оберегают веса исходной модели от паразитного шумового влияния сливаемой с ней контролирующей. Подробнее об этом можно почитать, к примеру, на официальной странице проекта ControlNet на Git Hub.
Говоря короче и предметнее, ControlNet позволяет генерировать фигуры в заданных оператором позах, воспроизводить композицию оригинального изображения (в самом широком смысле, от взаимного расположения объектов в кадре до их расцветки), создавать картинку, очень похожую на исходную, но всё же безусловно отличную от неё, превращать грубый скетч в полноценный рисунок или даже фотореалистичное изображение — и ещё много чего иного. По сути, ControlNet — нейросеть для управления нейросетью, а именно генеративной моделью Stable Diffusion, посредством добавления к привычному набору параметров (текстовые подсказки, число шагов, CFG, чекпойнт и т. д.) ещё одного — чаще всего заданного изображением. Собственно, о том, как работают наиболее часто используемые управляющие режимы (modes) ControlNet — Canny, Depth и OpenPose, — мы начали говорить ещё в прошлом выпуске «Практикума по ИИ-рисованию».
Там же указывалось, каким образом установить расширение ControlNet для рабочей среды AUTOMATIC1111. Для ComfyUI и SDXL 1.0 этот инструмент тоже разработан (по крайней мере, отдельные управляющие режимы, включая Canny, Depth и OpenPose), но для ПК менее чем с 8 Гбайт видеоОЗУ именно первая рабочая среда в сочетании с SD 1.5 по-прежнему продолжает оставаться оптимальной по совокупности таких параметров, как потребные для её работы аппаратные ресурсы, время генерации условной одиночной картинки и широта возможностей тонкой настройки/экспериментирования с доступными для изменения параметрами.
На всякий случай напомним, что официальный репозиторий моделей ControlNet версии 1.1 (точнее, v1.1.441 — именно такая отображается в веб-интерфейсе после апдейта AUTOMATIC1111 до 1.8.0) располагается на сайте Hugging Face и что на данный момент там готовы для скачивания 14 пар файлов *.pth (собственно веса для нейросети) и *.yaml (конфигурационные файлы): IP2P, Shuffle, Tile, Depth, Canny, Inpaint, Lineart, MLSD, Normal BAE, OpenPose, Scribble, SEG, Soft Edge, Lineart Anime. Есть и другие небезынтересные управляющие режимы ControlNet, такие как QR Code Monster, что позволяет генерировать картинку по текстовой подсказке с довольно жёсткой, хотя на первый взгляд и не бросающейся в глаза опорой на композицию референсного изображения, — но о них разговор будет позже. И так уже 14 перечисленных моделей, помещённые локально в предназначенный для них каталог stable-diffusion-webui\extensions\sd-webui-controlnet\models, занимают почти 20 Гбайт места на накопителе. Так что подлинным энтузиастам ИИ-рисования имеет смысл задуматься о размещении соответствующего ПО на отдельном от системного SSD, и желательно со скоростным интерфейсом M.2.
Доступное после установки ControlNet выпадающее меню для работы с этой нейросетью располагается в веб-интерфейсе AUTOMATIC1111 на вкладке «txt2img», сразу под «Tiled VAE». Опций там очень много, но пугаться их разнообразия не стоит: практически всё на первых порах отменно работает в позициях по умолчанию. Разные управляющие режимы хороши для разных случаев: так, MLSD специализирован для поиска и выделения в изображении прямых линий (и потому отлично подходит для работы с архитектурными образами), а Scribble/Sketch — для обработки набросков и скетчей. Собственно, в роли скетча может выступать не только действительно грубый, примитивный рисунок, но и почти любое изображение с хорошо выделенными контурами. Например, взяв за основу такое фото спортивного молодого человека в характерной стойке, можно с подсказкой
ferocious orc sorcerer casting a fireball inside dark sinister dungeon, Hasselblad award winning photo
превратить его в изображение вполне брутального орка-кастера в характерном фэнтезийном антураже.
Здесь задействованы препроцессор scribble_pidinet, модель control_v11p_sd15_scribble, а также опция «ControlNet is more important». Выбор именно Scribble/Sketch обусловлен в данном случае тем, что модели OpenPose, как ни странно, с большим трудом удаётся воспроизводить пальцы на получающейся картинке — хотя препроцессор их вполне адекватно детектирует. Возможно, дело в том, что схема цветовой кодировки фрагментов тела для OpenPose несовершенна — в частности, не содержит внятно различаемых оттенков для разных пальцев.
Главное преимущество ControlNet для энтузиаста ИИ-рисования, в особенности не располагающего ПК с мощной современной видеокартой, — значительная экономия времени. Теоретически, если хорошо и внятно описать желаемую сцену/позу в текстовой подсказке, рано или поздно — с одной из возможных затравок — она воспроизведётся в итоговом изображении. Но если предложен и уже опробован способ задать композицию (или иные важные особенности) кадра явно, система куда скорее выудит из латентного пространства приемлемый для оператора результат. И этим грех не воспользоваться.
Один из наиболее привлекательных для множества энтузиастов управляющих режимов ControlNet — это всё-таки OpenPose, нейросеть, распознающая позу человеческой фигуры на изображении и кодирующая её особым образом, пригодным для дальнейшей обработки. При всех недостатках этот режим контроля Stable Diffusion открывает весьма широкий простор для творчества, поскольку извлекаемая из исходной (референсной) картинки поза максимально лаконична. Это попросту «проволочная» фигурка с разноцветными отрезками, что соответствуют отдельным фрагментам тела, на сплошном чёрном фоне. Соответственно, никаких иных следов от исходной структуры кадра после применения препроцессора («извлекателя» специфической для данного режима информации; той самой натренированной на единственную задачу дополнительной нейросети) в режиме OpenPose не остаётся — тогда как и Depth, и Canny, и Scribble передают системе для обработки контуры не только человеческих фигур, но и других имевшихся на исходной картинке объектов.
Отметим в скобках, что есть даже препроцессор OpenPose, специально натренированный распознавать позы животных. Но для примера всё-таки возьмём из репозитория свободно распространяемых фото PX Here (CC0 public domain, free for personal and commercial use, no attribution required) изображение бегущего человека — и сгенерируем на его основе совершенно другую картинку, но с той же самой позой. Позитивную подсказку зададим как
Nigerian woman jogging though desert
негативную —
nsfw, naked, nude, BadDream, (UnrealisticDream:1.2)
Выберем чекпойнт, исходно натренированный на создание максимально реалистичных изображений, походящих на фотоснимки: AbsoluteReality в версии 1.8.1. Его автор рекомендует использовать параметры «CFG Scale» в диапазоне от 4,5 до 10, «Steps» — от 25 до 30, сэмплер — DPM++ SDE Karras. Мы ради определённости остановимся на CFG = 7, Steps = 28, а в качестве сэмплера возьмём быстрый и весьма качественный, как уже отмечалось в прошлом выпуске «Практикума по ИИ-рисованию», DPM++ 3M SDE Karras. В описании чекпойнта на сайте Civitai автор особо подчёркивает, что переусложнять подсказки не стоит — ни негативную (кстати, текстовые инверсии BadDream и UnrealisticDream — также его прямая рекомендация), ни позитивную. Тяжеловесные текстовые описания только сбивают с толку декодер CLIP, на который полагается SD 1.5 для токенизации запроса оператора, — лучше стараться умещать позитивную подсказку в 75 слов и активнее использовать дополнительные инструменты, такие как LoRA или вот ControlNet.
Зададим в выпадающем меню VAE стандартную модель vae-ft-mse-840000-ema-pruned.safetensors, поставим ползунок «Clip skip» в позицию «2». Если с прошлого раза на верхней части панели управления сохранился параметр «Extra noise multiplier for img2img and hires fix», имеет смысл установить его в среднее разумное значение 0,05, — это пригодится при масштабировании картинки с улучшением качества.
Теперь активируем в выпадающем меню ControlNet режим управления OpenPose соответствующей радиокнопкой. По умолчанию в выпадающих меню второго уровня чуть ниже подгрузятся препроцессор openpose_full и модель control_v11p_sd15_openpose. Можно заменить стандартный препроцессор более актуальным, dw_openpose_full, — для такого изображения (хорошо артикулированная поза с явно разнесёнными конечностями, почти сливающимися пальцами на руках и малодетализированным лицом) большой разницы между ними не будет. Больше ничего трогать не надо — нажимаем на кнопку «Generate» и вот что получаем с затравкой 2882263131 (слева — референсное фото, в центре — результат работы препроцессора, справа — итоговое изображение):
Вместо нигерийской девушки тут может быть какой угодно антропоморфный персонаж — тёмный эльф, викторианский автоматон, Хищник, — поза останется прежней. Среди доступных для выбора препроцессоров сегодня имеет смысл выбирать именно dw_openpose_full как более позднее воплощение этого управляющего режима ControlNet. Ранее для генераций на основе портретов, где в деталях показаны лицо и кисти рук, часто применяли препроцессор openpose_face — вот, например, как он преобразует этот исходник (также находящееся в открытом доступе фото) в соответствии с позитивной подсказкой Medieval witch looking up in awe и с прежней негативной:
Чуть более специализированный вариант препроцессора, openpose_faceonly, концентрируется именно на лице:
А вот так с этой картинкой обращается dw_openpose_full:
Как видно, последний вариант, в основу которого положена работа Effective Whole-body Pose Estimation with Two-stages Distillation, действительно показывает наиболее выдающиеся результаты. И поскольку режим OpenPose опирается только на ключевые точки лица и тела с исходной картинки, из той с использованием Stable Diffusion можно сделать практически всё что угодно. Ну, скажем, вот такая позитивная подсказка — smart but nefarious goblin looking up in fear — со всеми прочими параметрами в прежнем виде даёт следующий результат:
Здесь явно можно заметить влияние исходной выборки: очевидно, фотоснимков условных хорошеньких ведьмочек (косплей, кадры из фильмов и проч.) в базе данных, на которой тренировали действующий в данном случае чекпойнт, было изрядно, тогда как гоблины оказались представлены в основном рисунками — что и сказалось на результатах обработки такой довольно простой подсказки. По этой причине стоит подкорректировать позитивную подсказку, добавив туда явное указание на тип изображения: фото, да желательно не абы какое, а увенчанное лаврами победителя известного фотоконкурса:
smart but nefarious goblin looking up in fear, Hasselblad award winning photo
И вот что выходит:
Обратим внимание на то, как проявляют себя естественные ограничения управляющих режимов ControlNet. Препроцессоры OpenPose кодируют расположение глаз, но не указывают направление взгляда, и потому получить картинку со смотрящим именно вверх персонажем не так-то просто — в основном зрачки и радужки будут выходить центрированными. Для сравнения обработаем ту же картинку с абсолютно совпадающими параметрами генерации в управляющем режиме Canny:
И теперь уже явно оценим его собственные ограничения — они ведь есть не только у OpenPose. Выявление контуров объектов на исходной картинке помогает детальнейшим образом воспроизвести даже такие мелкие детали, как направление взгляда. Но оно же жёстко ограничивает свободу модели, которой предложено изобразить нечто слишком уж отличающееся от исходника. Здесь видно, как система постаралась добавить лицу девушки гоблинских черт, даже что-то вроде густой шкиперской бороды с застрявшими в ней пожухлыми листьями изобразила, — но общее ощущение от результата, мягко говоря, неуютное. Зато глаза действительно смотрят вверх — препроцессор Canny на крупном плане лица эту деталь взял отлично.
Что же делать, если непременно нужен взгляд вверх? Править картинку в Gimp/Photoshop либо перебрасывать на вкладку «img2img» и приниматься за перерисовывание (inpaint) — вполне допустимые варианты. Но сперва имеет смысл просто поперебирать затравки — запустить режим «Generate forever» со случайным параметром «Seed». Ради ускорения процесса — поскольку «проволочная фигурка» нужной конфигурации у нас уже есть — стóит поместить в поле референсного изображения ControlNet результат работы препроцессора, т. е. того самого человечка из разноцветных палочек на чёрном фоне. После чего оставить OpenPose как управляющий режим, в выпадающем меню препроцессоров выбрать позицию «none», а модель оставить прежней — control_v11p_sd15_openpose. И подождать, пока не появится глядящий именно вверх гоблин. Поможет, кстати, и усиление желаемой части подсказки:
smart but nefarious goblin (looking up in fear:1.3), Hasselblad award winning photo
Вполне достойно! Заметен, конечно, неизгладимый отпечаток гоблинских лиц (и особенно ушей) из киноэпопеи о Гарри Поттере, но для объектов со сравнительно невысокой представленностью в исходной тренировочной выборке такие перекосы неизбежны. Если подобрать чекпойнт, натренированный на фэнтезйиных иллюстрациях с аккуратным аннотированием, или же отыскать LoRA, специально ориентированную на изображение гоблинов, можно получить и более своеобразный типаж.
Подобную гибкость OpenPose ИИ-энтузиасты оценили по достоинству — недаром на уже упомянутом сайте Civitai имеется множество коллекций самых разнообразных поз. Вот, к примеру, Super Pose Book — сборник из трёх десятков PNG-файлов с «проволочными человечками» (плюс примеры их применения, которые можно подгрузить во вкладку «PNG Info» веб-интерфейса AUTOMATIC1111, чтобы увидеть задействованные при их генерации текстовые подсказки). И вот что получается, например, с позой openpose-pose (2), позитивной подсказкой proud fantasy paladin walking on rocky mountain path, mesmerizing sunset background, elaborate shiny armor, Hasselblad award winning photo и затравкой 611118914:
Обратим внимание на то, что, хотя референсная картинка с позой вертикальная, у нас в AUTOMATIC1111 по-прежнему задан горизонтальный холст размерами 768 × 512 точек — и итоговое изображение получается именно таким. Обойтись без искажений позволяет опция «Resize and fill» в разделе «Resize mode» в пространном меню ControlNet: не соответствующий формату холста снимок в этом случае помещается в центр, пропорционально вписываясь в заданный размер по вертикали, а пространство по сторонам от него используется моделью для дорисовывания — по тому же принципу, что и в случае уже знакомого нашим давним читателям режима Outpaint, доступного на вкладке «img2img».
Как раз управляющий режим OpenPose в таких случаях особенно хорош, поскольку препроцессоры Canny, Depth и т. п. тщательно обработают все объекты в оригинальном кадре — а по сторонам от него (после расширения холста) оставят пустое пространство. Которое действующий чекпойнт будет заполнять уже по своему «разумению» (и в указанных текстовой подсказкой рамках, конечно же), — но контраст между насыщенным оригинальными деталями центром и бедноватыми, но чистенькими внешними областями итоговой картинки может выйти слишком уж нарочитым. В случае же OpenPose всё пространство вокруг преобразованной препроцессором фигуры (или нескольких фигур) черным-черно, так что общая композиция выходит куда более естественной.
Возьмём ещё одну заготовленную позу, уже из другой подборки, 25 Pose Collection, — изображение o18 с подсказкой
brawny and tendinous barbarian lady flexing her muscles on a lush meadow, war paint, intricate fantasy leather armor, winding river and vast sky background, Hasselblad award winning photo
(негативная подсказка — ровно та же самая, что и во всех предыдущих случаях):
Напомним, нет ничего удивительного в том, что при используемых нами параметрах генерации на холсте размерами 768 × 512 точек лица на средних и тем более мелких планах выходят жутковатыми, — это мы обсуждали ранее в ходе изучения инструментов ADetalier и Hires. fix. Применим же к полученной картинке их оба — с параметрами, кстати, рекомендованными всё тем же автором используемого нами в данном случае чекпойнта AbsoluteReality. Возьмём для ADetailer две модели — face_yolov8m.pt и hand_yolov8s.pt, а для Hires. fix значение «Denoising strength» установим в 0,4. Отметим особо, что всегда имеет смысл выбирать конкретную модель для генерации изображений не только по приводимым для примера картинкам, но и по глубине проработанности авторского комментария, — во многих ситуациях информация оттуда оказывается поистине бесценной.
Результат:
Впрочем, и этого (размеры полученного изображения — 1536 × 1024 точки) может оказаться мало — если захочется сделать обои на «Рабочий стол» или отправить картинку на печать в формате А3. Последовательное масштабирование вверх с повышением качества, как мы уже не раз указывали в прежних выпусках «Практикума по ИИ-рисованию», — дело непростое: если задавать слишком малое значение «Denoising strength» — деталей почти не прибавится, картинка будет выглядеть нерезкой; слишком большое — есть шанс испортить то, что есть, из-за появления нежелательных артефактов увеличения.
У ControlNet — сюрприз, сюрприз! — есть решение и на этот случай: управляющий режим ControlNet tile upscale. Применять его надо уже из вкладки «img2img»: перебросим туда полученную картинку нажатием на соответствующую кнопку под окошком генерации на вкладке «txt2img», зададим значения «Extra noise multiplier for img2img and hires fix» — 0,05, «Sampling steps» — 30, «Denoising strength» — 0,3. «Sampling method» оставим тем же, что и при изначальной генерации, — DPM++ 3M SDE Karras.
Активируем в выпадающем меню «Tiled VAE» с теми же параметрами, что и на вкладке «txt2img». Далее в выпадающем меню ControlNet выберем режим «Tile/Blur» с препроцессором tile_resample и моделью control_v11f1e_sd15_tile (благо она там единственная). Сама перенесённая в «img2img» картинка и будет референсом, — если же нужна другая (зачем именно такое может понадобиться, объясним позже), пригодится опция «Upload independent control image». Теперь надо открыть расположенное ещё ниже выпадающее меню «Script» и выбрать там «Ultimate SD upscale», для которого указать «Target size type» — Scale from image size, х2, «Upscaler» — 4x-UltraSharp, и больше ничего трогать не надо.
Позитивная подсказка для апскейла будет такой:
shiny skin, skindentation, ultra high res, highest quality, exceptional details
Негативной нет вовсе, и получается вот что:
Более чем достойный вариант (оригинал с размерами 3072 × 2048 размещён на всякий случай тут: загруженный в AUTOMATIC1111 через «PNG Info», он позволит восстановить параметры масштабирования картинки), — и это мы рассмотрели, пусть и довольно подробно, лишь один из доступных управляющих режимов ControlNet! А есть ведь ещё, помимо довольно самоочевидных Canny и Depth, такие интереснейшие нейросети, как Reference или IP-adapters, — но они заслуживают того, чтобы остановиться на них в деталях особо чуть позже.