AI 이미지/AUTOMATIC1111

Stable Diffusion - 콘트롤넷(ControlNet) 1.1 사용방법(1)

하늘이푸른오늘 2023. 7. 3. 00:49

ControlNet을 사용하여 자세를 모사한 이미지
ControlNet을 사용하여 자세를 모사한 이미지

콘트롤넷(ControlNet)은 구도와 피사체의 자세를 복제할 수 있는 신경망입니다.  콘트롤넷에 관한 자세한 이론은 Lvmin Zhang 등이 저술한 Adding Conditional Control to Text-to-Image Diffusion Models를 참고하시기 바랍니다.

스테이블 디퓨전을 조금이라도 써보신 분은 아시겠지만, 생성되는 이미지가 원하는 자세를 갖도록 하는 것은 거의 불가능합니다. 자세 뿐만 아니라 배경이나 인물까지도 모두 무작위로 생성되기 때문입니다. 해결 방법은 그저 이미지를 많이 생성하는 것 뿐이었습니다.

ControlNet을 사용하면 이런 문제를 어느 정도 해결할 수 있습니다. ControlNet을 사용하면 파사체를 어디에 둘지, 어떤 모습을 가지게 할지 등을 정확하게 제어할 수 있습니다. 이 글에서는  콘트롤넷(ControlNet)이 무엇인지 알아보고, 설치방법, AUTOMATIC1111에서의 사용법, 설정 방법 등에 대해 알아보겠습니다. 더 자세한 콘트롤넷 모델의 종류 및 특성, 그리고 적용사례 등은 콘트롤넷 사용방법(2)에 별도로 정리했으니 이 글을 참고하시기 바랍니다.

갱신 : 2023년 12월 11일 Image Prompt  콘트롤넷
갱신 : 2023년 10월 1일, SDXL용 콘트롤넷
갱신 : 2023년 9월 ContorlNet 1.1 반영 수정

이 글의 목차는 아래와 같습니다.

콘트롤넷이란?

콘트롤넷은 스테이블 디퓨전 모델 을 제어하기 위한 신경망 모델로서, 단독으로는 사용할 수 없고, 다른 스테이블 디퓨전 모델과 함께 사용해야 합니다. 

스테이블 디퓨전에서 가장 기본적인 형태는 text-to-image, 즉 텍스트 프롬프트(prompt)를 조건부여(conditioning)로서 입력하면, 이를 바탕으로 이미지를 생성하는 것입니다. ControlNet은 조건부여를 하나 더 추가합니다. ControlNet에도 매우 많은 종류 존재하지만, 여기에서는 인체 자세 감지를 예를 들어 보이겠습니다.

콘트롤넷에서 인체의 자세를 감지하는 모델로는 Openpose 가 있습니다. 이 모델은 손, 발, 머리 등의 위치와 같은 인간의 자세를 추출하는 빠른 키포인트(keypoint) 감지 모델입니다.

Openpose를 통한 인체감지
Openpose를 통한 인체감지

아래는 Openpose를 이용한 ControlNet 작업흐름입니다. Openpose는 입력된 이미지로 부터 키포인트를 추출하고, 이 키포인트의 위치를 포함하는 제어 맵(control map)으로 저정합니다. 이 제어 맵이 Stable Diffusion에 전달되어 텍스트 프롬프트와 함께 추가적인 조건부여로 사용됩니다. 이미지는 이처럼 두가지(텍스트 프롬프트와 콘트롤넷) 조건부여에 기초하여 생성됩니다.

Stable Diffusion - Openpose 를 이용한 ControlNet
Stable Diffusion - Openpose 를 이용한 ControlNet

ControlNet은 학습 가능한 네트워크 모듈을 Stable Diffusion 모델의 핵심인 U-Net(잡음 예측기)의 여기 저기에 부착하는 방식으로 작동합니다. Stabel Diffusion 모델의 가중치는 훈련중 변경되지 않도록 고정됩니다. 학습 중에는 오직 부착된 모듈만 수정됩니다.

아래 그림은 연구 논문에서 가져온 것으로, 먼저, 부착된 네트워크 모듈의 가중치는 모두 0이므로, 새 모델은 학습되어 잠긴 모델을 활용할 수 있습니다.

ControlNet작동원리

학습중에는 학습용 이미지와 함께 두개의 조건부여(conditioning)가 공급됩니다. 첫번째는 텍스트 프롬프트, 두번째는 Openpose 키포인트나 Canny외곽선과 같은 전처리 자료입니다. 이런 방식으로 이들 두 가지 입력에 기초한 이미지를 생성하도록 학습할 수 있습니다. 이때, 각각의 전처리별 방법은 독립적으로 학습받게 됩니다.

... 라고 하는데, 잘 이해는 안되네요. 아무튼 그림에서 왼쪽은 ControlNet이 없을때이고, 오른쪽은 ControlNet이 있을 때의 작동 방식인가 봅니다.

