스테이블 디퓨전(StableDiffusion)

스테이블 디퓨전(SD)의 심화과정 시작, 컨트롤넷(ControlNet)

물범쌤 2024. 5. 14. 18:30

안녕하세요 여러분, 물범쌤 입니다 :)

오늘은 드디어 스테이블 디퓨전의 심화과정이자,

앞으로도 스테이블 디퓨전의 많은 고급 창작물의 핵심 기능이 될
컨트롤넷(ControlNet)을 알아보려고 합니다.

 

컨트롤넷은

스테이블 디퓨전이 확장성을 갖출 수 있도록 해준 놀라운 기능인데요

컨트롤넷 기능의 구조는 깊게 알 필요는 없지만 개념을 이해하고자 한다면

사용자가 삽입한 첨부 이미지를 스케치(외곽선)를 따서,

사용자가 원하는 설정대로 바꿔주는 기능이라고 보시면 됩니다.

 

대표적으로

1.이미 생성된 창작물의 자세를 사용자가 생성할 이미지에 적용할 수 있습니다.

2.이미 생성된 창작물의 스케치를 따서,
   다른 느낌의 프롬프트(의상이나 색 변경 등)를 입힐 수 있습니다.

3.컨트롤 넷을 통한 업스케일링이 가능합니다.

4.추후 다른 기능과의 연계를 통해 AI 영상 제작이 가능합니다.

 

이처럼 다양한 기능을 가진 컨트롤넷, 반드시 알아봐야겠죠?

자, 그럼 바로 시작해보겠습니다!


먼저, 컨트롤넷을 설치해야 합니다.
아래의 주소를 복사해 주세요
https://github.com/Mikubill/sd-webui-controlnet

주소로 이동해서 뭔가를 받는것이 아니니까 복사만 해주시면 됩니다.

이곳으로 이동해서 받는것은  스테이블 디퓨전이 해줄겁니다.

Extensions 탭은 git을 통해서 발급되는 확장프로그램을 다운받는 프로그램입니다.

이미지를 따라서 URL을 입력하고 Install을 눌러주세요!

 

 

 

 

install 완료 문구가 뜨면 Installed 탭으로 와서
Apply and restart UI버튼을 눌러주세요!

컨트롤넷은 web-ui에 적용시 재시작이 필요한 프로그램 입니다.

프로그램만 끄지 말고 cmd창도  ctl+c를 꾹 눌러서 종료해야 합니다 ^^

 

그리고 다시 켜주면?

짠! 컨트롤넷 기능이 추가되었습니다.

컨트롤넷 탭을 열어보면, 뭔지 모르겠는것들이 많이 있습니다.

이부분은 이따가 다시 살펴볼겁니다.

컨트롤넷의 설치가 이게 끝난것이 아니거든요 :)

 

아래 주소로 이동해주세요

https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main

이동 하시면 컨트롤 넷에서 사용되는 모델들을 다운 받으실 수 있습니다.

 

 

우리는 이 중에서 많이 사용하는

Openpose, depth, canny 이렇게 세 개의 모델을 다운받아 볼겁니다.

LFS 아이콘 옆에 있는 다운로드 버튼을 각각 눌러서 다운받아 주세요!
다운 받으신 파일들은 아래 경로를 따라서 넣어주시면 됩니다.
C:\stable-diffusion-webui\extensions\sd-webui-controlnet\models

 

다시 스테이블 디퓨전으로 돌아와서
컨트롤넷 안에 있는 model의 파란 새로고침 마크를 눌러주면

모델들이 적용된 것을 볼 수 있습니다.
이제 진짜로 컨트롤넷 설치가 끝났습니다.

 

Q. 쌤! 저는 컨트롤넷 파일이 안뜨는데요?


A. 파일의 설치경로를 확인해주세요.
초보자분들이 많이 하시는 실수가 체크포인트나 로라를 넣던 경로에

컨트롤넷 파일을 넣는 경우가 있으십니다.

또는 저를 따라서 스테이블 디퓨전을 설치하신게 아니라서 
스테이블 디퓨전의 경로가 C드라이브부터 시작하는 경우가 아닌 경우에도

위의 경로를 복붙하시면 안되고 따로 폴더를 찾아들어가셔야 합니다.

 

 

 

참고로 COLAB을 통해 스테이블 디퓨전을 사용하시는 분들은
실행파일 중단에 ControlNet탭을 통해서
받고자 하는 모델을 설정하시고 실행시켜주시면 됩니다.
'All'로 실행시키면 제일 편하긴 하지만,
파일의 총 용량이 대략 20GB가 넘어갈 겁니다.

구글 드라이브 용량이 부족할수도 있으니 주의하세요

 

 


 

