우리는 텍스트-이미지 생성 조건에서 10개 이상의 제어 유형을 지원할 수 있고 midjourney와 시각적으로 비교할 수 있는 고해상도 이미지를 생성할 수 있는 새로운 아키텍처를 설계합니다 . 네트워크는 원본 ControlNet 아키텍처를 기반으로 하며 다음과 같은 두 가지 새로운 모듈을 제안합니다. 1 동일한 네트워크 매개변수를 사용하여 다양한 이미지 조건을 지원하도록 원본 ControlNet을 확장합니다. 2 계산 오프로드를 늘리지 않고 여러 조건 입력을 지원합니다. 이는 이미지를 자세히 편집하려는 설계자에게 특히 중요합니다. 다양한 조건은 추가 계산이나 매개변수를 추가하지 않고 동일한 조건 인코더를 사용합니다. 우리는 SDXL에 대한 철저한 실험을 통해 제어 능력과 미적 점수 모두에서 우수한 성능을 달성합니다. 누구나 즐길 수 있도록 방법과 모델을 오픈소스 커뮤니티에 공개합니다.
도움이 되셨다면 별표 부탁드립니다. 정말 감사합니다!!
SDXL ProMax 버전이 출시되었습니다!!!, 즐겨보세요!!!
프로젝트의 수익과 지출의 균형을 맞추기 어렵기 때문에 GPU 리소스는 수익성이 더 높은 다른 프로젝트에 할당되고, 충분한 GPU 지원을 찾을 때까지 SD3 교육이 중단됩니다. 훈련을 계속하려면 GPU를 찾으세요. 이로 인해 불편을 드린 점 진심으로 사과드립니다. 이 프로젝트를 좋아해 주시는 모든 분들께 감사드리고 싶습니다. 여러분의 지원이 제가 계속 나아갈 수 있게 해주는 원동력입니다.
참고: 동일한 Huggingface 모델 저장소에 promax 접미사가 붙은 promax 모델을 넣었습니다. 자세한 지침은 나중에 추가됩니다.
다음 예는 1M 해상도 --> 9M 해상도를 보여줍니다.
Novai와 같은 버킷 트레이닝을 사용하면 모든 종횡비의 고해상도 이미지를 생성할 수 있습니다.
대량의 고품질 데이터(10000000개 이상의 이미지)를 사용하며 데이터세트는 다양한 상황을 포괄합니다.
DALLE.3과 같이 다시 캡션된 프롬프트를 사용하고, CogVLM을 사용하여 자세한 설명을 생성하고, 프롬프트를 따라가는 능력이 좋습니다.
훈련 중에 많은 유용한 트릭을 사용하십시오. 날짜 확대, 다중 손실, 다중 해상도를 포함하되 이에 국한되지 않습니다.
원래 ControlNet과 비교하여 거의 동일한 매개변수를 사용합니다. 네트워크 매개변수나 계산이 눈에 띄게 증가하지 않습니다.
10개 이상의 제어 조건을 지원하며, 독립적으로 훈련하는 것과 비교하여 단일 조건에서 뚜렷한 성능 저하가 없습니다.
다중 조건 생성을 지원하고 훈련 중에 조건 융합을 학습합니다. 하이퍼파라미터나 디자인 프롬프트를 설정할 필요가 없습니다.
BluePencilXL, CounterfeitXL과 같은 다른 오픈소스 SDXL 모델과 호환됩니다. 다른 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
[2024/07/06] ControlNet++
및 사전 훈련된 모델 출시.
[2024/07/06] 추론 코드(단일 조건 및 다중 조건)를 출시합니다.
[2024년 7월 13일] 고급 편집 기능을 갖춘 ProMax ControlNet++
출시.
그라디오용 ControlNet++
Comfyui용 ControlNet++
훈련 코드와 훈련 지침을 공개합니다.
arxiv 논문을 발표하세요.
가장 중요한 컨트롤넷 모델 중 하나인 우리는 이 모델을 훈련하는 데 많은 트릭을 사용하며 이는 포즈 제어의 SOTA 성능인 https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0과 동일합니다. openpose 모델이 최고의 성능을 발휘하게 하려면 controlnet_aux 패키지의 draw_pose 함수를 바꿔야 합니다(comfyui에는 자체 controlnet_aux 패키지가 있습니다). 자세한 내용은 추론 스크립트를 참조하세요.
가장 중요한 컨트롤넷 모델 중 하나인 canny는 Lineart, Anime Lineart, mlsd를 사용한 혼합 교육입니다. 가는 선을 처리할 때 강력한 성능을 발휘하는 모델은 변형률을 줄이는 열쇠입니다. 손/발을 다시 그리는 데 가는 선을 사용하는 것이 좋습니다.
가장 중요한 컨트롤넷 모델 중 하나인 낙서 모델은 모든 선 너비와 선 유형을 지원할 수 있습니다. https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0과 마찬가지로 모든 사람을 소울 화가로 만드십시오.
참고: 포즈 뼈대를 사용하여 인간의 포즈를 제어하고 얇은 선을 사용하여 변형을 방지하기 위해 손/발 세부 사항을 그립니다.
참고: 깊이 이미지에는 세부 정보가 포함되어 있습니다. 배경에는 깊이를 사용하고 전경에는 포즈 뼈대를 사용하는 것이 좋습니다.
참고: Scribble은 강력한 선 모델입니다. 윤곽이 엄격하지 않은 것을 그리려는 경우 이를 사용할 수 있습니다. Openpose + Scribble을 사용하면 초기 이미지를 더 자유롭게 생성할 수 있으며 가는 선을 사용하여 세부 사항을 편집할 수 있습니다.
우리는 고품질의 이미지를 대량으로 수집합니다. 이미지는 진지하게 필터링되고 주석이 추가되며, 이미지는 사진, 애니메이션, 자연, 여행 중기 등을 포함한 광범위한 주제를 다룹니다.
우리는 각각 Condition Transformer와 Control Encoder라는 두 개의 새로운 ControlNet++ 모듈을 제안합니다. 표현 능력을 향상시키기 위해 이전 모듈을 약간 수정했습니다. 또한, 단일 및 다중 제어를 한 단계에서 실현할 수 있는 통일된 훈련 전략을 제안합니다.
각 조건에 대해 제어 유형 ID를 할당합니다(예: openpose--(1, 0, 0, 0, 0, 0), 깊이--(0, 1, 0, 0, 0, 0), 다중 조건은 (openpose, 깊이) --(1, 1, 0, 0, 0, 0)과 같습니다. 컨트롤 인코더에서 컨트롤 유형 ID는 컨트롤 유형 임베딩(정현파 위치 임베딩 사용)으로 변환된 다음 단일 선형 레이어를 사용하여 컨트롤 유형 임베딩이 시간 임베딩과 동일한 밝기를 갖도록 프로젝션합니다. 제어 유형 기능은 다양한 제어 유형을 나타내기 위해 시간 임베딩에 추가됩니다. 이 간단한 설정은 시간 임베딩이 전체 네트워크에 전역적으로 영향을 미치는 경향이 있기 때문에 ControlNet이 다양한 제어 유형을 구별하는 데 도움이 될 수 있습니다. 단일 조건이든 다중 조건이든 그에 해당하는 고유한 제어 유형 ID가 있습니다.
우리는 동일한 네트워크를 사용하여 동시에 여러 제어 입력을 지원하도록 ControlNet을 확장합니다. 조건 변환기는 다양한 이미지 조건 기능을 결합하는 데 사용됩니다. 우리의 방법에는 두 가지 주요 혁신이 있습니다. 첫째, 서로 다른 조건이 동일한 조건 인코더를 공유하여 네트워크를 더 간단하고 가볍게 만듭니다. 이는 T2I 또는 UniControlNet과 같은 다른 주류 방법과 다릅니다. 둘째, 원본 이미지와 조건 이미지의 정보를 교환하기 위해 변환기 레이어를 추가하고, 변환기의 출력을 직접 사용하는 대신 이를 사용하여 원본 조건 특성에 대한 조건 바이어스를 예측합니다. 이는 ResNet과 다소 유사하며 실험적으로 이 설정이 네트워크 성능을 분명히 향상시킬 수 있음을 발견했습니다.
ControlNet의 원래 조건 인코더는 변환 레이어와 Silu 활성화의 스택입니다. 우리는 인코더 아키텍처를 변경하지 않고 단지 "뚱뚱한" 인코더를 얻기 위해 전환 채널을 늘립니다. 이는 분명히 네트워크 성능을 향상시킬 수 있습니다. 그 이유는 모든 이미지 조건에 대해 동일한 인코더를 공유하므로 인코더의 표현 능력이 더 높아야 하기 때문입니다. 원래 설정은 단일 조건에는 적합하지만 10개 이상의 조건에는 좋지 않습니다. 이미지 생성 품질이 약간 희생된다는 점을 제외하면 원래 설정을 사용해도 괜찮습니다.
단일 조건을 사용한 훈련은 데이터 다양성으로 인해 제한될 수 있습니다. 예를 들어, openpose에서는 사람이 있는 이미지로 훈련해야 하고 mlsd에서는 선이 있는 이미지로 훈련해야 하므로 보이지 않는 개체를 생성할 때 성능에 영향을 미칠 수 있습니다. 게다가, 다양한 조건을 훈련하는 난이도는 다르며, 모든 조건을 동시에 수렴하고 각 단일 조건의 최고 성능에 도달하는 것은 까다롭습니다. 마지막으로, 우리는 동시에 두 개 이상의 조건을 사용하는 경향이 있습니다. 다중 조건 훈련은 서로 다른 조건의 융합을 보다 원활하게 만들고 네트워크의 견고성을 증가시킵니다(단일 조건이 제한된 지식을 학습하므로). 단일 조건 최적화 수렴과 다중 조건 융합을 동시에 실현하기 위한 통합 학습 단계를 제안합니다.
ControlNet++는 컨트롤 유형 ID를 네트워크에 전달해야 합니다. 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 콘다 활성화 컨트롤 플러스 pip 설치 -r 요구사항.txt
https://huggingface.co/xinsir/controlnet-union-sdxl-1.0에서 모델 가중치를 다운로드합니다. 새로운 모델 출시는 Huggingface에 게시됩니다. https://huggingface.co/xinsir를 팔로우하면 최신 모델 정보를 얻을 수 있습니다.
각 제어 조건에 대한 추론 스크립트를 제공합니다. 자세한 내용은 참고하시기 바랍니다.
최고의 openpose-control 성능을 얻으려면 다음을 수행하십시오. controlnet_aux 패키지에서 util.py를 찾고 draw_bodypose 함수를 다음 코드로 바꾸십시오.
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ 주어진 캔버스에 신체 포즈를 나타내는 키포인트와 팔다리를 그립니다. Args: canvas (np.ndarray): 3D numpy 배열 신체 포즈를 그릴 캔버스(이미지)를 나타냅니다. (List[Keypoint]): 그려야 할 신체 키포인트를 나타내는 Keypoint 객체 목록입니다. 반환: np.ndarray: 그려진 신체 포즈로 수정된 캔버스를 나타내는 3D numpy 배열 참고: 이 함수는 키포인트의 x 및 y 좌표가 0과 1 사이에서 정규화될 것으로 예상합니다. """ H, W, C = 캔버스.모양 if max(W, H) < 500: ratio = 1.0 elif max(W, H) >= 500 and max(W, H) < 1000: ratio = 2.0 elif max(W, H) >= 1000 and 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 else: 비율 = 7.0 스틱 폭 = 4 armSeq = [ [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]] for (k1_index, k2_index), color in zip(limbSeq, colors): keypoint1 = keypoints[k1_index - 1] keypoint2 = keypoints[k2_index - 1] keypoint1이 다음인 경우 None 또는 keypoint2가 없음: 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.degrees(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(캔버스, 다각형, [int(float(c) * 0.6) for c in color]) for keypoint, color in zip(keypoints, colors): 키포인트가 없음인 경우: 계속 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, Thickness=-1) 반환 캔버스
단일 조건 추론의 경우 프롬프트와 제어 이미지를 제공하고 Python 파일에서 해당 줄을 변경해야 합니다.
파이썬 controlnet_union_test_openpose.py
다중 조건 추론의 경우 입력 image_list가 control_type과 호환되는지 확인해야 합니다. 예를 들어 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이며 다중 조건 훈련에서도 동일합니다. 그러나 일부 특정 입력 조건에 대한 영향을 높이려면 Condition Transformer Module에서 조건 규모를 조정할 수 있습니다. 해당 모듈에서는 편향 예측과 함께 입력 조건이 소스 이미지 기능에 추가됩니다. 특정 규모로 곱하면 많은 영향을 미칩니다(그러나 알려지지 않은 결과가 발생할 수 있습니다).
파이썬 controlnet_union_test_multi_control.py