Stable Diffusion ControlNet 설치 방법

ControlNet 확장은 두가지 방법으로 설치가 가능합니다. ControlNet의 git 저장소 URL을 사용한 방법과, AUTOMATIC1111 의 기본 기능으로 설치하는 방법이 있습니다.

1) ControlNet git 저장소 URL로 설치하는 방법

    • AUTOMATIC1111 을 실행하고 Extensions 페이지로 들어갑니다.
    • Install from URL 탭을 엽니다.
    • 다음으로 아래의 URL을 "URL for extension's git repository"란에 입력합니다.

  • 이제 [Install] 버튼을 누르면 설치가 시작됩니다. 설치가 완료되었다는 메시지가 나올때까지 기다립니다.
  • Installed 탭으로 들어가면 방금 설치한 sd-webui-controlnet이 설치되었음을 확인할 수 있습니다. 이제  [Apply and restart UI] 라는 버튼을 누르면 UI이 다시 시작됩니다. 이렇게 되면 설치는 완료된 것입니다. 혹시 그래도 잘 안된다 싶으면, AUTOMATIC1111이 실행된 명령 프롬프트(cmd)창을 끄고 다시 시작하면 됩니다.

2) AUTOMATIC1111의 기본 기능으로 설치하는 방법

윈도에 AUTOMATIC1111  GUI를 설치 하였을 경우, ControlNet은 쉽게 설치할 수 있습니다. (구글 Colab 및 맥의 경우는 설명하지 않습니다. 필요하시면 원본 글을 읽어보세요. ) 먼저 Extension 탭으로가서 그 아래에 있는 Avalable 탭을 설치하고 [Load from] 버튼을 누르면 됩니다.

ControlNet 확장 설치 1
ControlNet 확장 설치 1

여러가지 확장이 나열되는데, 여기에서 sd-webui-controlnet-mainpulations 을 찾아, 맨 오른쪽에 있는 [Install] 버튼을 누릅니다. 잠시  Installing... 에서 사라질 때까지 기다린 후.....

ControlNet 확장 설치 2
ControlNet 확장 설치 2

Installed 탭으로 들어가면 방금 설치한 sd-webui-controlnet이 설치되었음을 확인할 수 있습니다. 이제  [Apply and restart UI] 라는 버튼을 누르면 UI이 다시 시작됩니다. 이렇게 되면 설치는 완료된 것입니다. 

ControlNet 확장 설치 3
ControlNet 확장 설치 3

ControlNet 모델 설치

ControlNet을 사용하려면, 위에서 설명한 전처리기(preprocessor)외에도 이를 처리할 수 있는 모델이 별도로 필요합니다. 모델 파일은 lllyasviel/ControlNet-v1-1 at main 에 들어가면 있습니다. 아래에서 .pth 파일들을 넣어주면 됩니다. 모두 다운로드 받아도 되고, 위에 열거한 많이 사용되는 모듈만 다운로드 받아도 됩니다. 

다운 받으실 때에는 아래 동그라미 쳐둔 부분에 화살표나 LFS라고 적힌 단추를 클릭하면 다운 받을 수 있습니다. 다운로드 받아서 넣어줄 위치는 아래와 같습니다. 이 두가지 폴더 중 어디에 넣어도 되지만, 윗쪽 폴더를 추천합니다.이 폴더에 들어가면 이미 같은 이름의 .yaml 파일이 있으니까 .pth만 넣어주시면 됩니다.

stable-diffusion-webui/models/ControlNet
stable-diffusion-webui/extensions/sd-webui-controlnet/models

설치가 완료되면 AUTOMATIC1111 웹UI를 다시 시작합니다. 성공적으로 설치하였을 경우, 아래와 같이 txt2img 탭아래쪽 Seed  입력란 아래에 ControlNet 부분이 보일 것입니다. (여기의 맨 오른쪽에 있는 삼각형을 누르면 메뉴가 확장됩니다.)

ControlNet 확장 설치 4
ControlNet 확장 설치 4

T2I 어댑터 설치

T2I 어댑터(adapter)는 디퓨전 모델의 이미지 생성에 다른 방식의 제어를 제공하기 위한 신경망 모델입니다. 설계는 완전 다른 방식이지만, 개념적으로는 ControlNet과 유사합니다. 

T2I 어댑터 모델
T2I 어댑터 모델

AUTOMATIC1111의 ControlNet 확장은 T2I 어댑터도 사용할 수 있습니다. 모델은 여기 들어가 t2iadapter_xxx.pth 처럼 생긴 파일을 다운로드 받으면 됩니다. 대부분의 T2I 어댑터 기능은 ControlNet 모델과 겹칩니다. 겹치지 않는 것으로는 아래 두 가지가 유용합니다.

  • t2iadapter_color_sd14v1.pth
  • t2iadapter_style_sd14v1.pth

