AI 이미지/AUTOMATIC1111

Stable Diffusion - 구역 분할 프롬프트 사용법

하늘이푸른오늘 2023. 6. 19. 10:51

SD - Mysterious Witch
SD - Mysterious Witch

프롬프트를 구역별로 나누어 적용할 수 있다는 사실을 아시나요? AUTOMATIC111에 구역 프롬프트(Regional Prompter) 확장을 사용하면 가능합니다. 

이 글에서는 먼저 구역 프롬프트 기술을 사용하는 간단한 예제를 살펴본 후, ControlNet과 함께 구역 프롬프트를 사용하는 방법을 자세히 알아보겠습니다.  이 글에서 다루는 내용은 다음과 같습니다.

소프트웨어

구역 프롬프트를 사용하려면 AUTOMATIC1111 이외에 별도로 설치할 것은 없습니다. AUTOMATIC1111 설치방법은 여기를 읽어보세요. AUTOMATIC1111은 구글 Colab 노트북을 사용할 수도, 맥에서도 설치할 수 있지만, 저는 윈도를 기준으로 설명합니다.

구역 프롬프트 extension 설치

1. Extension 페이지로 들어가 Available 탭을 누릅니다.

2. [Load from:] 버튼을 누르고 "Regional Prompter"를 입력해 검색합니다.

3. [Install] 버튼을 누릅니다.

Regional Prompter(구역 프롬프트) 설치1

4. 이제 Installed  탭으로 이동하면 아래와 같이 regional prompter 확장이 설치되어 있습니다. 여기에서  [Apply and restart UI] 버튼을 누르고 잠시 기다리면 설치가 완료됩니다.

Regional Prompter(구역 프롬프트) 설치2

간단한 예제

간단한 예제부터 시작해 보겠습니다. 남자와 여자를 그리는 프롬프트입니다.

프롬프트: a man and woman
부정적 프롬프트: disfigured, ugly

그냥 그렇습니다. 그런데, ChilloutMix를 사용했음에도 외국인 모습이고, 게다가 흑백사진이 많이 등장하는게 흥미롭네요.

이번엔 좀 더 구체적으로 적어 보겠습니다. 남자는 검은색머리, 여자는 블론드 머리입니다.

프롬프트: a man with black hair, a woman with blonde hair

결과는 아래와 같습니다. 제대로 나온 것도 있지만, 머리색이 바뀐 것도 반반쯤 됩니다.

Stable Diffusion 입장에서는 머리 색을 혼동하는 것이 자연스러운 일입니다. 프롬프트에서 남자와 검은색 머리를 연결시켰다고 생각하지만, 스테이블 디퓨전에서는 그냥 검은색 머리도 있고 금발도 있다고 생각할 뿐입니다. 이런 상황은 옷 색을 지정한다던지... 구체적으로 지정하면 할 수록 어려워집니다. 

이러한 문제는 왼쪽에 검은 머리 남성, 오른쪽에 금발 여성을 명시하여 해결할 수 있습니다. 

구역 프롬프트(Regional Prompter)

이제 구역 프롬프트를 사용해 보겠습니다.

1. txt2img 페이지 아래쪽으로 내려가 Regional Prompter 를 확장합니다.

2. Active 단추를 누릅니다. 그러면 아래와 같은 상태가 됩니다. Horizontal이 선택된 상태에서 아래쪽에 있는 [visualize and make template] 버튼을 누르면 초록색/자주색으로 구역이 생기는 걸 볼 수 있습니다. 왼쪽이 0번구역, 오른쪽이 1번 구역입니다. Divide Ratio는 현재 1,1 이므로 좌우 구역의 면적이 동일합니다. 

3. 프롬프트를 입력합니다.

프롬프트:
a man and a woman, a man with black hair
BREAK
a man and a woman, a woman with blonde hair
부정적 프롬프트:
disfigured, deformed, ugly

구역이 2개이므로 2개의 프롬프트를 따로따로 작성하고, 가운데에는 BREAK를 넣어주었습니다. 윗쪽 프롬프트는 0번 구역, 아래쪽 프롬프트는 1번 구역에만 적용됩니다. 부정적 프롬프트에는 BREAK가 없으므로 모두 동일하게 적용됩니다. 

아래는 실행결과입니다. 오른쪽에 남자가 배치되는 상태가 8개중의 1개가 있었지만, 전반적으로 괜찮은 결과를 얻었습니다. 

공통 프롬프트

우리가 사용한 프롬프트를 보면, 좌우 프롬프트에 동일한 부분(a man and woman)이 있습니다. 