자, 설치가 끝났으니 이제 본격적으로 UI설명에 들어가보겠습니다.

뭐가 뭔지 알아야 쓸 수 있으니까요 :)

 

먼저, 컨트롤넷 제어부의 설명입니다.

 

Enable : 컨트롤넷의 사용여부를 제어하는 옵션입니다.
체크해주면 컨트롤넷을 사용하겠다는 뜻입니다.
당연히 컨트롤넷을 사용하는 창착물을 생성할때, 항상 체크되는 옵션입니다.

 

Low VRAM : VRAM(가상메모리)를 사용하는 용량을 낮춰주는 옵션입니다.
8GB이하의 그래픽 카드를 사용하고 계신다면
체크해주세요!
컨트롤넷을 사용한 이미지 생성시, VRAM으로 인한 오류가 뜨지 않도록 해줍니다.

 

Pixel Perfact : Preprocessor 의 resolutions을 수동으로 조절하지 않아도
자동으로 best annotator resolution을 계산하여 pixel이 완벽하게 맞도록 해줍니다.

쉽게 설명하자면 사용자가 선택한 작업(앞으로 진행 할 open pose나 depth)에
최적화된 결과값을 자동으로 적용해주는 기능입니다. 당연히 켜는것이 좋겠죠?

 

Allow Preview : 프리뷰라는 단어에서 알 수 있듯이,
결과물을 미리 볼 수 있는 일종의 미리보기 기능입니다.

 

Effective Region Mask :
이미지에서 특정 부분을 색칠을 통해 지정할 수 있는 기능입니다.

얼굴 바꾸기의 기능을 염두해두고 추가된 기능 같지만,

img2img에 이미 Inpaint 라는 기능이 있기 때문에
자주 사용되지는 않는것으로 보입니다.


 

다음은 control type에 대해서 알아보겠습니다.

모든 기능을 사용하지는 않기 때문에, 참고할만한 주요 기능들만 정리해 보았습니다.

 

Canny: 가장자리(edge) 를 감지합니다.
소스 이미지의 엣지를 참고해서 생성 이미지의 엣지를 컨트롤합니다.


Depth: 피사체 간의 거리감을 나타냅니다.
소스 이미지 요소들의 카메라에서의 거리를 감지하는데,
Depth가 흰색일수록 가까운 거리에 있다고 보면 됩니다.
인물과 배경 근경에 있는 거리감을 잘 이해하지 못하고 만들어지는 경우가 있는데,
Depth를 통해 이를 해결할 수 있습니다.


IP2P: 명령 Prompt 'make it~'을 사용하여 문장의 방향성을 반영합니다.


Lineart: edge를 감지하는데,
원화같은 그림을 표현할 때 많이 사용됩니다.

 

MLSD: 직선 형태의 가장자리를 감지합니다.
인테리어, 건물, 거리풍경, 액자, 종이 모서리 등의 감지에 사용합니다.

 

Normal: 이미지에 있는 물체의 각 면의 방향, 즉 부피감을 감지합니다.

 

Openpose: 눈, 코, 목, 어깨, 팔꿈치, 손목, 발목의 위치를 감지합니다.
포즈를 유지한 채 새로운 이미지를 생성할 때 주로 사용합니다.

 

Reference: 소스 이미지를 참조하여 새로운 이미지를 생성할 때 사용합니다.

 

Scribble: 이미지의 edge를 감지하여 러프 스케치처럼 표현합니다.


Softedge: source 이미지에서 edge를 감지합니다.
노이즈가 적고 감지 결과가 좋아 주로 사용됩니다.

 

Shuffle: 무작위 흐름을 사용해 이미지를 섞고
스테이블 디퓨전을 제어하여 이미지를 재구성합니다.

 

Tile: 이미지의 새로운 세부 정보를 생성합니다.
Source Tile의 의미 체계와 프롬프트가 불일치 할 경우,
프롬프트를 무시하고 로컬 컨텍스트로 세부 정보를 생성합니다.
tile resample을 키고 작업하면 업스케일 된 결과물을 얻을 수 있습니다.



다음은 아래 부분들에 대한 설명입니다.

 

Control Weight : 제어가중치로서,

스테이블 디퓨전에게 컨트롤넷에 입력된 자세를
얼마나 따르게 할것인지 제어하는 기능입니다.
프롬프트와 CFG scale간의 관계라고 생각하시면 될 것 같습니다.

 

Starting Control Step , Ending Control Step:

Starting Control Step과 Ending Control Step은 세트입니다.

컨트롤넷을 적용하는 시점을 설정하는 기능이며,

기본값인 0과 1은 시작부터 끝까지 컨트롤넷을 적용한다는 의미입니다.