다운로드 받는 폴더는 위의 ControlNet 모델 폴더와 동일합니다.

stable-diffusion-webui/extensions/sd-webui-controlnet/models

그런데, 저는 이 글 전체에서 Color grid T2I adapter 만 사용하고 있습니다. 대부분 중복되기 때문에 이 것만 설치해도 무방할 것 같습니다.

ControlNet extension 업데이트

ControlNet은 매우 빠르게 개발되고 있어, 며칠전에 설치하였더라도 금방 새로운 버전이 나올 수 있습니다. 따라서 콘트롤넷을 사용할 때에는 먼저 새로운 버전이 나와 있는 건 아닌지 확인해보는 것이 좋습니다.

먼저 Extension 페이지의  Intalled 탭에 들어 갑니다. 맨 오른쪽 Update 란을 보면 unknown이라고 표시되어 있습니다. 이제 [Check for updates] 버튼을 누릅니다.

ControlNet 업데이트 확인
ControlNet 업데이트 확인

잠시 후 Update에 있는 항목들이 다시 표시됩니다. 맨 오른쪽에 sd-webui-controlnet에 새로운 commit이 있다고 표시되면...

ControlNet 업데이트 확인
ControlNet 업데이트 확인

[Apply and restart UI]를 눌러주면 AUTOMATIC1111이 새로 불러집니다. 이제 다시 Extentions 탭으로 들어가서 [Check for updates] 버튼을 눌러주면 아래와 같이 모두 최신버전이라고 표시됩니다. 이제 업데이트가 완료된 것입니다.

ControlNet 업데이트 완료
ControlNet 업데이트 완료

ControlNet 사용법 - 간단한 예제

여기에서는 아주 간단한 예를 직접 적용해보면서 ControlNet 사용법을 알아보겠습니다. 

현재 ControlNet이 성공적으로 설치된 상태라면, 아래와 같이 Seed 바로 밑에 아래와 같이 ControlNet 부분이 추가되어 있을 것입니다.

ControlNet 사용예1
ControlNet 사용예1

위의 그림에서 ControlNet 오른쪽에 있는 삼각형을 누르면 아래와 같이 ControlNet 패널이 열립니다. 

ControlNet 입력화면
ControlNet 입력화면

이 절에서는 아래의 그림을 예제로 사용합니다. 필요하시면 우클릭해서 다운로드 받아 사용하시면 됩니다.

예제용 이미지
예제용 이미지

Text-to-Image 설정

ControlNet은 단독으로 사용할 수 없고, 반드시 스테이블 디퓨전 모델과 함께 사용해야 합니다. 따라서 먼저 사용할 모델을 선택해야 합니다. 원래의 v1.5 기본 모델은 v1-5-pruned-emaonly.ckpt 이며, 이를 기반으로 생성된 다른 모델들을 사용해도 무방합니다. 저는 ChilloutMix 를 선택했습니다. (어떤 모델이 좋을지는 이 글을 참고하세요)

다음으로 프롬프트와 부정적 프롬프트를 입력합니다. 예제로 입력하는 내용은 아래와 같습니다. 부정적 프롬프트가 좀 긴데, 왠만한 내용은 다 들어있습니다. 

프롬프트: full-body, a young female, highlights in hair, dancing outside a restaurant, brown eyes, wearing jeans
부정적 프롬프트: disfigured, ugly, bad, immature
이미지 크기: 512x768
샘플링 방법: DPM++ 2M Karras

이상과 같이 설정하면 txt2img탭은 다음과 비슷해질 겁니다.

ContolrNet 사용하기 전 일반적인 txt2img 설정
ContolrNet 사용하기 전 일반적인 txt2img 설정

ControlNet 설정

제일 먼저 해야할 일은 기준이 될 이미지를 올리는 것입니다. 이미지를 끌어다 놓거나 클릭해서 파일을 지정하면 됩니다. 그 다음 Enable이라는 체크박스를 클릭해줍니다. 저는 VRAM이 작은 GPU라서 low VRAM에도 체크해줬고, Preview도 가능하도록 해주었습니다. 아울러... Pixel Perfect라는 체크박스가 있는데, 이것도 켜주시는 게 좋습니다.  아래에서 설명 드리겠습니다.

제일 중요한 것이 제어 유형(Control Type)을 정하는 것입니다. 이번엔 Openpose를 선택합니다. 이렇게 선택하면 아래쪽에 전처리기는 openpose_full, 모델은 control_xxx_openpose로 자동 선택됩니다. 전처리기와 모델 사이에 별 모양의 단추 💥 [Run preprocess]가 있는데, 이걸 누르면 전처리기만 작동되어 입력한 그림 오른쪽에 전처리 결과가 표시됩니다. 아래는 설정 상태입니다. (참고로 그림 윗부분을 보시면 ControlNet Unit 0, Unit 1 등이 있는데, 다중 ControlNet에서 사용합니다.)

