18.10.2024

Control net: lllyasviel/ControlNet: Let us control diffusion models!

Установка и объяснение настроек Control Net. (Копирование позы, композиции и т.д.) — Гайды на DTF

Телеграм канал автора

7462 просмотров

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

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

Для начала становим расширение. Запустите автоматик, зайдите Extensions — Available — Нажмите кнопку Load from. Загрузятся расширения доступные к установке, найдите sd-webui-controlnet и нажмите Install. С расширением всё.

Теперь нужно скачать модели и я походу объясню какая и зачем.

  • Модели. Есть полные версии, а так же их уменьшенные версии, заметной разницы в качестве я не обнаружил и пользуюсь уменьшенными так как SSD не резиновый.

Можете скачать все со словом control в начале. Я в основном использую 3, это depth, openpose, hed, но так как весят не много и удобно иметь под рукой, имею все.

Препроцессоры:

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

canny — обводит края тонкой линией, подходит для изображений с резкими краями, например аниме, но это не обязательная к исполнению рекомендация, как и все ниже, может сработать для вас и на другом типе изображений

hed — толстой размазанной, смягчая края

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

depth — маска глубины чем ближе к камере тем белее, для всего когда нужно получить объем сцены чтобы его сохранить

normal — карта объёма

scribble — создает каракули и может создавать что-то из каракуль.

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

seg- делит картинку на сегменты, затем пытается в тех же сегментах нарисовать те же объекты которые могут относиться к этому сегменту. Использовал я его примерно 0 раз, но кто знает…

После скачивания моделей поместите их по пути: ваша_папка_с_автоматиком\extensions\sd-webui-controlnet\models

После того как все сделали, полностью перезапустите стабильную диффузию.

Запускаем снова и смотрим вниз. Появилась вкладка ControlNet. Давайте сгенерируем что нибудь и сразу возьмем его позу для генерации чего-то другого.

Конечно же не обязательно генерировать. Вы можете поместить в окно контролнета любую фотографию которую хотите взять за основу.

Ставлю галку на Enable, чтобы активировать расширение. Выбираю препроцесср Openpose модель тоже openpose.

Еще пример изображения в той же позе.

А теперь давайте разберемся с настройками. По крайней мере на дату выхода статьи 😅, в мире нейросетей все очень быстро меняется.

Enable — включить

Invert Input Color — инвертировать изображение. Бывает что вам понадобится черный контур на белом фоне, а ваша картинка имеет обратные цвета. Галка поможет

RGB to BGR — сменить компоновку пикселей. Видимо на матрицах BGR даст результат лучше, но я с такими дело не имел

Low VRAM — уменьшает требование к видеопамяти

Guess Mode — удалите промпт, контрол сам попробует понять что на картинке и повторить по своему. По мне фигня какая-то (на текущую дату)

Preprocessor — обработчик изображения которое вы скормили расширению. То есть openpose превращает изображение в позу. Из примера выше она выглядит вот так.

Model — берет то что получила от препроцессора и обрабатывает.

Weight — как сильно контролнет будет влиять на композицию

Guidance Start (T) — когда вмешаться

Guidance End (T) — когда перестать

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

Annotator Resolution — разрешение считывания, ставьте по самой короткой стороне вашей картинки, качество работы препроцессора должно стать лучше.

Threshold A\B — предназначены для очистки “мусора” на таких препроцессорах как canny например. Если у вас считывает что что вы не хотели бы или наоборот, поиграйте этими ползунками.

Оба максимум \ Оба минимум

С позами понятно. А остальные что?

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

Выбирайте препроцессор при принципу что вам важно взять с изображения? Только позу? Openpose.

Силуэт? Depth. Нужно сохранить практически все грани, но переделать в другой стиль? Canny, hed.

На прощание нарисуем кролика:

Поделиться результатом или задать вопрос вы можете в нашем нейробратском комьюнити.

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

П.С. Создали онлайн интенсив для новичков. Пройдет 7 и 10 апреля 2023 года. Ознакомиться с программой и принять участие можно по ссылке.