a man and a woman, a man with black hair
BREAK
a man and a woman, a woman with blonde hair

이러한 공통되는 프롬프트는 매우 중요합니다. 만약 이 부분을 지워버리면 아래와 같이 한사람만 생성됩니다. 나쁘지는 않습니다만, 원하는 바는 아니죠.

이렇게 되는 이유는 좌우측 프롬프트에 모두 한사람만 그리라고 되어있기 때문입니다. 스테이블 디퓨전에게 남자 여자 두사람을 그리라고 구체적으로 명시해주어야하는 겁니다. 

이걸 쉽게 해결하는 방법이 있습니다. 공통 프롬프트를 사용하도록 명시하는 것입니다. 아래 그림과 같이 Use common prompt 를 클릭한 후, 

프롬프트를 아래와 같이 고쳐줍니다. 맨 위에 있는 프롬프트(a man and a woman)이 공통 프롬프트입니다.

프롬프트:
a man and a woman
BREAK
a man with black hair
BREAK
a woman with blonde hair

즉, 위의 프롬프트는 맨위의 공통 프롬프트, 0번구역에 적용되는 프롬프트, 1번 구역에 적용되는 프롬프트로 구성됩니다. 그런데, 이것은 그냥 형식일 뿐입니다. 위에서 공통 프롬프트가 없이 구역만 구분된 프롬프트와 완전 동일합니다.

복잡한 구역 프롬프트

구역을 세심하게 구분할 수록 원하는 이미지를 얻을 가능성이 높아집니다. 여기에서는 divide ratio의 효과를 알아보겠습니다. 효과를 보고 싶으시면 언제든지 [visualize and make template] 버튼을 눌러보시면 됩니다.

아래는 Divide 모드를 Horizontal 로 둔 상태에서 Divide Ratio를 바꿔본 모습입니다.

1,1 1,1,1 1,2,1

아래는 Divid Mode를 Vertical로 설정한 상태에서 Divide Ratio를 바꿔본 모습입니다.

1,1 1,1,1 1,2,1

수평수직 분할

구역을 수평 수직으로 모두 분할 할 수도 있습니다. 아래와 같이 설정하면 됩니다. 

수평수직 분할 방법
수평수직 분할 방법

여기에서 Divide Ratio은 1,1,1; 1,1,1 로 설정했습니다. 두개의 1,1,1 사이에는 콜론(;)이 있습니다. 이것은 좌우를 분할한다는 의미입니다. 1,1,1 중에서 맨 앞의 1은 위아래 구역의 높이 비율입니다. 나머지 1,1 해당 구역 내에서 위아래로 1:1로 자른다는 뜻입니다. 

다른 여러가지를 예를 참고하시기 바랍니다. 사실 이렇게 까지 할 필요가 있을지는 모르겠지만요.

1,1,1; 1,1,1 1,1,1; 2,1,1 1,1,1,1; 2,1,2

수평수직분할 프롬프트 예

실제로 수평수직 분할을 사용해 보겠습니다. 

모델: Lyriel v.1.5
프롬프트: a witch, highly detailed face, half body, studio lighting, dramatic lighting, highly detailed clothing, looking at you, mysterious, dramatic lighting, (full moon:1.3), (beautiful fire magic: 1.2)
부정적 프롬프트: underage, immature, disfigured, deformed

이렇게 돌리면 다음과 같은 이미지를 얻을 수 있습니다. 

멋지긴 한데, 달의 위치나 불의 위치를 조절할 방법은 없습니다. 이럴 때 구역 프롬프트를 사용하면 좋습니다. 구역 프롬프트는 아래와 같이 설정합니다.

Divide mode: Horizontal
Use common prompt: Yes
Divide ratio: 1,1,1; 2,1,1
프롬프트: 
a witch, highly detailed face, half body, studio lighting, dramatic lighting, highly detailed clothing, looking at you, mysterious, dramatic lighting
BREAK
(full moon:1.3)
BREAK
BREAK
BREAK
(beautiful fire magic: 1.2)

 모든 내용은 공통프롬프트에 넣었고, 다만, 0번 구역(왼쪽 위)에 달을 넣고, 3번 구역(오른쪽 아래)에 불을 넣도록 했습니다. 아래는 그 결과입니다.

이번엔 달을 1번 구역(오른쪽 위), 불을 2번 구역(왼쪽 아래)에 넣도록 바꿔보겠습니다.

