AI 이미지/AUTOMATIC1111

Instruct Pix2Pix - 명령문으로 스타일 바꾸기

하늘이푸른오늘 2023. 7. 12. 16:23

Instruct Pix2Pix는 사용자의 문장 명령만으로 이미지를 편집할 수 있는 Stable Diffusion 모델입니다. 이 글에서는 사용방법과 원리 등을 알아보겠습니다. 아래는 목차입니다.

Insturct Pix2Pix로 가능한 것

Instruct Pix2Pix는 문장으로 원하는 바를 지시하기만 하면 이미지를 편집할 수 있는 혁신적인 방법입니다. 예를 들어 아래와 같이 말을 타고 있는 여성을 드래곤을 타고 있는 여성으로 바꾸고 싶다고 해보겠습니다. 

말을 타고 있는 여성 - Instruct Pix2Pix 입력
말을 타고 있는 여성 - Instruct Pix2Pix 입력

이 이미지와 "Turn the horse into a dragon"라는 명령을 주면, 아래와 같이 말을 드래곤으로 바꿔줍니다. 다른 부분은 건드리지 않고요.

드래곤을 타고 있는 여성 - Instruct Pix2Pix 의 결과
드래곤을 타고 있는 여성 - Instruct Pix2Pix 의 결과

Instruct Pix2Pix의 작동 원리

Instruct Pix2Pix의 원리를 알기 위해서는 (1) 모델 아키텍처와 (2) 학습 데이터에 대해 알아야 합니다.

모델 아키텍처

Instruct Pix2Pix는 스테이블 디퓨전의 모델입니다. image-to-image와 비슷하게 처음엔 입력된 이미지를 잠재공간(latent space)로 인코딩합니다.

모든 디퓨전 프로세스는 조건부여가 중요합니다. text-to-image 이나 image-to-image 에서는 하나의 조건부여, 즉 텍스트 프롬프트를 사용하여 이미지를 생성하게 됩니다(image-to-image에서 원본 이미지는 잠재 이미지(latent)로만 사용됩니다). 반면 Instruct Pix2Pix 의 경우에는 텍스트 프롬프트와 입력 이미지라는 두개의 조건부여가 주어집니다.(스테이블 디퓨전의 모델 아키텍처에 대해서는 Stable Diffusion에 대한 기본적인 이론을 읽어보시기 바랍니다.)

디퓨전 프로세스는 분류 자유도 척도(CFG, classifier free guidance) 메커니즘을 따릅니다. 하지만, Instruct pix2pix의 경우조건부여가 두가지(프롬프트와 이미지)가 있기 때문에, CFG 매개변수가 2개 있어야 합니다(하나는 프롬프트에 대한 CFG, 다른 하나는 이미지에 대한 CFG). 그래서 AUTOMATIC1111 GUI에는 text CFG 와 Image CFG 의 두개가 존재합니다. 

이 두가지  CFG 슬라이더의 의미는 일반 Stable Diffusion과 동일합니다. 즉, CFG 값이 낮으면 프롬프트나 이미지는 거의 무시되고, CFG 값이 높으면 프롬프트나 이미지를 더 많이 따라가게 됩니다.  참고로 여기에서 text CFG와 image CFG를 높이는 것은 정반대의 효과를 가져오게 됩니다. 즉, 텍스트 CFG 값을 올리면 이미지가 더 많이 변경되고, 이미지 CFG 를 높이면 이미지의 변경이 적어집니다. 원하는 효과를 얻으려면 이 두 값을 적절하게 조정해야 합니다.

학습 방법

이제 Instruct Pix2Pix를 학습시킨 방법을 알아보겠습니다. 이 작업에서 가장 혁신적인 것은 학습 데이터를 합성하는 방식이라고 생각됩니다.

아래 그림은 연구논문에서 가져온 것으로,  Instruct Pix2Pix의 학습방법을 잘 요약하고 있습니다.