Как работает ControlNet. Контролируемая генерация изображений / Хабр

Нейронные сети прошли долгий путь от генерации странных ЧБ-изображений до фантастических фотореалистичных сцен, которые не поддаются воображению. С помощью всего лишь короткой текстовой подсказки диффузионные нейросети могут создавать потрясающие изображения, неотличимые от обычных. Однако, какими бы впечатляющими ни были эти модели, в них отсутствует важнейший элемент — пользовательский контроль.

Представьте, что вы можете указать точную форму, положение и позу объекта на изображении, которое вы хотите создать. Что ж, теперь это возможно благодаря новаторской технологии под названием ControlNet!

Эта end-to-end архитектура нейронной сети позволяет вам управлять процессом генерации изображения в диффузионных моделях, добавляя определённые входные условия, такие как форма, глубина или поза объекта. Плавно интегрируя управляющую сеть и диффузионную модель, ControlNet точно настраивает выходные данные большой предварительно обученной модели в соответствии с желаемыми входными условиями. ControlNet даёт вам возможность раскрыть свой творческий потенциал и создавать визуально потрясающие изображения, соответствующие вашему видению мира.

Модель способна эффективно изучать условия, зависящие от конкретной задачи, даже когда обучающий набор данных невелик (< 50k). Кроме того, её также можно обучать даже на персональных компьютерах, если мощные вычислительные кластеры недоступны, и масштабировать для больших наборов данных (миллионы или миллиарды), если таковые имеются. Кроме того, ControlNet также может принимать различные формы входных данных, такие как карты границ и карты сегментации, что ещё больше расширяет её возможности по сравнению с традиционными методами. В этой статье мы обсудим, как работает ControlNet, и рассмотрим её применение в задачах обработки изображений.

girl, masterpiece, best quality, ultradetailed, illustration

▍ Проблема

Актуальные диффузионные text2image модели обладают различными способами, упрощающими пользователю путь к достижению «идеальной картинки», которая была бы больше похожа на желаемое.

Есть инструменты для создания вариаций изображения на основе скрытого представления или вектора CLIP, преобразование image2image и inpainting, но они работают не так хорошо, как хотелось бы.

А потом появился ControlNet.

▍ Image2image

ControlNet позволяет использовать условные входные данные в больших диффузионных моделях, таких как Stable Diffusion, что даёт возможность пользователям больше контролировать сгенерированные результаты, чем когда-либо прежде!

Перевод изображения в изображение — это метод, который изучает сопоставление между изображениями в разных областях, таких как художественные работы, фотографии или эскизы. Для достижения этой цели использовались различные типы алгоритмов, такие как условно порождающие нейронные сети, методы авторегрессии и многомодельные методы. Новейшие методы преобразования изображения в изображение можно найти в Taming Transformer, Palette и PITI. Они используют такие методы, как VIT (Vision Transformers), файнтюнинг и основанные на оптимизации манипуляции процессом диффузии для получения результатов.

Однако ControlNet отличается от этих методов тем, что нацелена на управление диффузионными моделями с учётом конкретных условий задачи, а не на изучение сопоставления между изображениями в разных доменах.

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

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

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

a man wearing sunglass near a street corner

▍ Метод

ControlNet — это архитектура нейронной сети, предназначенная для улучшения предварительно обученных моделей диффузии изображений в зависимости от конкретных задач. Она работает путём манипулирования входными условиями блоков нейронной сети, которые представляют собой наборы нейронных слоёв, используемых для построения нейронных сетей, которые обучаются с помощью вектора внешних условий. Это позволяет сохранить исходные веса, избегая каких-либо изменений из-за небольших наборов данных и позволяя проводить файнтюнинг намного быстрее, чем обучение с нуля. ControlNet использует слои «нулевой свёртки» в качестве соединений между своими компонентами, которые имеют как вес, так и смещение, инициализированные нулями, так что на первом этапе обучения они не оказывают никакого влияния на глубокие объекты. Градиенты для этих нулевых свёрток могут быть рассчитаны с использованием уравнений произведения Адамара таким образом, что когда внешний градиент не равен нулю, будут получены ненулевые градиенты, и обучение начнётся без необходимости начинать с нуля каждый раз, когда вводятся новые данные или задачи. ControlNet обычно применяют к Stable Diffusion (модель преобразования текста в изображение), где входные данные сначала должны быть закодированы в свёрнутые карты размером 64 x 64 с использованием небольшой сети из четырёх слоёв свёртки, прежде чем они будут подключены через структуру ControlNet в encoder / decoder.