프롬프트: 
a witch, highly detailed face, half body, studio lighting, dramatic lighting, highly detailed clothing, looking at you, mysterious, dramatic lighting
BREAK
BREAK
(full moon:1.3)
BREAK
(beautiful fire magic: 1.2)
BREAK

아래는 그 결과입니다.

해보시면 아시겠지만, 구역 프롬프트를 사용한다고 해서 100% 지정된 위치에 나타나는 것은 아닙니다. 하지만, 많은 경우 원하는 방향대로 출력되므로 상당히 유용할 것 같습니다.

구역 프롬프트와 ControlNet을 함께 사용하기

구역 프롬프트는 각 구역별로 프롬프트를 지정할 수 있지만 전체 이미지 구성을 제어할 수는 없습니다. 이 기능을 수행할 수 있는 도구가 있습니다: 바로 ControlNet입니다.

지역 프롬프트와 컨트롤넷을 함께 사용하여 이 두 가지 도구를 사용하지 않고는 상상할 수 없는 수준의 조작을 구현한 두 가지 예를 살펴보겠습니다.

Text-to-Image

일단 아래와 같은 프롬프트를 입력해서 늑대를 데리고 있는 흑마법사가 만들어지길 기대해봅니다. 

모델 : Lyriel v1.5
프롬프트: a mysterious wizard , highly detailed face, highly detailed clothing, cinematic, dark, horror, worn stone wall, ancient symbol, old mystical torn scroll, wolf, many skulls
부정적 프롬프트: underage, immature, disfigured, deformed

멋진 이미지네요. 하지만, 제가 원하는 것에는 약간 부족합니다. 두루마리를 연구하고 있다고 좀 더 명확하게 해보겠습니다.

프롬프트: a mysterious wizard studying old mystical torn scroll, highly detailed face, highly detailed clothing, cinematic, dark, horror, worn stone wall, ancient symbol, wolf, many skulls 

조금 더 가까워졌습니다. 늑대가 저렇게 등장하리리고 예상은 못했지만요.하지만, 흑마법사의 자세를 좀더 원하는 대로 바꾸고 싶네요.

ControlNet 추가하기

콘트롤넷(ControlNet)이 무엇인지 잘 모르시거나, 아직 설치를 하지 않았다면 이 글을 읽어보시기 바랍니다.  이 글에서는 아래와 같은 이미지를 기준으로 진행하겠습니다.

ControlNet 참조 이미지
ControlNet 참조 이미지

참조 이미지를 ControlNet의 이미지 캔버스에 올립니다. 그리고 아래와 같이 설정한 뒤, [Generate] 버튼을 누릅니다.

ControlNet 설정
ControlNet 설정

자세 마음에 드네요. 모든 이미지가 앉아있도록 출력되었습니다. 그런데 왜 갑자기 Wizard가 Witch로 바뀌었는지는 모르겠네요. 절반이 마녀로 나왔습니다. 

이제 여기에서 출발해서 구역별로 소품을 배치해 보겠습니다.

구역 프롬프트 추가하기

다시 Regional Prompter에서 Active 체크박스를 켜주고 아래와 같이 설정합니다. 

구역 프롬프트 설정
구역 프롬프트 설정

구역별로 아래와 같이 배치하겠습니다. 오른쪽은 프롬프트입니다.

전체 이미지: 마법사

0번 구역 : 고대의 심볼이 새겨진 돌 벽

1번 구역 : 스크롤을 읽고 있는 마법사

2번 구역 : 돌 벽 옆에 있는 늑대

3번 구역 : 해골들
a mysterious wizard , highly detailed face, highly detailed clothing, cinematic, dark, horror
BREAK
worn stone wall, (ancient symbols :1.3)
BREAK
old mystical (torn scroll :1.2)
BREAK
worn stone wall, (wolf:1.5)
BREAK
(many skulls:1.5), blurry

참고로 몇몇 키워드에는 가중치를 증가시켰습니다. 아래가 그 결과입니다.

물론 모든 이미지마다 소품들이 잘 표현되는 건 아닙니다. 약 20장 정도중에 마음에 드는건 3-4장 정도네요. 그래도 이정도면 충분히 만족스럽습니다.

예제 2: 축구선수

예전에 open pose로 공차는 자세를 만들기는 했는데 공이 엉뚱한 곳에 배치되어 고생했는데, 이 방법을 사용하면 해결할 수 있겠다 싶어 시도해 봤습니다. txt2img 설정은 아래와 같습니다.

