Projetamos uma nova arquitetura que pode suportar mais de 10 tipos de controle na geração de texto para imagem e pode gerar imagens de alta resolução visualmente comparáveis com midjourney . A rede é baseada na arquitetura ControlNet original, propomos dois novos módulos para: 1 Estender o ControlNet original para suportar diferentes condições de imagem usando o mesmo parâmetro de rede. 2 Suporta entrada de múltiplas condições sem aumentar a carga de cálculo, o que é especialmente importante para designers que desejam editar imagens em detalhes. Diferentes condições usam o mesmo codificador de condição, sem adicionar cálculos ou parâmetros extras. Fazemos experimentos exaustivos em SDXL e alcançamos desempenho superior tanto em capacidade de controle quanto em pontuação estética. Liberamos o método e o modelo para a comunidade de código aberto para que todos possam aproveitá-los.
Se você achar útil, por favor me dê uma estrela, muito obrigado!!
A versão SDXL ProMax foi lançada!!!,Aproveite!!!
Lamento que as receitas e despesas do projeto sejam difíceis de equilibrar, os recursos da GPU sejam atribuídos a outros projetos com maior probabilidade de serem lucrativos, o treinamento do SD3 seja interrompido até que eu encontre suporte de GPU suficiente, tentarei o meu melhor para encontre GPUs para continuar treinando. Se isso lhe trouxer transtornos, peço sinceras desculpas por isso. Quero agradecer a todos que curtem esse projeto, o apoio de vocês é o que me faz continuar
Nota: colocamos o modelo promax com um sufixo promax no mesmo repositório do modelo huggingface, instruções detalhadas serão adicionadas posteriormente.
O exemplo a seguir mostra resolução de 1M -> resolução de 9M
Use o treinamento de balde como novelai, pode gerar imagens de alta resolução em qualquer proporção de aspecto
Use grande quantidade de dados de alta qualidade (mais de 1.000.000 de imagens), o conjunto de dados cobre uma diversidade de situações
Use prompt re-legendado como DALLE.3, use CogVLM para gerar uma descrição detalhada, boa capacidade de seguimento de prompt
Use muitos truques úteis durante o treinamento. Incluindo, entre outros, aumento de data, perda múltipla, resolução múltipla
Use quase o mesmo parâmetro comparado ao ControlNet original. Nenhum aumento óbvio nos parâmetros de rede ou computação.
Suporta mais de 10 condições de controle, sem queda óbvia de desempenho em qualquer condição em comparação com o treinamento independente
Suporta geração de múltiplas condições, a fusão de condições é aprendida durante o treinamento. Não há necessidade de definir hiperparâmetros ou prompts de design.
Compatível com outros modelos SDXL de código aberto, como BluePencilXL, CounterfeitXL. Compatível com outros 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
[07/06/2024] Lançamento ControlNet++
e modelos pré-treinados.
[07/06/2024] Liberar código de inferência (condição única e condição múltipla).
[13/07/2024] Lançamento ProMax ControlNet++
com função de edição avançada.
ControlNet++ para rádio
ControlNet++ para Comfyui
liberar código de treinamento e orientação de treinamento.
libere o papel arxiv.
Um dos modelos de rede de controle mais importantes, usamos muitos truques no treinamento desse modelo, tão bom quanto https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0, desempenho SOTA no controle de pose. Para fazer com que o modelo openpose alcance seu melhor desempenho, você deve substituir a função draw_pose no pacote controlnet_aux (comfyui tem seu próprio pacote controlnet_aux), consulte os Scripts de Inferência para detalhes.
Um dos modelos de controlnet mais importantes, o astuto é o treinamento misto com lineart, anime lineart, mlsd. Desempenho robusto para lidar com quaisquer linhas finas, o modelo é a chave para diminuir a taxa de deformidade, recomenda-se usar linha fina para redesenhar a mão/pé.
Um dos modelos de rede de controle mais importantes, o modelo de rabisco pode suportar qualquer largura e tipo de linha. tão bom quanto https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0, faça de todos um pintor de almas.
Nota: use o esqueleto da pose para controlar a pose humana, use uma linha fina para desenhar os detalhes das mãos/pés para evitar deformidades
Nota: a imagem de profundidade contém informações detalhadas, é recomendado usar profundidade para o fundo e usar esqueleto de pose para o primeiro plano
Nota: Rabisco é um modelo de linha forte, se você quiser desenhar algo sem contorno rígido, você pode usá-lo. Openpose + Scribble oferece mais liberdade para gerar sua imagem inicial, então você pode usar uma linha fina para editar os detalhes.
Coletamos uma grande quantidade de imagens de alta qualidade. As imagens são filtradas e anotadas com seriedade, as imagens cobrem uma ampla gama de assuntos, incluindo fotografia, anime, natureza, meio de viagem e assim por diante.
Propomos dois novos módulos no ControlNet++, denominados Condition Transformer e Control Encoder, respectivamente. Modificamos ligeiramente um módulo antigo para melhorar sua capacidade de representação. Além disso, propomos uma estratégia de treinamento unificada para realizar controle único e múltiplo em um único estágio.
Para cada condição, atribuímos a ela um tipo de controle id, por exemplo, openpose--(1, 0, 0, 0, 0, 0), profundidade--(0, 1, 0, 0, 0, 0), múltiplas condições serão como (openpose, profundidade) --(1, 1, 0, 0, 0, 0). No codificador de controle, o ID do tipo de controle será convertido em embeddings de tipo de controle (usando embeddings posicionais senoidais), então usamos uma única camada linear para projetar os embeddings do tipo de controle para que tenham o mesmo dim com a incorporação de tempo. Os recursos de tipo de controle são adicionados à incorporação de tempo para indicar diferentes tipos de controle. Esta configuração simples pode ajudar o ControlNet a distinguir diferentes tipos de controle, pois a incorporação de tempo tende a ter um efeito global em toda a rede. Não importa condição única ou condição múltipla, existe um ID de tipo de controle exclusivo correspondente a ela.
Estendemos o ControlNet para suportar múltiplas entradas de controle ao mesmo tempo usando a mesma rede. O transformador de condição é usado para combinar diferentes recursos de condição de imagem. Existem duas grandes inovações em nossos métodos: primeiro, diferentes condições compartilham o mesmo codificador de condição, o que torna a rede mais simples e leve. isso é diferente de outros métodos convencionais, como T2I ou UniControlNet. Em segundo lugar, adicionamos uma camada de transformador para trocar as informações da imagem original e das imagens de condição. Em vez de usar a saída do transformador diretamente, usamos-a para prever um viés de condição para o recurso de condição original. Isso é parecido com o ResNet, e descobrimos experimentalmente que essa configuração pode melhorar o desempenho da rede, obviamente.
O codificador de condição original do ControlNet é uma pilha de camadas conv e ativações Silu. Não alteramos a arquitetura do codificador, apenas aumentamos os canais conv para obter um codificador "gordo". Obviamente, isso pode aumentar o desempenho da rede. A razão é que compartilhamos o mesmo codificador para todas as condições de imagem, portanto, é necessário que o codificador tenha maior capacidade de representação. A configuração original será boa para condições únicas, mas não tão boa para mais de 10 condições. Observe que usar a configuração original também é aceitável, apenas com algum sacrifício na qualidade de geração de imagem.
O treinamento com uma única condição pode ser limitado pela diversidade de dados. Por exemplo, openpose exige que você treine com imagens com pessoas e mlsd exige que você treine com imagens com linhas, podendo afetar o desempenho ao gerar objetos invisíveis. Além disso, a dificuldade de treinar diferentes condições é diferente, é complicado fazer com que todas as condições convirjam ao mesmo tempo e alcançar o melhor desempenho de cada condição. Finalmente, tenderemos a usar duas ou mais condições ao mesmo tempo, o treinamento multicondições tornará a fusão de diferentes condições mais suave e aumentará a robustez da rede (já que uma condição única aprende conhecimento limitado). Propomos um estágio de treinamento unificado para realizar a convergência ideal de condição única e a fusão de múltiplas condições ao mesmo tempo.
ControlNet++ requer a passagem de um ID de tipo de controle para a rede. Mesclamos o controle 10+ em 6 tipos de controle, o significado de cada tipo é o seguinte:
0 -- abertura
1 – profundidade
2 - linha grossa (rabisco/hed/softedge/ted-512)
3 - linha fina (canny/mlsd/lineart/animelineart/ted-1280)
4 – normais
5 – segmento
Recomendamos uma versão python >= 3.8, você pode configurar o ambiente virtual usando o seguinte comando:
conda criar -n controlplus python=3.8 conda ativar controlplus pip instalar -r requisitos.txt
Você baixa o peso do modelo em https://huggingface.co/xinsir/controlnet-union-sdxl-1.0. Qualquer lançamento de novo modelo será colocado no huggingface, você pode seguir https://huggingface.co/xinsir para obter as informações do modelo mais recente.
Fornecemos scripts de inferência para cada condição de controle. Consulte-o para obter mais detalhes.
Existe alguma diferença de pré-processamento, para obter o melhor desempenho do openpose-control, faça o seguinte: Encontre o util.py no pacote controlnet_aux, substitua a função draw_bodypose pelo seguinte código
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ Desenha pontos-chave e membros representando a pose do corpo em uma determinada tela. Args: canvas (np.ndarray): Uma matriz numpy 3D representando a tela (imagem) na qual desenhar os pontos-chave do corpo (List[Keypoint]): Uma lista de objetos Keypoint que representam os pontos-chave do corpo a serem desenhados. np.ndarray: Uma matriz numpy 3D que representa a tela modificada com a pose do corpo desenhado. Nota: A função espera que as coordenadas xey dos pontos-chave sejam normalizadas entre 0 e 1. """ H, W, C = canvas. forma se max(W, H) < 500: razão = 1,0 elif max(W, H) >= 500 e max(W, H) < 1000: razão = 2,0 elif max(W, H) >= 1000 e max(W , H) < 2000: razão = 3,0 elif max(W, H) >= 2000 e max(W, H) < 3000: proporção = 4,0 elif max(W, H) >= 3000 e max(W, H) < 4000: proporção = 5,0 elif max(W, H) >= 4000 e max(W, H) < 5000: proporção = 6,0 senão: proporção = 7,0 largura do bastão = 4 membrosSeq = [ [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], ] cores = [[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), cor em zip (limbSeq, cores): keypoint1 = pontos-chave[k1_index - 1] ponto-chave2 = pontos-chave[k2_index - 1] se ponto-chave1 for Nenhum ou keypoint2 é Nenhum: 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) comprimento = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0,5 ângulo = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) polígono = cv2.ellipse2Poly((int(mY), int(mX)), (int(comprimento/2), int(largura do bastão * proporção)), int(ângulo), 0, 360, 1) cv2.fillConvexPoly(canvas, polígono, [int(float(c) * 0.6) for c in color]) para ponto-chave, cor em zip(pontos-chave, cores): se o ponto-chave for Nenhum: continue x, y = ponto-chave.x, ponto-chave.y x = int(x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * proporção), cor, espessura=-1) retornar tela
Para inferência de condição única, você deve fornecer um prompt e uma imagem de controle, alterar as linhas correspondentes no arquivo python.
python controlnet_union_test_openpose.py
Para inferência de múltiplas condições, você deve garantir que sua entrada image_list seja compatível com seu control_type, por exemplo, se quiser usar openpose e controle de profundidade, image_list --> [controlnet_img_pose, controlnet_img_profundidade, 0, 0, 0, 0], control_type -- > [1, 1, 0, 0, 0, 0]. Consulte controlnet_union_test_multi_control.py para obter mais detalhes.
Em teoria, você não precisa definir a escala de condições para diferentes condições; a rede é projetada e treinada para fundir diferentes condições naturalmente. A configuração padrão é 1,0 para cada entrada de condição e é a mesma com o treinamento multicondição. No entanto, se quiser aumentar o efeito para alguma determinada condição de entrada, você pode ajustar as escalas de condição no Módulo Transformador de Condição. Nesse módulo, as condições de entrada serão adicionadas aos recursos da imagem de origem junto com a previsão de polarização. multiplicá-lo por uma determinada escala afetará muito (mas pode causar algum resultado desconhecido).
python controlnet_union_test_multi_control.py