Мы разрабатываем новую архитектуру, которая может поддерживать более 10 типов элементов управления при преобразовании текста в изображение и генерировать изображения с высоким разрешением, визуально сравнимые с изображениями в середине пути . Сеть основана на исходной архитектуре ControlNet. Мы предлагаем два новых модуля: 1. Расширение исходной сети ControlNet для поддержки различных условий изображения с использованием одного и того же параметра сети. 2 Поддержка ввода нескольких условий без увеличения вычислительной нагрузки, что особенно важно для дизайнеров, которые хотят детально редактировать изображение: разные условия используют один и тот же кодировщик условий без добавления дополнительных вычислений или параметров. Мы проводим тщательные эксперименты с SDXL и достигаем превосходных характеристик как с точки зрения управляемости, так и с точки зрения эстетики. Мы публикуем метод и модель для сообщества открытого исходного кода, чтобы каждый мог ими воспользоваться.
Если вы найдете это полезным, пожалуйста, поставьте мне звезду, большое спасибо!!
Выпущена версия SDXL ProMax!!!,Наслаждайтесь!!!
Мне жаль, что из-за того, что доходы и расходы проекта трудно сбалансировать, ресурсы графического процессора передаются другим проектам, которые с большей вероятностью будут прибыльными, обучение SD3 прекращается до тех пор, пока я не найду достаточную поддержку графического процессора, я сделаю все возможное, чтобы найдите графические процессоры для продолжения обучения. Если это причиняет вам неудобства, приношу за это искренние извинения. Я хочу поблагодарить всех, кому нравится этот проект, ваша поддержка - это то, что помогает мне двигаться дальше.
Примечание. Мы поместили модель promax с суффиксом promax в тот же репозиторий модели Huggingface, подробные инструкции будут добавлены позже.
В следующем примере показано разрешение 1M --> разрешение 9M.
Используйте обучение сегментам, например, Novai, можно генерировать изображения с высоким разрешением и любым соотношением сторон.
Используйте большой объем данных высокого качества (более 10000000 изображений), набор данных охватывает самые разные ситуации.
Используйте подсказку с повторным заголовком, например DALLE.3, используйте CogVLM для создания подробного описания, хорошую возможность следовать подсказкам.
Используйте множество полезных приемов во время тренировки. Включая, помимо прочего, увеличение даты, множественную потерю, множественное разрешение.
Используйте почти тот же параметр, что и в исходном ControlNet. Нет очевидного увеличения параметров сети или вычислений.
Поддержка более 10 контрольных условий, отсутствие явного снижения производительности ни в одном из условий по сравнению с независимой тренировкой.
Поддержка генерации нескольких условий, объединение условий изучается во время обучения. Нет необходимости задавать гиперпараметры или подсказки для проектирования.
Совместим с другими моделями SDXL с открытым исходным кодом, такими как BluePencilXL, CounterfeitXL. Совместим с другими моделями Лоры.
https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0
https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0
https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0
https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0
[06.07.2024] Выпуск ControlNet++
и предварительно обученных моделей.
[06.07.2024] Выпуск кода вывода (одно и несколько условий).
[13.07.2024] Выпуск ProMax ControlNet++
с расширенной функцией редактирования.
ControlNet++ для градиента
ControlNet++ для Comfyui
опубликовать кодекс обучения и руководство по обучению.
выпустить архивную бумагу.
Одна из наиболее важных моделей сети управления. При обучении этой модели мы используем множество приемов, которые не уступают https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0, производительности SOTA при управлении позой. Чтобы модель openpose достигла максимальной производительности, вам следует заменить функцию draw_pose в пакете controlnet_aux (у comfyui есть собственный пакет controlnet_aux). Подробности см. в сценариях вывода .
Canny — одна из наиболее важных моделей управляющей сети — смешанное обучение с Lineart, Anime Lineart, MLSD. Надежная работа с любыми тонкими линиями. Модель является ключом к снижению степени деформации. Рекомендуется использовать тонкую линию для перерисовки руки/ноги.
Модель каракулей, одна из наиболее важных моделей управляющей сети, может поддерживать линию любой ширины и любого типа. так же хорошо, как https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0, сделайте каждого художником души.
Примечание: используйте скелет позы, чтобы контролировать позу человека, используйте тонкую линию, чтобы нарисовать детали рук и ног, чтобы избежать деформации.
Примечание: изображение глубины содержит подробную информацию, рекомендуется использовать глубину для фона и скелет позы для переднего плана.
Примечание. Scribble — это модель с четкими линиями, если вы хотите нарисовать что-то с нечетким контуром, вы можете использовать ее. Openpose + Scribble дает вам больше свободы в создании исходного изображения, после чего вы можете использовать тонкую линию для редактирования деталей.
Мы собираем большое количество изображений высокого качества. Изображения тщательно фильтруются и аннотируются, изображения охватывают широкий спектр тем, включая фотографии, аниме, природу, путешествие и так далее.
Мы предлагаем два новых модуля в ControlNet++, названных «Преобразователь условий» и «Кодер управления» соответственно. Мы немного модифицировали старый модуль, чтобы улучшить его возможности представления. Кроме того, мы предлагаем единую стратегию обучения для реализации одиночного и множественного контроля за один этап.
Для каждого условия мы присваиваем ему идентификатор типа управления, например, openpose--(1, 0, 0, 0, 0, 0), глубина--(0, 1, 0, 0, 0, 0), несколько условий будут такими (открытая позиция, глубина) --(1, 1, 0, 0, 0, 0). В кодировщике управления идентификатор типа управления будет преобразован во внедренные типы управления (с использованием синусоидальных позиционных внедрений), затем мы используем один линейный слой, чтобы проецировать внедренные типы управления так, чтобы они имели одинаковую яркость с внедрением времени. Функции типа управления добавляются к внедрению времени для обозначения различных типов управления. Эта простая настройка может помочь ControlNet различать разные типы управления, поскольку внедрение времени имеет тенденцию оказывать глобальное воздействие на всю сеть. Независимо от того, одно или несколько условий, ему соответствует уникальный идентификатор типа управления.
Мы расширяем ControlNet для поддержки нескольких управляющих входов одновременно, используя одну и ту же сеть. Трансформатор условий используется для объединения различных функций состояния изображения. В наших методах есть два основных нововведения. Во-первых, разные условия используют один и тот же кодировщик условий, что делает сеть более простой и легкой. это отличается от других основных методов, таких как T2I или UniControlNet. Во-вторых, мы добавляем слой преобразователя для обмена информацией об исходном изображении и изображениях условий. Вместо того, чтобы напрямую использовать выходные данные преобразователя, мы используем его для прогнозирования смещения состояния относительно исходного объекта состояния. Это чем-то похоже на ResNet, и мы экспериментально обнаружили, что этот параметр явно может улучшить производительность сети.
Исходный кодировщик условий ControlNet представляет собой стек конв-слоя и активаций Silu. Мы не меняем архитектуру кодировщика, мы просто увеличиваем количество конв-каналов, чтобы получить «толстый» кодировщик. Очевидно, что это может повысить производительность сети. Причина в том, что мы используем один и тот же кодер для всех условий изображения, поэтому требуется, чтобы кодер имел более высокую способность представления. Исходная настройка подойдет для одного условия, но не так хороша для более чем 10 условий. Обратите внимание, что использование исходных настроек также допустимо, но с некоторым жертвованием качеством генерации изображения.
Обучение с одним условием может быть ограничено разнообразием данных. Например, openpose требует от вас обучения с изображениями людей, а mlsd требует от вас обучения с изображениями с линиями, что может повлиять на производительность при создании невидимых объектов. Кроме того, сложность тренировки разных условий различна: сложно добиться одновременного сходства всех условий и достижения наилучших результатов в каждом отдельном условии. Наконец, мы будем склонны использовать два или более условий одновременно, обучение с несколькими условиями сделает объединение различных условий более плавным и повысит надежность сети (поскольку одно условие изучает ограниченные знания). Мы предлагаем унифицированный этап обучения для одновременной реализации оптимальной сходимости одного условия и объединения нескольких условий.
ControlNet++ требует передать в сеть идентификатор типа управления. Мы объединяем 10+ элементов управления в 6 типов управления, смысл каждого типа следующий:
0 -- открытая позиция
1 -- глубина
2 – толстая линия(scribble/hed/softedge/ted-512)
3 — тонкая линия (canny/mlsd/lineart/animelineart/ted-1280)
4 -- нормальный
5 -- сегмент
Мы рекомендуем версию Python >= 3.8. Вы можете настроить виртуальную среду с помощью следующей команды:
conda create -n controlplus python=3.8 Конда активирует ControlPlus pip install -r требования.txt
Вы загружаете вес модели в https://huggingface.co/xinsir/controlnet-union-sdxl-1.0. Любая новая модель будет размещена на Huggingface. Вы можете подписаться на https://huggingface.co/xinsir, чтобы получить новейшую информацию о модели.
Мы предоставляем сценарии вывода для каждого условия управления. Пожалуйста, обратитесь к нему для более подробной информации.
Существует некоторая разница в предварительной обработке. Чтобы добиться максимальной производительности openpose-control, выполните следующие действия: найдите util.py в пакете controlnet_aux, замените функцию draw_bodypose следующим кодом.
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ Нарисовать ключевые точки и конечности, представляющие позу тела на заданном холсте. Args: Canvas (np.ndarray): трехмерный массив numpy представление холста (изображения), на котором будут рисоваться ключевые точки тела (List[Keypoint]): список объектов Keypoint, представляющих ключевые точки тела, которые будут нарисованы. Возвращает: np.ndarray: трехмерный массив numpy, представляющий измененный холст с нарисованной позой тела. Примечание. Функция ожидает, что координаты x и y ключевых точек будут нормализованы между 0 и 1. """ H, W, C =. холст.форма если max(W, H) < 500: соотношение = 1,0 elif max(W, H) >= 500 и max(W, H) < 1000: соотношение = 2,0 elif max(W, H) >= 1000 и max(W) , H) < 2000: соотношение = 3,0 elif max(W, H) >= 2000 и max(W, H) < 3000: соотношение = 4,0 elif max(W, H) >= 3000 и max(W, H) < 4000: соотношение = 5,0 elif max(W, H) >= 4000 и max(W, H) < 5000: соотношение = 6.0 еще: соотношение = 7.0 ширина палки = 4 конечностьSeq = [ [2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], [1, 16], [16, 18], ] цвета = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0 ], [0, 255, 0], [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85 , 0, 255], [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] для (k1_index, k2_index), цвет в zip(limbSeq,colors): keypoint1 = ключевые точки[k1_index - 1] ключевая точка2 = ключевые точки[k2_index - 1], если ключевая точка1 Нет или keypoint2 равен None: continue Y = np.array([keypoint1.x, keypoint2.x]) * float(W) X = np.array([keypoint1.y, keypoint2.y]) * float(H) mX = np.mean(X) mY = np.mean(Y) длина = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** угол 0,5 = math.grades(math.atan2(X[0] - X[1], Y[0] - Y[1])) многоугольник = cv2.ellipse2Poly((int(mY), int( mX)), (int(длина / 2), int(ширина стержня * соотношение)), int(угол), 0, 360, 1) cv2.fillConvexPoly(canvas, multigon, [int(float(c) * 0.6) for c в цвете]) для ключевой точки, цвет в zip(ключевые точки, цвета): если ключевая точка равна None: продолжить x, y = keypoint.x, keypoint.y x = int(x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * соотношение), цвет, толщина=-1) вернуть холст
Для вывода одного условия вы должны предоставить подсказку и управляющее изображение, измените соответствующие строки в файле Python.
python controlnet_union_test_openpose.py
Для вывода нескольких условий вы должны убедиться, что ваш входной список_изображений совместим с вашим типом_контроля, например, если вы хотите использовать openpose и контроль глубины, image_list --> [controlnet_img_pose, controlnet_img_глубина, 0, 0, 0, 0], control_type -- > [1, 1, 0, 0, 0, 0]. Дополнительную информацию см. в файле controlnet_union_test_multi_control.py.
Теоретически вам не нужно устанавливать шкалу условий для разных условий, сеть спроектирована и обучена естественным образом объединять разные условия. По умолчанию для каждого входного условия установлено значение 1,0, оно аналогично тренировке с несколькими условиями. Однако, если вы хотите усилить влияние какого-либо определенного входного условия, вы можете настроить шкалы условий в модуле «Трансформатор условий». В этом модуле входные условия будут добавлены к функциям исходного изображения вместе с прогнозом смещения. умножение его на определенный масштаб повлияет на многое (но может привести к неизвестному результату).
python controlnet_union_test_multi_control.py