ControlNet 설정
ControlNet 설정

이제 이 상태에서 Generate를 눌러주면 프롬프트와 ControlNet을 조건부여(conditioning)로 사용하여  이미지 생성을 시작합니다. 아래는 수행 결과가 나타난 모습입니다. 맨 끝에 있는 건 전처리 결과입니다. 여기에서는 openpose_full을 사용하였으므로, 손발의 자세 및 얼굴까지 표현되어 있습니다.

아래는 생성된 이미지중 일부입니다. 모든 이미지가 입력된 이미지의 자세를 복제하여 생성되었다는 걸 보실 수 있을 겁니다. 

그런데... 보시는 것처럼, 자세는 잘 복제되었는데, 얼굴이 정말 이상하게 나오네요. 모델을 바꿔보기도 하고, VAE를 바꿔보기도 했는데, 영... 잘 안나옵니다. 제 컴이 뭔가 잘못될 수도 있으니 나중에 다른 것과 비교해 봐야 할 것 같습니다.

그런데... 아래 사진의 자세를 사용해 만들어 봤는데, 이건 잘 나오네요. 아마도 얼굴 각도 때문이 아닐까... 싶어집니다.

미국 여자 축구 대표 알렉스 모건
미국 여자 축구 대표 알렉스 모건

프롬프트 : half-body, a beautiful woman, brown eyes, running, smile, small breast
부정적 프롬프트 : disfigured, ugly, bad, immature, b&w

아래 이미지중 윗쪽 2개는 Stable Diffusion v1.5 기본 모델인 v1-5-pruned-emaonly.ckpt 를 사용했고, 아래쪽 2개는 chilloutmix_NiPrunedFp32Fix.safetensors 를 사용했습니다. 어쩌다 보니 모든 모델이 탱크탑이네요.ㅎㅎ

이상이 ControlNet 기초 사용법입니다. ControlNet을 사용하지 않을 때는 [Enable] 체크를 꺼주면 됩니다.

ControlNet 매개변수

위에서는 ControlNet 설정중 일부만 대충 설명했는데, 여기에선 조금 더 상세하게 알아보겠습니다.

입력 콘트롤

ControlNet 입력 콘트
ControlNet 입력 콘트

ControlNet 유닛 : 하나의 ControlNet 수행결과를 다시 다른 ControlNet의 입력으로 사용할 때(다중 콘트롤넷) 사용합니다. 보통은 한가지 ControlNet만 사용합니다. 

이미지 캔버스 : 한글로 써있는 것처럼, 이미지를 끌어놓아도 되고, 클릭하면 나오는 파일 브라우저에서 원하는 이미지를 선택해도 됩니다.  

노트북 아이콘 : [새 캔버스 열기] 를 할 수 있습니다. 그런데 몇번 테스트해봐도 모르겠네요. 나중에 알게되면 다시 정리해 올리겠습니다. 

카메라 아이콘 : [웹캠 활성화]를 할 수 있습니다. 웹캠을 켜고, 자신이 취한 포즈를 사용해 이미지를 생성할 수 있습니다. 원하는 자세가 포함된 사진을 찾는 것 보다 이 방법이 훨씬 좋을 것 같네요^^

좌우화살표 아이콘 : [웹캠 미러링] 웹캠으로 촬영하면 좌우가 바뀌게 됩니다. 이를 바로 잡고 싶을 때 사용합니다.

위쪽 화살표 [이미지 크기를 Stable Diffusion에 보내기] : 참조용 사진의 크기와 똑같은 크기로 만들 때 사용할 수 있습니다. 이걸 보니... 이미지 생성을 하려면 한쪽을 512로 고정시킬 경우가 많은데, 비율을 똑같이 유지시켜주는 방법이 있으면 좋겠다... 싶습니다. 

모델 선택

ControlNet 모델 선택
ControlNet 모델 선택

Enable: ControlNet을 활성화 또는 비활성화시킬 때 선택합니다.

Low VRAM : VRAM이 8GB 이하일 때 사용합니다. 아직 실험적인 기능이라고 하고 GPU 메모리 에러일때 사용하라지만, 저는 오래된 컴퓨터라 일단 켜줬습니다.

Pixcel Perfect : 이걸 끄면 아래쪽에 Preprocessor Resolution이라는 게 나옵니다. 잘은 모르겠지만 이미지 크기 설정에 따라 다르게 (이미지 크기와 비슷하게?) 설정해야 했던 모양인데, 이걸 켜면 그냥 자동으로 설정된다고 합니다. 편해진 거니까 그냥 켜두면 될 것 같네요.

Allow Preview : 사진을 올리는 부분 오른쪽에 현재 선택한 전처리기의 결과를 미리 볼 수 있습니다. 예전에는 다 처리된 후에 생성된 이미지와 함께 나타났는데, 이제는 미리 확인할 수 있게 된겁니다. 전처리기를 돌린 결과는 Preprocessor와 Model 사이에 있는 💥버튼을 누르면 볼 수 있습니다.

