본문 바로가기
웹툰AI

Prompt matrix 사용법

by Kwoon 2023. 5. 30.
반응형

프롬프트 매트릭스는 프롬프트를 구역별로 나누어 독립 실행 시킬 수 있는 스크립트입니다. 사용 시 구문은 |로 쉬프트키와 원화표시키를 함께 눌러주면 키인 됩니다. 

 

예 : 프롬프트, 프롬프트, ... 프롬프트 | 프롬프트 | ...

 

프롬프트와 프롬프트 사이에 | 표시를 넣어주면 구분이 됩니다.

이 Prompt matrix는 말 그대로 프롬프트의 행렬입니다. SD1.5의 웹UI에서 프롬프트를 실행하여 이미지를 생성하는 경우 다음 이미지 생성 시에 이미 메모리에 로드된 이전 생성 이미지의 특성을 일정 부분 반영하는 것으로 보입니다.

 

Xformers 라이브러리의 설명에 보면, Xformers 라이브러리는 이미지 생성을 가속화하는 선택적 방법을 제공합니다. 이 개선 사항은 NVIDIA GPU에서만 사용할 수 있으며 이미지 생성을 최적화하고 비결정적 결과를 생성하는 대신 VRAM 사용량을 줄입니다.

 

여기서 비결정적 결과라는 것은 엑스포머를 사용하지 않을 때는 결정적 결과를 반영한다는 뜻으로 해석할 수 있습니다. 즉, V램에 로드된 이전 프롬프트의 특징을 일정 부분 반영한다는 것입니다.(프롬프트를 변경해 가면서 지속적으로 이미지 생성을 해보면 이미 제거된 프롬프트 구문이 계속 반영되는 것을 알 수 있습니다) 이것은 확정적으로 결론지을 수 있을만한 실험에 도달하지 못하였다는 점을 미리 알려 드립니다.

 

그럼 먼저 Prompt matrix를 호출하는 방법부터 알아보죠. 방법은 간단합니다.

웹UI창의 TXT2IMAGE에서 맨 하단에 보면 스크립트 선택창 메뉴가 있습니다. 기본은 NONE으로 되어 있지만 이걸 눌러보면 Prompt matrix 항목이 나타납니다. 이를 선택하면 Prompt matrix 사용준비가 됩니다.

위 그림은 Prompt matrix 호출하면 나타나는 옵션메뉴들입니다. 

 select prompt 항목은 Prompt matrix를 적용할 프롬프트창을 포지티브로 할 것이나 네거티브로 할 것이냐를 선택하는 메뉴입니다. 이는 토글처럼 어느 한쪽을 선택하여야 합니다. 기본은 positive로 선택되어 있습니다.

Select joining char는 결합할 문자의 구분을 위한 것인데 그대로 콤마로 둡니다. 

맨 아래 그리드 마진은 그대로 두어도 그리드에 정보가 입력이 됩니다.(이것은 예제 이미지에서 설명이 됩니다)

 

그리고 2가지 선택 옵션이 있는데, 이 옵션들은 비선택인 채로 그냥 두어도 무방 합니다.

 

Put variable parts at start of prompt : 이것은 프롬프트의 실행 순서를 바꾸는 옵션입니다. 시작 프롬프트의 특징을 가져올 것인가에 대한 선택인데, 앞서 엑스포머에 관한 이야기를 서두에 코멘트 한 것이 이와 관련되어 있기 때문입니다. 이 옵션의 의미를 알기 위해서는 Prompt matrix의 구동원리를 알아야 하는데요. 가령 1번 프롬프트 | 2번 프롬프트 | 3번 프롬프트 이런 식으로 프롬프트가 준비되어 있고 Prompt matrix 모드에서 이미지 생성을 시도하면 맨 먼저 1번 프롬프트만 참조해서 이미지를 생성합니다. 그리고 그 다음에는 1번과 2번을 참조해서 이미지를 생성하고, 다음엔 1번과 3번을 참조해서 이미지를 생성 합니다. 그리고 마지믹에 1, 2, 3을 모두 참조해서 이미지를 생성합니다.(뒤에 예제에서 프롬프트의 배열을 보여 드립니다)

 

여기서 3번 중심의 이미지를 뽑을 때 원칙적으로는 2번 프롬프트는 배제됩니다. 하지만 Put variable parts at start of prompt에 체크가 되어 있으면 3번을 뽑을 때 2번의 특징을 일부 반영 합니다. 원래는 이게 안되어야 하지만 실제로는 반영이 되는 경우가 많습니다. 여러 번 반복 생성을 통하여 특성을 관찰했는데, 원래 결정적 결과생성에 대한 반영이 있었는지는 모르지만 이 옵션을 체크했을 때와 하지 않았을 때의 차이의 편차가 있었습니다. 