프롬프트:
photo of soccer male players, world cup, playground, stadium, refree, lots of viewer
BREAK
BREAK
BREAK
BREAK
BREAK
Soccer Ball
BREAK
부정적 프롬프트 : underage, immature, disfigured, deformed
Width: 768, Height:512

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

ControlNet 설정
ControlNet 설정

구역 프롬프트(Regional Prompter)설정은 아래와 같습니다.

구역 프롬프트 설정
구역 프롬프트 설정

이렇게 해서 만들어진 결과입니다. 마음에 안드는 부분은 많습니다만, 그래도 공의 위치는 20~30% 정도 가져오는 것 같네요.

예제 3: 옷색깔 지정하기

갈색머리, 노란 블라우스 파란 치마를 입은 여자 사진을 만들고 싶습니다. 쉬울 것 같죠? 하지만 이미 시도해보신 분이라면 아시겠지만, 상당히 까다롭습니다. 일단 일반적인 프롬프트는 다음과 같습니다.(사실적인 인물사진을 생성하는 방법에서 가져왔습니다)

모델: ChilloutMix
프롬프트: full body photo of young woman, natural brown hair, yellow blouse, blue dress, busy street, rim lighting, studio lighting, looking at the camera, dslr, ultra quality, sharp focus, tack sharp, dof, film grain, Fujifilm XT3, crystal clear, 8K UHD, highly detailed glossy eyes, high detailed skin, skin pores 
부정적 프롬프트: disfigured, ugly, bad, immature, cartoon, anime, 3d, painting, b&w

이 결과에서 보는 것처럼 모든 색상이 섞여버렸습니다. 약 20-30%정도는 맨 오른쪽 이미지처럼 원하는 색을 따르는 것도 있긴 했지만요.  보시는 것처럼 Stable Diffusion에게 정확한 색을 지정하는 것은 의외로 쉽지 않습니다.

하지만 구역 프롬프트를 사용하면 좀 더 쉽게 해결할 수 있습니다.

구역을 아래와 같이 3부분으로 나눠보겠습니다.

Divide Mode: Vertical
Divide ratio: 1,1,1.5
프롬프트: 
full body photo of young woman, busy street, rim lighting, studio lighting, looking at the camera, dslr, ultra quality, sharp focus, tack sharp, dof, film grain, Fujifilm XT3, crystal clear, 8K UHD, highly detailed glossy eyes, high detailed skin, skin pores
BREAK
natural brown hair
BREAK
(yellow blouse: 1.3)
BREAK
(blue skirt: 1.3)

약 70-80%가 색깔이 맞게 나오네요. 훨씬 좋아졌네요. 이럴 때 특히 구역 프롬프트가 좋은 것 같습니다.

구역 프롬프트를 창조적인 도구로 사용하기

구역 프롬프트가 없다면 전혀 불가능했을 이미지도 만들어 낼 수 있습니다.

아래는 이미지를 4부분으로 나누어 각각 봄 여름 가을 겨울을 표현한 예입니다.

Divide Mode: Horizontal
Divide ratio: 1,1,1,1
Use Common prompt: Yes
Model: Lyriel v1.5
프롬프트: 
a beautiful wild park, path to freedom, courage and love, national geographic photo of the year
BREAK
spring, trees, blossom, birds, green grasses, (sunny, wild flowers:1.2), god ray, clear sky
BREAK
thunderstorm, rain
BREAK
autumn leaves, falling leaves BREAK winter, heavy snow, barren trees

아래가 그 결과입니다. 어느 미술관에서나 봤음직한 예술작품이 탄생했네요. Great!!

Stable Diffusion - 봄여름가을겨울이 함께 있는 풍경1
Stable Diffusion - 봄여름가을겨울이 함께 있는 풍경2
Stable Diffusion - 봄여름가을겨울이 함께 있는 풍경1
Stable Diffusion - 봄여름가을겨울이 함께 있는 풍경3
Stable Diffusion - 봄여름가을겨울이 함께 있는 풍경2
Stable Diffusion - 봄여름가을겨울이 함께 있는 풍경3

Regional Prompter에 대한 더 상세한 내용은 원 개발자의 글을 읽어보시기 바랍니다. 여기에 쓴 것 보다 더 많은 기능이 있습니다. 그런데... 제가 조금 읽어봤는데, 안읽는 편이 좋겠네요. 너무 복잡해요.

===

이 글은 https://stable-diffusion-art.com/regional-prompter/ 를 번역하면서 필요에 따라 제마음대로 바꾸고, 더 넣기도 하면서 편집한 글입니다.