Control Type : 어떤 모델을 사용할지를 정하는 부분입니다. Canny, Depth, Normal, MLSD, Lineart, SoftEdge, Scribble, Seg, Shuffle, Tile, Inpaint, IP2P, Reference, T2IA 등이 나열되어 있습니다. 여길 누르면 아래쪽의 전처리기(Preprocessor)와 모델이 자동 선택됩니다. 예전에는 전처리기와 모델을 따로따로 선택했어야 했는데, 이렇게 바뀌면서 고민이 줄어들었습니다.

Control Weight (제어 가중치)

제어 가중치는 프롬프트와 이미지의 자세가 다를 때, 얼마나 ControlNet의 자세를 따를 지를 결정합니다. 예를 보여드리겠습니다. 아래는 프롬프트입니다. 이 프롬프트를 잘 보시면 레스토랑 바깥에 서있는 자세를 요구하고 있습니다.

프롬프트 : knee shot, beatiful asian woman, a young female, highlights in hair, standing outside restaurant, smile, blue eyes, wearing a dress, side light, masterpiece, HDR, UHD, photorealistic
부정적 프롬프트 : disfigured, ugly, bad, immature, b&w, nsfw

아래 그림중 좌측 위는 원본이고, 다른 이미지는 Control Weight만 달리해서 새로 생성한 이미지입니다. 이 이미지에서 볼 수 있는 것처럼, Control Weight의 값이 낮으면 프롬프트를 따르는 경향이 높고, Control Weight 값이 높으면 ControlNet을 따르는 경향이 높아집니다.

원본 0.0 0.2
0.4 1.0 2

제어 단계(ControlNet Step)

Control Weight 옆에 있는 Starting Control Step과 Ending Control Step은 어느 단계에서 시작해서 어느 단계까지 적용할지를 지정하는 것입니다. 기본 값은 0에서 1 그러니까 시작단계에서 끝 단계까지 모두 영향을 미친다는 뜻입니다. Step 수가 20일때  0 ~ 0.5로 지정한다면 0~ 9단계까지만 ControlNet을 적용한다는 것입니다.

저는 이렇게 까지 세밀하게 조절할 일은 없을 것 같아서.... Control Weight는 1.0으로 고정한 상태에서 약 1/3 정도씩 맨 앞, 중간, 마지막에 적용하는 걸로 실험해 보았습니다. 결과는 아래와 같습니다. 가운데가 완전히 이상한게 나왔는데, 여러번 시도해도 정상적인 게 한번도 나오지 않았습니다. 

0.0 ~ 0.33 0.33 ~ 0.66 0.67 ~ 1.0

Stable Diffusion 기본 이론 Noise Schedule에 언급되어 있는 것처럼, 완전한 무작위 이미지에서 잡음을 제거할 때, 일반적으로 처음에는 많이 제거하고 마지막에는 조금 제거하는 방식으로 진행됩니다. 따라서 왼쪽편 이미지는 처음부터 ContorlNet을 적용하니까 앉아있는 모습이 나오고, 맨 오른쪽은 프롬프트에 의해 서있는 모습이 일단 결정되었기 때문에 ControlNet이 작용해도 별 변화가 없는 게 아닌가... 라고 생각합니다. 그냥 이 정도만 확인했으니 통과합니다.

기본적으로... Control Weight는 이미지 생성단계 전체에 대해서 ControlNet을 어느 정도 반영할 것인가를 결정하는 것이고, Control Steps에서는 처음부터 끝까지 적용하는 대신, 일부 단계에서만 ControlNet을 적용하라는 것입니다. 결국 이 두가지 모두 ControlNet 반영 비율을 제어하는 방식으로, 이 두가지를 적절히 사용해서 제어하여야 하는 게 맞는 것 같습니다.

Control mode

이것도 프롬프트를 중요시할 것인지, ControlNet을 중요시할 것인지를 설정하는 부분입니다. 

ControlNet Control Mode
ControlNet Control Mode

  • Balanced: ControlNet을 샘플링 단계에서 조건부여가 있는 경우와 없는 경우 모두에 적용하는 방식이라고 합니다. 이것이 기본 값입니다.
  • My prompt is more important : ControlNet의 효과가 U-Net 삽입의 인스턴스에서 점점 줄어드는 방식으로, 결과적으로 프롬프트가 ControlNet 보다 더 많이 영향을 미치도록하는 설정입니다.
  • ControlNet is more important : 조건부여가 없는 경우 ControlNet을 꺼버립니다. 그 결과 CFG 척도가 ControlNet 효과에 대해 승수 역할을 합니다.

아래는 ControlNet v1.1 페이지에 들어있는 비교사진인데 참고하시기 바랍니다. 

ControlNet Control Mode 비교
ControlNet Control Mode 비교