Instruct Pix2Pix 학습방법
Instruct Pix2Pix 학습방법

먼저 특수 GPT-3 언어 모델을 학습시켜서 입력 캡션(input caption)에서 편집 명령어(editing instruction)와 편집된 캡션(edited caption)을 생성합니다. ChatGPT와 같은 대규모 언어 모델에서는 이러한 작업은 매우 간단합니다. 위 그림에서  "photograph of a girl riding a horse"이라는 캡션을 GPT-3에 입력하면, (1) 명령: "have her ride a dragon(용을 타게 하라)"과 (2) 편집된 캡션: "photograph of a girl riding a dradon(용을 탄 소녀의 사진)"의 두가지 메시지를 얻게 됩니다.

이 시점에서 캡션과 편집 캡션은 아직 평문입니다(언어모델의 입력과 출력일 뿐이죠). 우리는 이들을 이미지로 바꾸어야 합니다. 아마도 스테이블 디퓨전을 위한 프롬프트로 사용하여 두개의 이미지를 얻는 것으로 생각할 수도 있겠지만, 이 경우 전 이미지와 후 이미지가 전혀 닮지 않는 다는 문제가 있습니다. 아래 그림에서 왼쪽이 이런 상황을 표현하고 있습니다(이 그림도 연구 논문에 들어 있는 이미지입니다).

Prompt-to-Prompt 를 적용했을때와 아닐 때의 비교
Prompt-to-Prompt 를 적용했을때와 아닐 때의 비교

이대신 논문 저자들은 Prompt-to-Promt 모델을 사용하였습니다. 이 모델은 비슷한 이미지를 합성하기 위한 디퓨전 모델로, 편집 전 이미지와 편집 후 이미지를 생성합니다. 이제 이전 이미지(입력)과 편집 명령(입력) 그리고 편집후 이미지(출력)이 준비되었습니다. 이들을 학습 예제로 모델에 입력할 수 있습니다. 

이와 같은 학습 데이터 생성은 완전히 합성된 것이므로, 계속 반복적으로 실행해서 수십만개의 학습 예제를 생성할 수 있습니다. 바로 이런 방법을 사용했으며, 이 때문에 모델이 잘 훈련된 것입니다.

다른 방법론과의 차이

Prompt-to-Prompt 는 특정한 편집을 통해 비슷한 이미지를 생성할 수 있지만, 모든 이미지는 텍스트 프롬프트에서 생성됩니다. Instruct pix2pix와는 달리 생성되지 않은 이미지는 편집할 수 없습니다.

Image-to-Image(일명 SDEdit)는 AI가 생성하지 않은 이미지를 입력으로 사용하고, 다른 프롬프트를 사용하여 이미지를 편집할 수 있습니다. 하지만 어떤 부분은 변경시키지 않고 정밀하게 편집하는 것은 거의 불가능합니다.

AUTOMATIC1111에 설치하는 방법

이제 AUTOMATIC111에서 Instruct pix2pix를 사용하는 방법을 알아보겠습니다. 먼저 Instruct pix2pix의 Hugging Face 페이지에서 모델을 다운로드 받습니다. 체크포인트 파일을 받으셔도 되고, safetensors 파일을 받으셔도 됩니다. 이 파일을 스테이블 디퓨전 모델이 들어있는 폴더(아래)에 넣어줍니다. 

stable-diffusion-webui/models/Stable-diffusion

AUTOMATIC1111에서 Instruct pix2pix를 사용하는 방법

1. 모델 선택: 먼저 아래와 같이 instruct-pix2pix-.....ckpt(또는 safetensors) 모델을 선택합니다. 복사해 넣었는데도 안보이면 오른쪽에 있는 하늘색 Refresh 버튼을 눌러주면 됩니다.

Instruct pix2pix 모델 선택
Instruct pix2pix 모델 선택

2. img2img 탭으로 들어갑니다.