ControlNet имеет всего четыре слоя свёртки с ядрами 4 x 4 и шагами 2 x 2, наряду с активацией ReLU и гауссовыми весами, которая используется для кодирования условий пространства изображений ci в карты объектов cf = E(ci). С помощью этой сети управления обучение модели Stable Diffusion требует всего 23% дополнительной памяти и 34% дополнительного времени по сравнению с исходной моделью. Архитектура ControlNet также, вероятно, будет использоваться с другими моделями распространения в виде типичной структуры U-net.

Обучение нейросети происходит так же быстро, как файнтюн диффузионной модели. Было обнаружено, что для повышения производительности обучения в экстремальных случаях, когда вычисления на устройстве ограничены, частичный разрыв соединений между сетью управления и стабильной диффузией ускоряет конвергенцию. Когда доступны мощные вычислительные кластеры, для обучения можно использовать большие объёмы (от миллионов до миллиардов) данных. В этом случае можно сначала обучить управляющие сети для достаточно большого числа итераций, прежде чем разблокировать все веса Stable Diffusion и совместно обучать их вместе как одну модель, специфичную для конкретной задачи. Это приводит к более точному управлению моделями распространения изображений, что может дополнительно облегчить смежные приложения, такие как обнаружение чётких границ на изображениях с использованием случайных пороговых значений.


▍ Заключение

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

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

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

Попробовать демо


Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх

ControlNet/train.md на главной · lllyasviel/ControlNet · GitHub

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

Прежде чем переходить к собственному набору данных, мы настоятельно рекомендуем сначала попробовать игрушечный набор данных, Fill50K, в качестве проверки работоспособности. Это поможет вам «прочувствовать» тренировку. Вы будете знать, сколько времени потребуется для сходимости модели и сможет ли ваше устройство завершить обучение за приемлемое время. И как это «ощущается», когда модель сходится.

Мы надеемся, что после прочтения этой страницы вы обнаружите, что обучение ControlNet так же просто (или даже легче, как) обучение pix2pix.

Шаг 0. Создайте свой элемент управления

Давайте рассмотрим очень простую задачу по управлению SD для заливки кружков цветом.

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

Стабильная диффузия обучена на миллиардах изображений и уже знает, что такое «голубой», что такое «круг», что такое «розовый» и что такое «фон».

Но он не знает значения этого «Контрольного изображения (исходного изображения)». Наша цель — сообщить об этом.

Шаг 1. Получите набор данных

Просто загрузите набор данных Fill50K с нашей страницы Huggingface (training/fill50k.zip, размер файла всего 200 МБ!). Убедитесь, что данные распакованы как

 ControlNet/training/fill50k/prompt.json
ControlNet/обучение/fill50k/источник/X.png
ControlNet/обучение/fill50k/цель/X.png
 

В папке «fill50k/source» у вас будет 50 тысяч изображений линий окружностей.

В папке «fill50k/target» у вас будет 50 тысяч изображений закрашенных кругов.

В «fill50k/prompt.json» у вас будут их имена файлов и подсказки. Каждая подсказка похожа на «цветной круг балабалы на фоне другого цвета».

Шаг 2. Загрузите набор данных

Затем вам нужно написать простой скрипт для чтения этого набора данных для pytorch. (На самом деле мы написали это для вас в «tutorial_dataset. py».)

 импорт JSON