Use different seed for each picture : 이 옵션은 시드값을 유지할 것인지에 대한 옵션인데 이를 체크해 두면 생성되는 이미지마다 각기 다른 시드를 부여합니다. 대략 끝자리 숫자가 바뀌더군요. 시드를 유지하느냐 그렇지 않느냐는 큰 차이가 있습니다. 시드를 유지 할 경우 1번 생성이미지의 시드를 참조하여 그것을 유지하려는 속성이 생기게 됩니다. 이 옵션은 이것을 막고 각기 별도의 시드를 생성하도록 하는 것입니다. 동일한 조건의 동일한 프롬프트에서는 시드가 같으면 동일한 결과 이미지가 생성이 될 확률이 매우 높습니다.

동일한 시드를 유지하고 있는 상태입니다.

Use different seed for each picture 옵션을 체크하여 시드유지를 하지 않은 경우입니다. 각 이미지의 시드가 변경된 것을 볼 수 있습니다.

 

여러 장의 이미지를 생성할 때 생기는 그리드 이미지입니다. Prompt matrix에서는 이 그리드 이미지에 실행된 프롬프트와 배제된 프롬프트가 나열이 됩니다. 

Prompt matrix에서는 프롬프트의 각 구역별로 각기 다른 로라를 적용할 수 있습니다. 위의 경우는 Put variable parts at start of prompt 체크를 끈 경우입니다.(기본 상태)

이 경우는 Put variable parts at start of prompt를 켜고 이미지를 생성하도록 한 경우 입니다. 프롬프트의 실행 순서에 따라 결과 이미지의 차이가 생깁니다.

 

((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, talking about , upper body, korean, 1boy)) | (1girl, long hair, study, crying, <lora:Aoi_2D:0.4>) | (1boy, short hair, smile, <lora:Lora-Custom-ModelLiXian:0.4>, lineart:0.35) 이것은 예제용 프롬프트 구성입니다. 매트릭스 구분선은 알아보기 쉽게 붉은색으로 바꿨습니다. 앞에서부터 구분선을 기준으로 1번 프롬프트, 2번 프롬프트, 3번 프롬프트로 호칭하겠습니다.

위 그림은 프롬프트가 수행되는 구조도 입니다. 먼저 Put variable parts at start of prompt를 켜고 이미지를 생성한 것에 대한 생성된 프롬프트를 보시죠. 프롬프트는 이미지 아래 순서대로 나열되어 있습니다.

((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, talking about , upper body, korean, 1boy)) 1번 프롬프트만 실행된 기본값입니다.

 

(1girl, long hair, crying, <lora:Aoi_2D:0.4>), ((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, upper body, korean, 1boy)) 이 경우 자신의 프롬프트 구문이 먼저 실행되고 뒤 이어 1번 프롬프트가 실행된 경우입니다.

(1boy, short hair, smile, <lora:Lora-Custom-ModelLiXian:0.4>, lineart:0.35), ((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, upper body, korean, 1boy))

이것 역시 자신의 프롬프트를 먼저 실행시키고 다음에 1번 프롬프트를 실행시켰습니다.

(1girl, long hair, crying, <lora:Aoi_2D:0.4>), (1boy, short hair, smile, <lora:Lora-Custom-ModelLiXian:0.4>, lineart:0.35), ((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, upper body, korean, 1boy))

이 것은 2번은 먼저, 그리고 3번, 맨 마지막에 1번을 실행시켰습니다.

 

 

Put variable parts at start of prompt 옵션을 끈  디폴트 상태로 이미지를 생성한 결과 입니다.

((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, talking about , upper body, korean, 1boy)) 1번 프롬프트가 실행된 기본상태입니다.

 

((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, talking about , upper body, korean, 1boy)) , (1girl, long hair, study, crying, <lora:Aoi_2D:0.4>) 이것은 이전 2번째 이미지와는 다르게 1번을 먼지 실행하고 자신의 프롬프트인 2번을 실행하였습니다. 즉 순서대로 실행 하였습니다.

 

((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, talking about , upper body, korean, 1boy)) , (1boy, short hair, smile, <lora:Lora-Custom-ModelLiXian:0.4>, lineart:0.35) 이 역시 1번을 먼저 실행하고 자신인 3번을 실행하였습니다.

 

((masterpiece, best quality, anime, cartoon, lineart:0.35, webtoon, drawing, white background, studio, talking about , upper body, korean, 1boy)) , (1girl, long hair, study, crying, <lora:Aoi_2D:0.4>), (1boy, short hair, smile, <lora:Lora-Custom-ModelLiXian:0.4>, lineart:0.35) 이것도 1번부터 순서대로 실행되었습니다.

 

Put variable parts at start of prompt의 차이를 이해할 수 있는 실험 결과입니다. 한 프롬프트 안에서 구분선을 이용하여 다양한 결과를 낼 수 있는 Prompt matrix는 매우 흥미로운 프롬프트 스크립트입니다.