3. img2img 탭 아래 아래에 img2img 서브탭 입력 캔버스에 이미지를 불러옵니다. 파일 포맷은 PNG 또는 JPG 포맷을 사용합니다. 적당한 이미지가 없다면 아래 이미지 사용하셔도 됩니다. 17세기 중반 요하네스 베르메르가 그린 명작 "진주 귀고리를 한 소녀"입니다. 

진주 귀고리를 한 소녀
진주 귀고리를 한 소녀

4. 프롬프트에 "Put a sunglasses on her"라고 명령어를 입력합니다.

5. 이미지 사이즈를 적절하게 설정합니다. 원본의 크기가 900x1056 이라서 비율에 맞춰 512x600으로 설정했습니다(아래 그림에서 오른쪽 아래에 있는 삼각형 버튼을 누르면 입력된 이미지와 동일한 크기로 설정되는데, 이렇게 해보니 선글라스가 잘 안그려지더군요).

6. 아래가 설정상태입니다. 이제 [Generate] 버튼을 누릅니다.

Instruct pix2pix 설정
Instruct pix2pix 설정

아래는 생성된 이미지입니다.

선글라스를 착용한 진주 귀고리를 한 소녀
선글라스를 착용한 진주 귀고리를 한 소녀

Instruct pix2pix 를 위한 파라미터 

생성할 이미지 매수(Batch Size/Batch count) : 4. 위의 이미지는 상당히 잘 나오는 편이지만, 잘 안되는 경우도 빈번합니다. 여러 장을 뽑아서 선택하는 것이 좋습니다.

샘플링 단계(Sampling steps) : 20~30 정도면 적당한 것 같습니다.

시드 값(Seed) : 시드 값에 따라 편집이 달라집니다. 여러가지 이미지를 생성할 때에는 무작위 시드(-1)을 사용하고, 프롬프트 CFG값 등을 변경하면서 효과를 살펴볼 때는 시드 값을 고정시키는 게 좋습니다.

Text CFG : txt2img에서 CFG 척도와 동일합니다. 이 값을 크게하면 프롬프트를 따르는 확률이 높아지고, 작게하면 프롬프트를 덜 따르게 됩니다.

Image CFG : 이미지 조건부여에 대한 CFG 척도입니다. 이 값을 크게하면 변화가 적게 일어나고, 작게하면 더 많이 변경되게 됩니다.

아래는 X/Y/Z plot 스크립트를 사용해서 Text CFG와 Image CFG를 여러가지로 변경시켜가며 효과를 알아본 이미지 매트릭스입니다. 보시는 것처럼 TextCFG를 올리고 Image CFG를 낮출수록 많은 변화가 생기는 것을 알 수 있습니다(생성된 이미지가 마음에 든다는 뜻은 아닙니다 ㅠ). 

이 이미지의 원본은 아래와 같습니다. 

미켈란젤로의 다비드 상
미켈란젤로의 다비드 상

그리고 생성 파라미터는 아래와 같습니다. 그런데... 조금 더 사이보그 느낌이 났으면 해서 여러가지 샘플러를 바꿔가며 시도해 봤는데, 그다지 변함이 없네요. 아쉽습니다.

모델: instruct pix2pix... ckpt
프롬프트: Turn him into a cyborg
샘플러: DPM++ 2M Karras
CFG 스테일:  10                  Image CFG Scale: 1
이미지 크기 : 512x512         Resize mode: crop and resize

사이보그 다비드상
사이보그 다비드상

Instruct pix2pix 활용사례

사진 편집

Instruct pix2pix는 사진을 편집하도록 학습되었으며, 결과도 꽤 훌륭합니다. 아래의 이미지를 사용해 테스트해보겠습니다. 이 이미지는 "Stable Diffusion을 이용해 사실적인 인물 사진을 생성하는 방법" 중에서 가져온 이미지로, ChilloutMix 모델을 사용했습니다. 