사실 제가 쓰기는 했는데 그냥 Balanced를 쓰면 좋겠다 정도지, 어떤 방식으로 작동하는지는 잘 모르겠네요~ ㅠㅠ

Resize 모드

Resize 모드는 입력된 기준 이미지와 생성될 이미지의 크기 비율이 맞지 않을 때 어떤 식으로 처리할 지를 지정하는 것입니다.  (입력된 이미지와 생성할 이미지의 비율이 동일하다면 신경쓸 필요 없습니다.)여기에 있는 메뉴는 img2img의 Resize 모드와 완전히 동일합니다.

  • Just resize : 입력된 이미지를 생성할 이미지의 크기에 강제로 맞춥니다. 가로세로 비율을 고려하지 않으므로 이미지가 찌그러지게 됩니다.  아래가 그 예입니다. 원본 이미지는 평범하게 앉아 있는 모습인데, 가로로 납작해지다보니 몸을 앞으로 기울인 이미지가 생성되었습니다.
  • Crop and resize : 새로운 이미지의 공간에 원본 이미지를 맞춥니다. 이 과정에서 맞지 않는 부분은 잘려나가게 됩니다. 아래가 그 예입니다. 생성되는 이미지 전체에 ControlNet 이미지가 사용되다보니, ControlNet에서 남는 부분은 잘려나간 모습입니다.
  • Resize and fill : 원본 이미지를 새로운 이미지의 공간에 맞추는데, 모자라는 영역은 원본 이미지의 평균적인 색으로 채워 넣습니다.  ControlNet 이미지를 모두 사용하므로, 생성되는 이미지에 모자라라는 부분은 임의로 생성이됩니다. 

Loop Back

ControlNet 맨 아래에 [Loopback] Automatically send generated images to this ControlNet unit 라는 부분이 있습니다. 생성된 이미지를 자동적으로 입력으로 되돌린다... 는 정도로 생각되는데, 아무래도 제가 설명하지 않은 Batch 탭과 함께 사용해서 애니에이션 비슷한 걸 만들어주는 게 아닐까 싶습니다. 나중에 좀더 공부해서 업뎃 시키겠습니다.

다중 ControlNet

이미지를 생성할 때 여러가지 ControlNet을 한꺼번에 적용하는 방법입니다. 이게 없었다면 한가지 ControlNet을 적용시키고, 그 결과물을 사용해서 새로운 ControlNet을 적용시키고... 등등 계속 반복해야 할텐데, 다중 콘트롤넷을 사용하면 이 과정을 한번에 처리할 수 있습니다. 

이번에도 예제를 사용해서 사용방법을 알아보겠습니다. 설정은 아래와 같습니다.

모델: Protogen x5.8
프롬프트: An astronaut sitting, alien planet
부정적 프롬프트: ugly, tiling, poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, body out of frame, bad anatomy, watermark, signature, cut off, low contrast, underexposed, overexposed, bad art, beginner, amateur, distorted face, b&w, watermark, EasyNegative 

그냥 이 상태대로만 이미지를 생성하면 아래와 같은 이미지들이 생성됩니다.

이제 우주인의 앉은 자세와, 배경을 따로따로 제어하고 싶다고 가정해 보겠습니다. 이런 경우 ControlNet을 여러번(여기선 2번) 적용하면 해결할 수 있습니다.

앉아있는 자세에 대한 참조 이미지는 다음 영상을 사용합니다. 

다중 ControlNet에 사용할 자세 참조 이미지
다중 ControlNet에 사용할 자세 참조 이미지

다중 ControlNet을 사용하려면, 각각의 설정을 ControlNet Unit에 지정해야 합니다.

ControlNet Unit 0에 대한 설정은 아래와 같습니다.

Enable: Yes
전처리기(Preprocessor): OpenPose
모델: control_xxxx_openpose
Resize mode : Resize and Refill (ControlNet 이미지를 다 사용하고 모자라는 부분은 채웁니다)

다중 ControlNet Unit 0 설정
다중 ControlNet Unit 0 설정

배경은 아래 그림을 참조로 해서 생성합니다.

다중 ControlNet에 사용할 배경
다중 ControlNet에 사용할 배경

이런 경우 ControlNet 모델로는 Depth가 가장 적합합니다. ControlNet Unit 1에 대한 설정은 아래와 같습니다.

Enable: Yes
Control Weight: 0.45  (ControlNet의 영향을 낮춥니다)
전처리기(Preprocessor): depth_zeo
모델: control_xxxx_depth
Resize mode : Crop and Resize

다중 ControlNet Unit 1 설정
다중 ControlNet Unit 1 설정

이제 [Generate] 버튼을 눌러 이미지를 생성한 결과입니다. 

