AI 이미지/Stable Diffusion

Stable Diffusion - 부정적 이미지 프롬프트

하늘이푸른오늘 2024. 1. 19. 21:20

스테이블 디퓨전을 비롯한 많은 AI 이미지 생성기는 이미지를 프롬프트로 사용해서 비슷한 이미지를 생성하는 기능(이미지 프롬프트(image prompt)이 존재합니다. (AUTOMATIC1111에서는 이 글을 참고하세요) 일반적으로는 텍스트 프롬프트에 이미지에 추가하고자 하는 내용을, 부정적 프롬프트에 넣고 싶지 않은 내용을 지정합니다. 그런데, 이미지 프롬프트와 마찬가지로 이미지를 사용하여 내가 표현하고 싶지 않은 것을 지정하는 "부정적 이미지 프롬프트(negative image prompt)"가 있다면 어떨까요?

이 글에서는 스테이블 디퓨전에서 부정적 이미지 프롬프트를 구현하는 방법과, 재미있는 사례 몇 가지를 소개해 드립니다. 

예를 들면, 아래 그림에서는 맨 왼쪽 사진에서 가운데 있는 잔디를 빼라고 지시하자 맨 오른쪽에 있는 눈덮힌 집이 나오는 예입니다.

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

스테이블 디퓨전에서 이미지 프롬프트

스테이블 디퓨전에서 이미지 프롬프트를 사용하는 방법은 여러가지가 있습니다.

img2img도 따지고 보년 가장 원시적이기는 해도 이미지 프롬프트의 일종입니다. img2img는 일반 이미지를 잠재 이미지(latent image)로 변환하고 잡음을 추가한 뒤, 이것을 잡음 제거(denoising)을 위한 기본 잠재 이미지로 사용하는 것입니다. 이렇게 하면 원래의 이미지의 색깔과 구도와 비슷한 이미지가 생성됩니다.

콘트롤넷 Reference-only를 사용해 비슷한 이미지를 생성하는 방법도 있습니다. 이것은 참조 이미지를 모델에 통과시키고, 그 중간 이미지를 교차인지 레이어의 잠재 이미지에 추가하는 방식입니다.??? 

IP-adapter(Image Prompt adapter)는 스테이블 디퓨전에서 이미지 프롬프트를 활성화시키는 신경망 모델입니다. 간단하면서도 효과적이죠. IP-adapter는 참조 이미지로부터 특질을 추출하는 모델을 사용합니다. 그 다음 이 특징을 텍스트 프롬프트에서 재사용하는 것이 아니라, 별도의 교차인지 신경망에 사용합니다. 

IP adapter 모델 (출처: 논문)

이 세가지 중에서 IP-adapter 가 가장 좋은 결과물을 만들어 냅니다.

부정적 프롬프트에 대한 간단한 역사

부정적 프롬프트에 도달하는 방법은 매우 흥미롭습니다.

먼저 디퓨전 기반의 AI 이미지 생성기는 무작위적인 고품질 이미지를 생성할 수 있습니다 하지만, 원하는 것을 제어할 방법은 없죠. 이 경우에는 학습데이터와 닮은 이미지를 생성하는 것 뿐입니다.

여기에서 무분류기 안내척도(CFG, Classifier-Free Guidance)가 역할을 합니다. CFG는 교차인지 레이어를 납치해서 샘플링 단계에 텍스트 임베딩(text embeddings)을 주입합니다. 이제 모델은 이미지와 캡션(문자, 프롬프트) 쌍을 사용해 학습시킵니다. 그 다음 이미지를 생성하게 되면 모델은 이미지가 프롬프트로 향하고 무작위 이미지가 멀어지는 쪽으로 유도합니다. 

부정적 프롬프트를 사용하지 않는 샘플링

모두 학문적인 이론일 뿐이었습니다. 하지만 스테이블 디퓨전이 공개되면서 모든 것이 변화했습니다. 스테이블 디퓨전은 오픈소스에 무료이고 저성능 컴퓨터에서도 돌릴 수 있었습니다. 많은 사람들이 사용하기 시작했고 이제 논문이 공개되기를 기다리는 게 아니라, 소프트웨어를 사용해 원하는 것을 직접 건드릴 수 있게 되었습니다.

코드가 즉시 공개되었습니다. 반복은 빨랐습니다. 그 다음 AUTOMATIC1111은 무분류기 안내를 해킹하여 부정적 프롬프트를 사용할 수 있도록 만들었습니다.

아주 간단한 생각이었습니다. 무작위 이미지로부터 멀어지도록 유도하는 게 하니라, 부정적 프롬프트로 기술된 이미지로 부터 멀어지도록 유도하는 것입니다. 기술적으로는 그냥 조건 없는 잠재 이미지(unconditioned latent image) 를 제거하고, 부정적 프롬프트로 조건부여된 이미지로 대체하는 것입니다. 

부정적 프롬프트를 사용한 샘플링

이렇게 부정적 프롬프트가 탄생했습니다. 단지 샘플링 단계가 변화된 것 뿐이니, 새로운 모델을 훈련시킬 필요가 없습니다.

부정적 이미지 프롬프트(Negative image prompt)

부정적 프롬프트를 만들어냈던 기법은 이미지에도 적용할 수 있숩니다. 부정적 이미지를 임베딩으로 인코딩한 후, "무조건(unconditioned) 잠재이미지 의 샘플링 단계에 넣어주면 되는 거죠.

이것이 바로 부정적 이미지 프롬프트(negative IP-adapter)가 하는 일입니다. 

이러한 아이디어에 근거해 IP-adapter를 이용한 부정적 이미지 프롬프트(논문 링크)를 구현했습니다. 부정적 이미지 프롬프트는 텍스트 프롬프트가 없이 사용할 때 가장 효과적입니다. 이 경우 조건부여(conditioning)은  긍정적 이미지 프롬프트와 부정적 이미지 프롬프트만을 기반하게 됩ㄴ디ㅏ.

단독주택 사진에서 잔디를 빼날 수 있습니다. 그러면 눈내린 겨울의 주택이 됩니다. 이 사진에서 첫번째 사진은 긍정적 이미지 프롬프트(image prompt)용 사진, 두번째는 부정적 이미지 프롬프트(negative image prompt)용 사진입니다. 마지막은 이 두 장의 사진을 사용해 스테이블 디퓨전이 생성한 사진입니다.

이와 비슷하게 거리 이미지에서 차를 없앨 수 있습니다.

심지어는 아래와 같이 어떤 얼굴에서 다른 얼굴을 빼내버리는 것도 가능합니다!

데모 사용법

Colab 데모를 사용해 직접 테스트해보실 수 있습니다.

Github 저장소에 들어갑니다. Usage 영역 아래에 있는 [Open in Colab]을 클릭합니다.

두개의 셀을 실행시킵니다. 왼쪽위의 삼각형을 클릭해주면 됩니다. 실행이 완료되면 왼쪽에 초록색 체크마크가 나타납니니다.

노트북 출력물 맨끝에 있는 gradio.live 링크를 따라가면 데모를 시작할 수 있습니다.

그런데 유감스럽게도 저는 오류가 나서 직접 해보지를 못했네요. ㅠㅠ

기본 사용법

좌측의 "Image Prompt" 캔버스에 긍정적 프롬프트에 해당되는 이미지를 업로드하고, 그 우측의 "Negative Image Prompt" 캔버스에는 부정적 프롬프트에 해당하는 이미지를 업로드합니다. 프롬프트나 부정적 프롬프트 등은 그대로 두고, [Generate]  버튼을 누르면 이미지가 생성됩니다.

위의 데모에서는 Realistic Vision 모델을 사용하였습니다.

고급 사용법

원하시면 이미지 프롬프트와 함께 프롬프트와 부정적 프롬프트를 사용할 수 있습니다. 이때 이미지 프롬프트의 가중치를 조절하면 텍스트 프롬프트와 이미지 프롬프트간의 영향을 제어할 수 있습니다.

또 Advance Option에서 IP-adapter 대신 IP-adapter Plus 모델로 바꿔서 실행시켜보실 수도 있습니다. IP-adapter Plus는 이미지에서 특징을 추출하는, 보다 고급 모델을 사용합니다. 이것을 사용하면 참조 이미지와 더 비슷하게 됩니다.

기타 설정은 아래와 같습니다.

  • Image prompt weight : 이미지 프롬프트와 텍스트 프롬프트의 상대적인 가중치 효과
  • Starting step : 이미지 프롬프트를 적용하는 첫번째 단계. 0은 맨처음 단계, 1 은 맨 마지막 단계임
  • Ending step : 이미지 프롬프트 적용을 마치는 단계. 0은 맨처음 단계, 1 은 맨 마지막 단계임
  • CFG Scale : 무분류기 안내 척도는 생성되는 이미지가 원본 이미지 및 텍스트 프롬프트를 얼마나 잘 따를지를 결정합니다. 높은 값을 부여할 수록 원본/텍스트를 잘 따릅니다.

기술적 사항

IP-adapter는 이미지에서 특징을 추출하기 위한 머신 러닝 모델을 사용합니다. 원래의 IP-adapter는 CLIP vision 모델과 간단한 프로젝션 레이어를 사용해 이미지 특징을 추출합니다.

이미지의 특징은 텍스트 프롬프트의 임베딩과 유사합니다. 따라서 이미지 생성시 이미지 특징을  잡음 제거 프로세스에 조건 부여(conditioning) 으로 사용할 수 있ㅅ브니다.

IP-adapter 기법은 디퓨전을 조건부여하기 위해 자체적인 교차인지 행렬을 학습시킵니다. 동일한 행렬이 긍정적 이미지 프롬프트 및 부정적 이미지 프롬프트 모두에 사용됩니다.

무분류기 안내 척도를 사용할 때에는 각 이미지 생성을 위해 두개의 잠재 이미지를 잡음제거할 필요가 있습니다. 하나는 텍스트 프롬프트로 조건부여된 것이고, 나머지는 조건부여되지 않은 것입니다. 잠재 이미지는 이 두가지의 차이가 가리키는 방향으로 이동하게 됩니다.

부정적 프롬프트는 조건부여되지 않은 잠재 이미지를 해킹합니다. 부정적 프롬프트는 이제 "조건부여되지 않은" 잠재 이미지를 조건부여로 사용합니다. 이미지는 프롬프트와 더 가까워지고 부정적 프롬프트와 멀어지게 됩니다.

이런 방법을 IP-adapter에도 적용할 수 있습니다. 파이프라인은 먼저 긍정적 이미지 프롬프트와 부정적 이미지 프롬프트로부터 특징을 추출합니다. 이렇게 생성된 긍정적 특징은 조건부여 잠재이미지를 조건부여하는 데 사용되고, 부정적 특징은 "조건부여되지 않는 " 잠재 이미지를 조건부여하는 데 사용됩니다.

따라서, 잠재 이미지는 이미지 프롬프트를 향해, 부정적 이미지 프롬프트를 멀리하는 방향으로 이동하게 됩니다.

이상입니다.

이 글은 https://stable-diffusion-art.com/negative-image-prompt/ 를 번역한 글입니다. 직접 테스트를 못해봤는데 나중에 가능해지면 다시 수정하겠습니다.

민, 푸른하늘

====