따라서 보통 이 수치를 수정하는 경우는 거의 없습니다.

 

Low Threshold ,High Threshold :
이 부분은 Canny에서만 나오는 설정부인데,
스케치된 선의 가중치와 연관되어 있는 부분입니다.

최적화된 수치로 기본설정되어있기 때문에
이 부분 역시 수정하는 경우는 거의 없습니다.

 

Control mode
컨트롤넷과 프롬프트 사이의 중요도를 설정합니다.
balanced는 말 그대로 반반정도의 가중치,

My prompt is more important 는 프롬프트 중시,
ControlNet is more important 은 컨트롤넷 중시 설정입니다.

보통 컨트롤넷을 사용하는 경우에 My prompt is more important는 잘 사용하지 않고
balanced 나 ControlNet is more important 옵션을 주로 사용합니다.

 

*resize 부분에 대한 설명은
img2img 포스팅에서 다뤘던 내용과 같기 때문에 생략하겠습니다 :)

 

Batch Option :
'다수의 소스 이미지들'에 대해서 창작물의 반영 방향을 설정하는 옵션입니다.

All ControlNet units for all images in a batch :
입력된 소스 이미지들의 내용을 모든 생성물에 적용

Each ControlNet unit for each image in a batch :
입력된 소스 이미지들의 내용을 각각 적용

짧은 설명으로는 이해가 어려우실테니,
이 부분에 대한 자세한 설명은 아래 URL을 참고해 주세요 :)
https://github.com/Mikubill/sd-webui-controlnet/discussions/2295

 


자, 이제 본격적으로 컨트롤넷 사용 방법에 대해 알아보겠습니다.

아까전에 다운받았던 주요 모델들(Canny,Open pose,Depth)의 사용법을 알아볼게요!

먼저, Canny 입니다.

베이스가 될 소스 이미지를 먼저 삽입해주세요
(헷갈리시는 분들이 계실까봐 말씀드리지만, txt2img탭에서 진행중입니다.)

 

control type을 Canny로 두고,

control mode를 ControlNet is more important로 바꿔주고

아무 프롬프트를 넣지 않은채 generate를 눌러줍니다.

 

삽입된 이미지에 따라 스케치된 결과물을 볼 수 있습니다.

 

Q.쌤, 뭔가 이상해요. 결과물이 늘어져서 나와요!

A.컨트롤넷 리사이즈 옵션이 적용하는 생성물의 사이즈는

우리가 일반적으로 프롬프트를 생성할때 설정하는 Width와 Hight옵션입니다.
만일 저처럼 세로형의 이미지를 출력하셨다면 512*512로 기본셋팅 되어있는

사이즈 설정값을 바꿔주어야 겠죠?

 

 

자, 그럼 이제 본격적으로 Canny기능의 핵심인
프롬프트를 통한 새로운 이미지 생성을 해봅시다.

설정들은 그대로 두고,프롬프트를 입력해 주세요.
(삽입된 소스 이미지를 표현하는 프롬프트에서 색이나 의상 등을 변경해 보세요) 

소스이미지에 대한 프롬프트 추출 방법은 img2img 포스팅에 정리되어 있습니다.

 

 

 

기존 이미지에서 추출한 프롬프트 입니다.

1girl, ass, bangs, bare shoulders, baseball cap, black choker, black headwear, black shirt, blush, building, choker, city, cityscape, clothes writing, denim, earrings, eyebrows visible through hair, from behind, green eyes, hat, heart earrings, horns, jacket, jewelry, long hair, long sleeves, looking at viewer, looking back, night, off shoulder, outdoors, pants, piercing, pink hair, shirt, shorts, solo, tokoyami towa, virtual youtuber, white jacket

 

 

 

그리고 저는 머리색과 눈색,그리고 바지색을 바꿔보겠습니다.
1girl, ass, bangs, bare shoulders, baseball cap, black choker, black headwear, black shirt, blush, building, choker, city, cityscape, clothes writing, denim, earrings, eyebrows visible through hair, from behind, pink eyes, hat, heart earrings, horns, jacket, jewelry, long hair,grey hair, long sleeves, looking at viewer, looking back, night,

off shoulder,outdoors,white pants, piercing, shirt, shorts, solo, tokoyami towa, virtual youtuber, white jacket

 

 

*control mode를 ControlNet is more important에서

balanced로 바꿔주고 생성해 보았습니다.

 

어떤가요? 같은 자세이지만 상당히 다른 느낌의 그림이 출력되었죠?

Canny 는 기존에 우리가 사용하던 시드값을 넣어서 이미지를 유지하던 방법보다
더욱 디테일하고 확고하게 비슷한 이미지를 출력해낼 수 있게 해주는 기능입니다.

 