импорт cv2
импортировать numpy как np
из torch.utils.data импортировать набор данных
класс MyDataset (набор данных):
    защита __init__(сам):
        self.data = []
        с open('./training/fill50k/prompt.json', 'rt') как f:
            для строки в f:
                self.data.append (json.loads (строка))
    защита __len__(я):
        вернуть len(self.data)
    деф __getitem__(я, IDX):
        элемент = self.data[idx]
        source_filename = элемент['источник']
        target_filename = элемент['цель']
        подсказка = элемент ['подсказка']
        source = cv2.imread('./training/fill50k/' + source_filename)
        target = cv2.imread('./training/fill50k/' + target_filename)
        # Не забывайте, что OpenCV читает изображения в порядке BGR.
        источник = cv2.cvtColor (источник, cv2.COLOR_BGR2RGB)
        цель = cv2.cvtColor (цель, cv2.COLOR_BGR2RGB)
        # Нормализация исходных изображений до [0, 1].
        источник = источник.astype(np. float32)/255,0
        # Нормализация целевых изображений до [-1, 1].
        цель = (target.astype(np.float32)/127,5) - 1,0
        вернуть dict(jpg=цель, txt=подсказка, подсказка=источник) 

Это превратит ваш набор данных в массивоподобный объект в Python. Вы можете протестировать этот набор данных, просто обратившись к массиву, например

.
 из tutorial_dataset импортировать MyDataset
набор данных = Мой набор данных ()
печать (длина (набор данных))
элемент = набор данных[1234]
jpg = элемент['jpg']
txt = элемент['txt']
подсказка = элемент['подсказка']
печать (текст)
печать(jpg.форма)
печать (подсказка.форма) 

Результат этого простого теста на моей машине равен

.
 50000
крепкий деревянный круг с оранжевым фоном
(512, 512, 3)
(512, 512, 3)
 

И этот код находится в «tutorial_dataset_test.py».

Таким образом, набор данных представляет собой объект, подобный массиву, с 50000 элементов. Каждый элемент представляет собой словарь с тремя элементами «jpg», «txt» и «hint». «jpg» — это целевое изображение, «подсказка» — это контрольное изображение, а «txt» — это подсказка.

Не спрашивайте нас, почему мы используем эти три имени — это связано с темной историей библиотеки под названием LDM.

Шаг 3. Какой моделью SD вы хотите управлять?

Затем вам нужно решить, какой стабильной диффузионной моделью вы хотите управлять. В этом примере мы будем использовать стандартный SD1.5. Вы можете скачать его с официальной страницы Stability. Вам нужен файл «v1-5-pruned.ckpt».

(или «v2-1_512-ema-pruned.ckpt», если вы используете SD2.)

Затем к модели SD необходимо подключить контрольную сеть. Архитектура

Обратите внимание, что все веса внутри ControlNet также копируются из SD, так что ни один слой не обучается с нуля, и вы по-прежнему выполняете точную настройку всей модели.

Мы предоставляем простой сценарий, чтобы вы могли легко добиться этого. Если имя вашего SD-файла «./models/v1-5-pruned.ckpt», и вы хотите, чтобы сценарий сохранил обработанную модель (SD+ControlNet) в местоположении «./models/control_sd15_ini.ckpt», вы можете просто запустить:

 Python tool_add_control.py ./models/v1-5-pruned.ckpt ./models/control_sd15_ini.ckpt
 

Или, если вы используете SD2:

 Python tool_add_control_sd21.py ./models/v2-1_512-ema-pruned.ckpt ./models/control_sd21_ini.ckpt
 

Вы также можете использовать другие имена файлов, если используется команда «python tool_add_control.py input_path output_path».

Это правильный вывод моей машины:

Шаг 4 — Тренируйся!

С Днем! Наконец-то мы подошли к самому захватывающему этапу: тренировкам!

Код обучения в «tutorial_train.py» на самом деле удивительно прост:

 импортировать pytorch_lightning как pl