Stable Diffusion 생성 이미지 - An astronaut sitting, alien planet (다중 ControlNet 적용)
Stable Diffusion 생성 이미지 - An astronaut sitting, alien planet (다중 ControlNet 적용)
Stable Diffusion 생성 이미지 - An astronaut sitting, alien planet (다중 ControlNet 적용)
Stable Diffusion 생성 이미지 - An astronaut sitting, alien planet (다중 ControlNet 적용)

ControlNet 활용 예제

인간의 자세 복사하기

ControlNet이 가장 흔하게 활용되는 분야는 인간의 자세를 복사하는 것일 겁니다. 그냥 프롬프트만으로는 자세를 복사하기 거의 불가능하기 때문입니다. 하지만 위에서 보는 것처럼, Stable Diffusion의 ControlNet을 사용하면 원하는 자세를 만드는 것은 전혀 어렵지 않습니다. 기준이 되는 이미지는 웹에서 찾은 것도 무방하고, 스테이블 디퓨전이 생성한 이미지를 사용해도 되고, 웹캠을 직접 사용해서 촬용해도 됩니다.

특히 인체의 자세를 복사할 때에는 openpose  모델을 사용하는 경우가 많습니다. Openpose를 사용할 경우 ControlNet을 아래와 같이 설정해야 합니다.

전처리기(Preprocessor) : openpose
모델(Model)  : control_v11p_sd15_openpose

SD ControlNet openpose 사용을 위한 중요 설정

예제1 : 이미지에서 자세를 복사하기

가장 기본적인 예제로 나뭇잎을 감상하는 이미지의 자세를 복제해 보도록 하겠습니다. 

잎을 감상하는 여자 - openpose 예제

아래는 몇가지 예입니다. 이미지 아래에는 프롬프트와 사용한 모델을 적었으니 참고하세요. 해보시면 아시겠지만, 창을 들게 하는 건 쉬운데, 새를 들게(holding) 하거나, 드래곤을 들게 하는 것은 매우 어렵습니다. 특히 첫번째 이미지, 몽골 복장의 여인을 생성할 때 20개 정도를 만들어서 겨우 얻었는데, 여자가 천사가 되는 안타까움이 있었습니다. ㅠㅠ 일반적인 물건이 아니라, 아주 이상한 물건을 들라고 하면 그런 물건을 든 이미지를 학습한 적이 없었기 때문에 생성하기 힘든 게 아닐까... 하고 짐작해 보았습니다. 

photo of a young woman, wearing mongolian costume, highlight in brown hair, brown eyes, outside landscape, holding a eagle, eagle with spread wings a man in suit, in living room, with a colorful bird on his hand
chilloutmix anything v4.5
photo of a beautiful and mysterious mage, detailed pretty face, detailed clothing, fire lightening spear photo of a female, highlight in hair, outside city street, holding a dragon
dreamlike photoreal 2.0 anything v4.5

예제 2: 영화 장면 리믹스

펄프 픽션에서 나오는 유명한 춤 장면을 차용해 공원에서 요가하는 장면으로 바꿔보겠습니다. 

펄프 픽션

아래는 ChilloutMix 모델에 국풍3(GuoFeng3) LoRA를 사용했고, 자세는 openpose를 사용해 복제하였습니다. LoRA 사용법은 이 글을 참고하세요. 그런데... ChilloutMix와 GuoFeng3는 잘 어울리지 않는 듯 하네요. GuoFeng3 에는 Basil_mix_fixed 모델을 사용한 것 같은데, 다른 걸로 바꾸면 역시나 별로인가 봅니다.

Stable Diffusion - a photo of Chinese women doing yoga, Chinese costume, outside in a park, high quality, photorealistic, highlights in hair, <lora:GuoFeng3.2_Lora_light:0.6>

아래는 거의 동일한 프롬프트로, anything v4.5 studio ghibli style LoRA를 사용한 결과입니다.  모델에 따라서 전체 분위기가 완전히 바뀌므로, 모델 그리고 LoRA를 많이 확보해야 할 것 같네요.

Stable Diffusion - a photo of Chinese women doing yoga, Chinese costume, outside in a park, high quality, photorealistic, highlights in hair,&nbsp; <lora:studioGhibliStyle_offset:1>

IP-adapter plus face 모델을 사용한 얼굴 복제

특별한 IP-adapter face 모델을 사용하면 여러 이미지에 걸쳐 얼굴을 일관성 있게 유지할 수 있습니다. (Reference와 비교해 보세요)

먼저 아래의 모델을 다운로드 받아서, stable-diffusion-webui\models\ControlNet에 넣어줍니다.

txt2img 페이지의 아래로 내려가 ControlNet 영역을 펼치고, 캔버스에 원하는 얼굴을 넣어줍니다.

ControlNet 설정은 아래와 같습니다.

  • Enable: Yes
  • Preprocessor: ip-adapter_clip_sd15
  • Model: ip-adapter-plus-face_sd15
  • control Weight : 1

프롬프트는 아래와 같습니다.