ChilloutMix - 테이블 앞에 앉아있는 여인
ChilloutMix - 테이블 앞에 앉아있는 여인

아래는 여러가지 사진 편집 결과입니다.

change her cloth to dark blue change her to a man
change her arm to robotic change her to lego
change her cloth to snake put a sunglasses on her

위에서 보는 것처럼 명령이 항상 잘 먹히는 것은 아닙니다. 첫번째 옷색깔 바꾸는 예의 경우, 빨간색 노란색 등 다른 색을 지정하면 아예 이상하게 나오고, 남자로 바꾸기는 혐오스러운 결과가 나왔으며, 로봇 팔로 바꾸기, 레고로 바꾸기 등은 전혀 반응을 하지 않았고요. 일부 잘 먹힌 것도 있기는 하지만, 제 판단에 이정도라면 성공률이 30% 이하일 것 같다고 보입니다.

의도하지 않은 변화

몇가지 편집, 특히 색과 관련된 변경의 경우, 번짐 효과가 있습니다. 예를 들어 위의 이미지를 보면, 옷 뿐만 아니라 테이블  까지 진청색으로 변했고, 노란색 옷으로 바꾸라고 지시를 했더니 사진 전체가 노란색이 되는 결과가 만들어졌습니다.  또한 로봇팔로 만들라는 예의 경우, 손은 바꿔지지 않고 그릇이 변경되는 경우도 발생했고요. 뱀가죽 무늬 옷으로 변경시켰더니 맥주 잔 위에 뱀이 또아리를 틀었네요. ㅎ

전체적으로 그다지 나쁜 것은 아닌데, 그래도 원하지 않는 변화까지 추가되어서 활용에는 조심스러울 것 같습니다. 만약 이런 변화를 원하지 않으면 마스크를 사용하는 방법도 있을 것 같네요.

사진 스타일 바꾸기

image-to-image 를 사용해서 스타일을 바꾸는 방법도 좋지만, Instruct pix2pix 의 경우엔 원래의 이미지 내용을 아주 잘 보존해주기 때문에 다른 방법보다 좋은 듯 합니다. 아래에서 보시면 아시겠지만, Instruct pix2pix 의 경우엔 스타일을 변경해도 원래의 인물이 그대로 남아 있게됩니다.

스타일을 바꿀 때에는 다음과 같은 프롬프트를 사용하되, 밑줄 친 부분에 원하는 스타일을 넣으면 됩니다.

change to _____ style

아래는 몇가지 예입니다. 다만, Image CFG 값을 올리면 변화가 덜 일어나고 내리면 원본과 너무 달라질 수 있다는 점을 고려하면서 시험해 보는 게 좋을 것 같습니다. 아래 그림들은 Image CFG 를 0.9~1.0 사이에서 생성하였습니다.

Van Gogh Alphonso Mucha
Da Vinci Auguste Renoir
Cartoon Pointillism
3D cubism

확실히 Image-to-Image 로 스타일을 바꾸는 것보다 나은 것 같네요.

명령어 템플릿

아래와 같은 형태로 명령어를 입력할 수 있습니다. 다른 형태도 물론 가능하며, 여러가지로 테스트해보시는 게 좋습니다.

  • Change the Style to (an artist or style name)
  • Have her/him (doing something)
  • Make her/him look like (an object or person)
  • Turn the (something in the photo) into a (new object)
  • Add a (object)
  • Add a (object) on (something in the photo)
  • Replace the (object) with (another object)
  • Put them in (a scene or background)
  • Make it (a place, background or weather)
  • Apply (a emotion or something on a person)

ControlNet ip2p Extension

Instruct pix2pix 는 이와 같이 img2img에서도 사용할 수 있지만, ControlNet 에서도 사용할 수 있게 되었습니다. 

이 글은 https://stable-diffusion-art.com/instruct-pix2pix/ 을 새로운 버전에 맞게 수정하여 작성한 글입니다.

민, 푸른하늘