Diseñamos una nueva arquitectura que puede admitir más de 10 tipos de control en condiciones de generación de texto a imagen y puede generar imágenes de alta resolución visualmente comparables con las de mitad de camino . La red se basa en la arquitectura ControlNet original; proponemos dos nuevos módulos para: 1 Extender el ControlNet original para admitir diferentes condiciones de imagen utilizando el mismo parámetro de red. 2 Admite la entrada de múltiples condiciones sin aumentar la descarga de cálculo, lo cual es especialmente importante para los diseñadores que desean editar imágenes en detalle; diferentes condiciones utilizan el mismo codificador de condiciones, sin agregar cálculos o parámetros adicionales. Realizamos experimentos exhaustivos con SDXL y logramos un rendimiento superior tanto en capacidad de control como en puntuación estética. Lanzamos el método y el modelo a la comunidad de código abierto para que todos puedan disfrutarlo.
Si lo encuentras útil, por favor dame una estrella, ¡¡Muchas gracias!!
¡¡¡La versión SDXL ProMax ha sido lanzada !!!, ¡¡¡Disfrútala!!!
Lamento que debido a que los ingresos y gastos del proyecto son difíciles de equilibrar, los recursos de GPU se asignan a otros proyectos que tienen más probabilidades de ser rentables, el entrenamiento de SD3 se detiene hasta que encuentre suficiente soporte de GPU, haré todo lo posible para Encuentra GPU para seguir entrenando. Si esto le causa inconvenientes, le pido sinceras disculpas por ello. Quiero agradecer a todos los que les gusta este proyecto, su apoyo es lo que me mantiene adelante.
Nota: colocamos el modelo promax con un sufijo promax en el mismo repositorio del modelo huggingface; se agregarán instrucciones detalladas más adelante.
El siguiente ejemplo muestra una resolución de 1M --> resolución de 9M
Utilice el entrenamiento con cubos como novelai, puede generar imágenes de alta resolución con cualquier relación de aspecto.
Utilice una gran cantidad de datos de alta calidad (más de 10000000 imágenes), el conjunto de datos cubre una diversidad de situaciones
Utilice un mensaje con subtítulos como DALLE.3, use CogVLM para generar una descripción detallada, buena capacidad de seguimiento de mensajes
Utilice muchos trucos útiles durante el entrenamiento. Incluyendo, entre otros, aumento de fecha, pérdida múltiple y resolución múltiple.
Utilice casi el mismo parámetro en comparación con ControlNet original. No hay un aumento obvio en los parámetros o cálculos de la red.
Admite más de 10 condiciones de control, sin una caída obvia del rendimiento en ninguna condición en comparación con el entrenamiento independiente
Admite la generación de múltiples condiciones, la fusión de condiciones se aprende durante el entrenamiento. No es necesario establecer hiperparámetros ni indicaciones de diseño.
Compatible con otros modelos SDXL de código abierto, como BluePencilXL, CounterfeitXL. Compatible con otros modelos Lora.
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] Lanzamiento de ControlNet++
y modelos previamente entrenados.
[06/07/2024] Publicar código de inferencia (condición única y condición múltiple).
[13/07/2024] Lanzamiento ProMax ControlNet++
con función de edición avanzada.
ControlNet++ para grado
ControlNet++ para Comfyui
publicar el código de capacitación y la guía de capacitación.
liberar papel arxiv.
Uno de los modelos de controlnet más importantes. Usamos muchos trucos para entrenar este modelo, que son tan buenos como https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0, rendimiento SOTA en control de pose. Para que el modelo openpose alcance su mejor rendimiento, debe reemplazar la función draw_pose en el paquete controlnet_aux (comfyui tiene su propio paquete controlnet_aux); consulte los scripts de inferencia para obtener más detalles.
Uno de los modelos de controlnet más importantes, canny, es el entrenamiento mixto con lineart, anime lineart, mlsd. Rendimiento sólido al tratar con líneas finas, el modelo es la clave para disminuir la tasa de deformidad, se recomienda utilizar líneas finas para volver a dibujar la mano/pie.
Uno de los modelos de controlnet más importantes, el modelo scribble, puede admitir cualquier ancho de línea y cualquier tipo de línea. Igual de bueno que https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0, convierte a todos en pintores de almas.
Nota: use la pose del esqueleto para controlar la pose humana, use una línea delgada para dibujar el detalle de la mano/pie para evitar deformidades
Nota: la imagen de profundidad contiene información detallada, se recomienda usar profundidad para el fondo y pose de esqueleto para el primer plano.
Nota: Scribble es un modelo de líneas fuertes, si quieres dibujar algo sin un contorno estricto, puedes usarlo. Openpose + Scribble te brinda más libertad para generar tu imagen inicial, luego puedes usar líneas finas para editar los detalles.
Recopilamos una gran cantidad de imágenes de alta calidad. Las imágenes están filtradas y comentadas seriamente, las imágenes cubren una amplia gama de temas, incluyendo fotografía, anime, naturaleza, mitad de viaje, etc.
Proponemos dos nuevos módulos en ControlNet++, denominados Transformador de condición y Codificador de control, respectivamente. Modificamos ligeramente un módulo antiguo para mejorar su capacidad de representación. Además, proponemos una estrategia de capacitación unificada para realizar controles únicos y múltiples en una sola etapa.
Para cada condición, le asignamos una identificación de tipo de control, por ejemplo, openpose--(1, 0, 0, 0, 0, 0), profundidad--(0, 1, 0, 0, 0, 0), Las condiciones múltiples serán como (openpose, profundidad) --(1, 1, 0, 0, 0, 0). En el codificador de control, la identificación del tipo de control se convertirá en incrustaciones de tipo de control (usando incrustaciones posicionales sinusoidales), luego usamos una sola capa lineal para proyectar las incrustaciones de tipo de control para que tengan la misma atenuación con la incrustación de tiempo. Las funciones de tipo de control se agregan a la incorporación de tiempo para indicar diferentes tipos de control; esta configuración simple puede ayudar a ControlNet a distinguir diferentes tipos de control, ya que la incorporación de tiempo tiende a tener un efecto global en toda la red. No importa la condición única o múltiple, hay una identificación de tipo de control única que le corresponde.
Ampliamos ControlNet para admitir múltiples entradas de control al mismo tiempo usando la misma red. El transformador de condición se utiliza para combinar diferentes características de condición de imagen. Hay dos innovaciones importantes en nuestros métodos: primero, diferentes condiciones comparten el mismo codificador de condiciones, lo que hace que la red sea más simple y liviana. esto es diferente a otros métodos convencionales como T2I o UniControlNet. En segundo lugar, agregamos una capa de transformador para intercambiar la información de la imagen original y las imágenes de condición, en lugar de usar la salida del transformador directamente, la usamos para predecir un sesgo de condición en la característica de condición original. Esto es algo así como ResNet, y experimentalmente descubrimos que esta configuración puede mejorar obviamente el rendimiento de la red.
El codificador de condición original de ControlNet es una pila de capas de conversión y activaciones de Silu. No cambiamos la arquitectura del codificador, simplemente aumentamos los canales de conversión para obtener un codificador "gordo". Obviamente, esto puede aumentar el rendimiento de la red. La razón es que compartimos el mismo codificador para todas las condiciones de imagen, por lo que requiere que el codificador tenga una mayor capacidad de representación. La configuración original será buena para una sola condición, pero no tan buena para más de 10 condiciones. Tenga en cuenta que usar la configuración original también está bien, solo que sacrificando un poco la calidad de generación de imágenes.
El entrenamiento con una sola condición puede estar limitado por la diversidad de datos. Por ejemplo, openpose requiere que entrenes con imágenes con personas y mlsd requiere que entrenes con imágenes con líneas, por lo que puede afectar el rendimiento al generar objetos invisibles. Además, la dificultad de entrenar diferentes condiciones es diferente, es complicado lograr que todas las condiciones converjan al mismo tiempo y alcanzar el mejor rendimiento de cada condición. Finalmente, tenderemos a utilizar dos o más condiciones al mismo tiempo, el entrenamiento de múltiples condiciones hará que la fusión de diferentes condiciones sea más fluida y aumentará la solidez de la red (ya que una sola condición aprende un conocimiento limitado). Proponemos una etapa de entrenamiento unificada para realizar la convergencia óptima de una sola condición y la fusión de múltiples condiciones al mismo tiempo.
ControlNet++ requiere pasar una identificación de tipo de control a la red. Fusionamos los más de 10 controles en 6 tipos de control, el significado de cada tipo es el siguiente:
0 - posición abierta
1 - profundidad
2 -- línea gruesa (scribble/hed/softedge/ted-512)
3-línea delgada (canny/mlsd/lineart/animelineart/ted-1280)
4-normal
5 - segmento
Recomendamos una versión de Python >= 3.8, puede configurar el entorno virtual usando el siguiente comando:
conda crear -n controlplus python=3.8 conda activar control plus instalación de pip -r requisitos.txt
El peso del modelo lo descargas en https://huggingface.co/xinsir/controlnet-union-sdxl-1.0. Cualquier lanzamiento de nuevo modelo se publicará en Huggingface. Puede seguir https://huggingface.co/xinsir para obtener la información más reciente sobre el modelo.
Proporcionamos scripts de inferencia para cada condición de control. Consúltelo para obtener más detalles.
Existe alguna diferencia en el preproceso. Para obtener el mejor rendimiento de openpose-control, haga lo siguiente: Busque util.py en el paquete controlnet_aux, reemplace la función draw_bodypose con el siguiente código
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ Dibuja puntos clave y extremidades que representan la pose del cuerpo en un lienzo determinado. Args: canvas (np.ndarray): una matriz numpy en 3D que representa el lienzo (imagen) en el que se dibujarán los puntos clave del cuerpo (Lista[Punto clave]): una lista de objetos Keypoint que representan los puntos clave del cuerpo que se van a dibujar. np.ndarray: una matriz numpy 3D que representa el lienzo modificado con la pose del cuerpo dibujado. Nota: la función espera que las coordenadas xey de los puntos clave estén normalizadas entre 0 y 1. """ H, W, C = lienzo. forma si max(W, H) < 500: ratio = 1,0 elif max(W, H) >= 500 y max(W, H) < 1000: ratio = 2,0 elif max(W, H) >= 1000 y max(W , H) < 2000: relación = 3,0 elif max(W, H) >= 2000 y max(W, H) < 3000: ratio = 4,0 elif max(W, H) >= 3000 y max(W, H) < 4000: ratio = 5,0 elif max(W, H) >= 4000 y max(W, H) < 5000: ratio = 6,0 else : relación = 7,0 ancho del palo = 4 limbSeq = [ [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], ] colores = [[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]] para (k1_index, k2_index), color en zip(limbSeq, colores): keypoint1 = puntos clave[k1_index - 1] punto clave2 = puntos clave[k2_index - 1] si keypoint1 es Ninguno o keypoint2 es Ninguno: continuar Y = np.array([keypoint1.x, keypoint2.x]) * float(W) X = np.array([keypoint1.y, keypoint2.y]) * float(H ) mX = np.media(X) mY = np.media(Y) longitud = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0.5 ángulo = math.grados(math.atan2(X[0] - X[1], Y[0] - Y[1])) polígono = cv2.ellipse2Poly(( int(mY), int(mX)), (int(longitud / 2), int(ancho del palo * relación)), int(ángulo), 0, 360, 1) cv2.fillConvexPoly(canvas, polígono, [int(float(c) * 0.6) for c in color]) para punto clave, color en zip(puntos clave, colores): si el punto clave es Ninguno: continuar x, y = keypoint.x, keypoint.y x = int(x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * ratio), color, espesor = -1) lienzo de retorno
Para la inferencia de una sola condición, debe proporcionar un mensaje y una imagen de control, cambiar las líneas correspondientes en el archivo Python.
Python controlnet_union_test_openpose.py
Para la inferencia de múltiples condiciones, debe asegurarse de que su entrada image_list sea compatible con su control_type, por ejemplo, si desea usar openpose y control de profundidad, image_list --> [controlnet_img_pose, controlnet_img_ Depth, 0, 0, 0, 0], control_type -- > [1, 1, 0, 0, 0, 0]. Consulte controlnet_union_test_multi_control.py para obtener más detalles.
En teoría, no es necesario establecer la escala de condiciones para diferentes condiciones; la red está diseñada y entrenada para fusionar diferentes condiciones de forma natural. La configuración predeterminada es 1,0 para cada entrada de condición y es lo mismo con el entrenamiento de múltiples condiciones. Sin embargo, si desea aumentar el efecto de alguna condición de entrada determinada, puede ajustar las escalas de condición en el Módulo transformador de condición. En ese módulo, las condiciones de entrada se agregarán a las características de la imagen de origen junto con la predicción del sesgo. multiplicarlo con una escala determinada afectará mucho (pero puede causar algún resultado desconocido).
Python controlnet_union_test_multi_control.py