Depth는 깊이감 혹은 거리감과 관련있는 기능이기에 때문에

인물이미지 보다는 풍경이미지를 사용했을때
더욱 확연하게 차이를 느낄 수 있습니다.

소스 이미지를 넣고 Allow Preview를 체크해줍니다.

depth 모델은 자동으로 영역을 잡아주는 midas나 zoe로 선택해주시고,

직접 조정을 원한다면 leres++을 선택해주시면 됩니다.

Preprocessor와 Model 사이에 있는 빨간 버튼을 누르면 위의 프리뷰 창을 통해

생성되는 결과를 미리보기 할 수 있습니다.

 

 

이번에도 프롬프트를 입력하고

control mode를 balanced로 설정하고 생성해 보겠습니다.

 

기존 프롬프트

Day, Forest, Grass, Leaf, Nature, No Humans, Outdoor, Plants, Rocks, Landscapes, Trees, Water, Falls

 

변경 프롬프트(없던 프롬프트 추가)

Day, forest, grass, leaves, nature, fall, leaves, no humans, outdoors, plants, rocks, landscapes, trees, water, water, and waterfalls

 

소스 이미지와 출력 이미지를 조금 더 자세히 보겠습니다.

 

어떤가요? 차이가 느껴지시나요?

깊이감이 추가 되기 위해서 소스이미지에서는 비어있던 공간들이
다른 나무들로 채워지면서 더욱 실감나게 표현되었습니다.


풍경에 대한 이미지를 예시로 들었을 뿐이지만

Canny와 같이 인물의 스타일을 변경하는 데에도 사용 가능하니까

Depth는 꼭 풍경이미지에만 써야 한다고 생각하시면 안됩니다 :)

 

 

거리감이 유지되는 옵션이기 때문에
옷이나 포즈가 동일하게 따라오지는 않습니다.

소스 이미지에서 보여주는 거리감이
뒷배경을 설정해주니 더욱 도드라지는것을 알 수 있습니다.

 


마지막으로 컨트롤넷의 끝판 왕이라고 불리우는 Openpose를 알아보겠습니다.

사실 컨트롤넷을 사용하는 이유의 80% 이상은 이 Openpose 라고 생각합니다. 

Openpose는 소스이미지에서 뼈대 부분을 추출해서
생성될 이미지에 그대로 적용하기 때문에

Canny와 마찬가지로
seed값을 고정하는것 보다 더 정교하게 같은 자세를 유지할 수 있습니다.

 

Q. 쌤! 그런데 Canny도 소스 이미지랑 똑같이 나오고,
Openpose도 소스이미지랑 똑같이 나오는데 둘이 뭐가 다른 건가요?

A.Canny같은경우 원본 소스 이미지의 전체적인 '분위기'를 유지한채
약간의 변화를 추구할때 적합하고,

Openpose는 그보다 원본소스의 '자세'에 초점이 맞춰져 있기 때문에
포즈만 따서 새로운 창작물에 입히고자 할때 적합합니다.

 

 

소스 이미지를 넣고 Control type을 Openpose,

Preprocessor는 dw_openpose_full로 설정하겠습니다.

dw_openpose_full는 기존의 openpose_full 보다

손가락의 모양을 더욱 세밀하게 표현할 수 있는 기능입니다.

빨간색 버튼을 눌러서 프리뷰를 출력해줍니다.

 

 Edit 버튼을 누르면 새로운 창이 뜨면서 뼈대를 조금 더 상세히 조작할 수 있습니다.

조작이 끝났다면 새창 왼쪽편에 있는

'ControlNet에 자세 보내기' 버튼을 눌러서 설정을 끝마칠 수 있습니다.

 

이제 완전히 다른 스타일에 해당 자세를 입혀보겠습니다.

 

원본 소스이미지와 아예 다른 이미지를 출력할 예정이니
굳이 프롬프트를 추출할 필요가 없겠죠?

출력된 결과물입니다.

 

어떤가요?
아예 다른 스타일의 생성물인데 자세가 디테일하게 같은 모습을 볼 수 있습니다.


오늘은 스테이블 디퓨전의 심화 기능중의 하나인
ComtrolNet에 대해서 알아보았습니다.

이 기능은 앞으로 설명드릴 컨텐츠에서도 자주 등장할 예정이기도 하고, 

처음에 말씀드렸던 대로 고품질의 창작물을 생성하는데에 필수적인 기능이기도 하니

꼭 익숙하게 느껴지실때까지 연습해보시길 바라겠습니다 :)

 

이 컨텐츠가 유익하셨다면 공감(♡)과 댓글 부탁드리겠습니다.

그럼 오늘도 좋은 하루 되세요! ^^

반응형