프롬프트: A woman sitting outside of a restaurant in casual dress
부정적 프롬프트: ugly, deformed, nsfw, disfigured

생성 결과는 아래와 같습니다.

ControlNet을 사용하여 이미지 스타일 변경하기

ControlNet을 사용하면(특히 canny/HED 등과 같이 외곽선 감지기를 사용할 경우), 원본의 형태를 그대로 복제할 수 있습니다. 이렇게 원본의 형태를 가져온 후 프롬프트를 사용해 다른 스타일로 바꿔보는 것도 가능합니다.

베토벤

아래는 결과입니다. 그런데... 이걸 해보다보니, Easy Diffusion의 수식어를 보면, 미술 스타일이 예제를 포함해 나열해주어서 적당히 선택할 수 있었다는 게 기억나네요. Easy Diffusion 이 편하긴 편하네요. ControlNet  LoRA도 지원해지지 않으니 문제지만요. ㅠㅠ

Pixel art of Beethoven, Canny 외곽선 추출기 3D rendering of Beethoven, Canny 외곽선 추출기
Color pencil drawing of Beethoven, Canny drawing of Beethoven, by Vincent van Gogh, depth_leres

인테리어 디자인 아이디어

위쪽에서 잠깐 보여드린 것처럼 ControlNet mlsd 모델은 직선이 잘 감지되므로, 인공물을 복제할 때 좋습니다. 아래는 제가 사용한 설정입니다.

Stable Diffusion - ControlNet mlsd 설정

디자인에 사용한 기준 이미지는 아래와 같습니다. 그냥 구글에서 인테리어 디자인으로 검색하고 괜찮다 싶은 걸 가져온 것입니다. Prompt는 간단하게 "award winning living room", 모델은 기본 모델은 v1-5-pruned-emaonly 를 사용했습니다.

인테리어 디자인

아래가 결과입니다. 한번에 뽑은 4장을 모두 가져온 것입니다. 인물 이미지는 잘못 뽑히는 경우가 많아도, 이런 경우는 잘못 나오는 경우가 거의 없습니다.

Openpose용 자세 생성

Magic Pose를 사용한 자세 만들기

Magic Poser라는 사이트에서 생각하는대로 자세를 만든 후, 이것을 캡쳐해서 ControlNet 입력 이미지로 사용할 수 있다고 합니다. 일단 접속을 하면 아래처럼 나오는데, 검은색 점들을 적절히 움직여서 자세를 만들 수 있습니다. 빈 공간에서 마우스로 우드래그, 좌드래그 하면  모델 전체가 돌아가니까 다른 방향에서 조절할 수도 있습니다. 몇번 사용해 보면 어렵지 않을 것 같습니다. 

Magic Poser

자세를 만들고 마지막으로 Preview를 눌러주면 됩니다. 저는 대충 공차기 직전 자세? 정도로 만들어 봤습니다.

Magic Poser - 공차는 자세

이 모델에서 전처리기를 openpose로 설정하고 이미지를 생성해주면 됩니다. 프롬프트는 "photo of Soccer player, playground, stadium, lots of viewer" 를 넣어주었습니다. 그리고.. 윗 그림은 세로로 되어 있는데, 이 상태로는 스타디움이 표현되지 않아서, Resize mode 를 "Resize and fill"로 설정해 주었습니다. 

아래가 그 결과입니다. 다른 건 크게 문제가 없는데, 공의 위치가 애매하네요. 위쪽에서도 언급한 것처럼, 사람만 표현할 때잘 되는데, 다른 사물과의 상호 관계는 잘 표현되지 않네요.

웹캠으로 자세 가져오기

제 생각에 위의 사이트에서 자세를 편집하는 것 보다, 그냥 스스로 원하는 자세를 취하는 게 가장 쉽지 않을까 싶습니다. AUTOMATIC1111에서는 사진을 올리는 것 외에도 컴에 달려있는 webcam으로 직접 촬영하는 방법도 지원합니다. 

아래 좌측은 제가 웹캠으로 촬영한 사진이고, 오른쪽은 이 사진으로 생성한 이미지입니다. 전처리기는 openpose를 사용했고 프롬프트는 "photo of a  young man, wearing glasses, sitting in museum, sculptures, by Rembrandt Harmenszoon van Rijn" 입니다. 마지막에 보시면 렘브란트 스타일로 그려달라고 했는데, 정말 괜찮게 나온 듯 싶네요. 하지만 조각이 있는 박물관은 완전히 사라져버렸네요. ㅠㅠ

===

이상입니다. 이 글은 Andrew님의 글 중에서 개요 및 사용법만 정리한 것입니다. 다음 글은 ControlNet 의 여러가지 모델/전처리기에 대한 상세한 설명과 적용사례가 있으니 참고하세요. 이미지중 일부는 원문에서 가져온 것이고, 대부분은 제가 테스트한 결과입니다.