из torch.utils.data импортировать DataLoader
из tutorial_dataset импортировать MyDataset
из cldm. logger импортировать ImageLogger
из cldm.model импортировать create_model, load_state_dict
# Конфиги
резюме_путь = './models/control_sd15_ini.ckpt'
размер_пакета = 4
logger_freq = 300
скорость_обучения = 1e-5
sd_locked = Истина
only_mid_control = Ложь
# Сначала используйте процессор для загрузки моделей. Pytorch Lightning автоматически переместит его на графические процессоры.
модель = create_model('./models/cldm_v15.yaml').cpu()
model.load_state_dict (load_state_dict (resume_path, location = 'cpu'))
model.learning_rate = скорость_обучения
model.sd_locked = sd_locked
model.only_mid_control = only_mid_control
# Разное
набор данных = Мой набор данных ()
загрузчик данных = DataLoader (набор данных, num_workers = 0, batch_size = размер_пакета, перемешивание = True)
logger = ImageLogger (batch_frequency = logger_freq)
тренер = pl.Trainer (gpus = 1, точность = 32, обратные вызовы = [регистратор])
# Тренироваться!
Trainer.fit(модель, загрузчик данных) 

(или «tutorial_train_sd21. py», если вы используете SD2)

Благодаря нашему объекту организованного набора данных pytorch и мощности pytorch_lightning весь код очень короткий.

Теперь вы можете взглянуть на официальный документ Pytorch Lightning, чтобы узнать, как включить множество полезных функций, таких как накопление градиента, обучение нескольких графических процессоров, ускоренную загрузку набора данных, гибкое сохранение контрольных точек и т. д. Для всего этого требуется всего одна строка кода. Большой!

Обратите внимание: если вы найдете OOM, возможно, вам нужно включить режим Low VRAM, а также, возможно, вам нужно использовать меньший размер пакета и накопление градиента. Или вы также можете использовать некоторые «продвинутые» приемы, такие как нарезанное внимание или xformers. Например:

 # Конфиги
размер_пакета = 1
# Разное
Trainer = pl.Trainer(gpus=1, precision=32, callbacks=[logger], calculate_grad_batches=4) # Но это будет в 4 раза медленнее 

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

Скриншоты

Обучение проходит быстро. После 4000 шагов (размер пакета 4, скорость обучения 1e-5, около 50 минут на PCIE 40G) результаты на моей машине (в выходной папке «image_log») равны

Управление:

Подсказка:

Предсказание:

Наземная правда:

Обратите внимание, что возможности SD сохранены. Даже тренируясь на этом сверхвыровненном наборе данных, он по-прежнему рисует некоторые случайные текстуры и эти снежные украшения. (Кроме того, обратите внимание, что основная правда выглядит немного измененной, потому что она преобразована из скрытого образа SD.)

Увеличение размера партии и более длительное обучение еще больше улучшит это. Адекватная подготовка сделает начинку идеальной.

Конечно, обучать ШД закрашивать круги бессмысленно, но это удачное начало вашей истории.

Давайте работать вместе, чтобы все больше и больше контролировать большие модели.

Другие опции

Помимо стандартных вещей, мы также предоставляем два важных параметра «sd_locked» и «only_mid_control», которые вам необходимо знать.

only_mid_control

По умолчанию only_mid_control имеет значение False. Когда это правда, вы будете тренировать приведенную ниже архитектуру.

Это может быть полезно, когда ваша вычислительная мощность ограничена и вы хотите ускорить обучение, или когда вы хотите облегчить «глобальное» контекстное обучение. Обратите внимание, что иногда вы можете приостановить тренировку, установить для нее значение «Истина», возобновить тренировку и снова сделать паузу, установить ее снова и снова возобновить.

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

sd_locked

По умолчанию sd_locked имеет значение True. Когда это False, вы будете обучать приведенную ниже архитектуру.

Это разблокирует некоторые слои в SD, и вы будете тренировать их целиком.

Эта опция ОПАСНА! Если ваш набор данных недостаточно хорош, это может привести к снижению возможностей вашей SD-модели.

Однако этот параметр также очень полезен, когда вы тренируетесь на изображениях с определенным стилем или когда вы тренируетесь со специальными наборами данных (например, набором медицинских данных с рентгеновскими снимками или наборами географических данных с большим количеством Google Maps). Вы можете понимать это как одновременное обучение ControlNet и чего-то вроде DreamBooth.

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

Кроме того, если вы разблокируете некоторые исходные слои, вам может потребоваться более низкая скорость обучения, например 2e-6.

Больше внимания: явление внезапной сходимости и накопление градиента

Поскольку мы используем нулевые свертки, SD всегда должен быть в состоянии предсказать значимые изображения. (Если не получается, значит обучение уже провалено.)

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

Обратите внимание, что от 3 000 до 7 000 шагов — это не очень много, и вам следует учитывать больший размер пакета, а не большее количество шагов обучения. Если вы можете наблюдать «внезапную конвергенцию» на шаге 3k, используя размер пакета 4, то вместо того, чтобы обучать его с дальнейшими 300k шагами, лучше использовать 100-кратное накопление градиента для повторного обучения этих 3k шагов с размером пакета 100x. . Обратите внимание, что, возможно, нам не следует этого делать слишком экстремально (возможно, 100-кратное накопление слишком экстремально), но вы должны учитывать, что, поскольку «внезапное схождение» всегда происходит в определенный момент, получение лучшего схождения является более важным.

Поскольку «внезапная сходимость» всегда происходит, скажем, «внезапная сходимость» произойдет на шаге 3k, а наши деньги могут оптимизировать шаг 90k, тогда у нас есть два варианта: (1) обучить 3k шагов, внезапную сходимость, затем обучить 87k шагов. (2) 30-кратное накопление градиента, обучение 3 тыс. шагов (90k реальных шагов вычислений), затем внезапная сходимость.

В моих экспериментах (2) обычно лучше, чем (1). Однако в реальных случаях, возможно, вам может понадобиться самостоятельно сбалансировать шаги до и после «внезапного схождения», чтобы найти баланс. Тренировка после «внезапного схождения» также важна.

Но обычно, если размер пакета логики уже превышает 256, дальнейшее увеличение размера пакета не имеет особого смысла. В этом случае, возможно, лучше тренировать больше шагов. Я попробовал какой-то «общий» размер пакета логики в 64 или 96 или 128 (путем накопления градиента), кажется, что многие сложные условия уже могут быть решены очень хорошо.

ControlNet/tool_transfer_control.py на главной · lllyasviel/ControlNet · GitHub

path_sd15 = ‘./models/v1-5-pruned.ckpt’
path_sd15_with_control = ‘. /models/control_sd15_openpose.pth’
path_input = ‘./models/anything-v3-full.safetensors’
path_output = ‘./models/control_any3_openpose.pth’
импорт ОС
утверждают os.path.exists(path_sd15), ‘Вход path_sd15 не существует!’
утверждают os.path.exists(path_sd15_with_control), ‘Вход path_sd15_with_control не существует!’
утверждать os. path.exists(path_input), ‘Входной path_input не существует!’
утверждать os.path.exists(os.path.dirname(path_output)), ‘Выходная папка не существует!’
импортная горелка
из общего импорта *
из cldm.model import load_state_dict
sd15_state_dict = load_state_dict (path_sd15)
sd15_with_control_state_dict = load_state_dict (path_sd15_with_control)
input_state_dict = load_state_dict (path_input)
определение get_node_name (имя, parent_name):
, если len(имя) <= len(parent_name):
возврат Ложь,
p = имя[:len(родительское_имя)]
, если p != имя_родителя:
возврат Ложь,
вернуть True, имя[len(parent_name):]
ключей = sd15_with_control_state_dict. keys()
final_state_dict = {}
для ключей в ключах:
is_first_stage, _ = get_node_name (ключ, ‘first_stage_model’)
is_cond_stage, _ = get_node_name (ключ, ‘cond_stage_model’)
, если is_first_stage или is_cond_stage:
final_state_dict[ключ] = input_state_dict[ключ]
продолжить
р = sd15_with_control_state_dict[ключ]
is_control, node_name = get_node_name (ключ, ‘control_’)
если is_control:
sd15_key_name = ‘model.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *