AI 이미지/AUTOMATIC1111

스테이블 디퓨전 - A1111 인페인트 가이드

하늘이푸른오늘 2023. 6. 28. 13:14

이 글은 스테이블 디퓨전 초보자 가이드 중 세번째 글입니다.

모델이 정말 좋고, 프롬프트도 잘 만들었다고 해도, 한번에 완벽한 이미지를 얻기는 쉽지 않습니다. 이럴때 인페인트(Inpainting)기법을 사용하면 작은 결점은 쉽게 고칠 수 있습니다. 이 글에서는 몇가지 예를 들며 인페인트를 사용해 결함을 수정하는 방법을 설명합니다.

참고 : 최근에 작성한 인페인트 완벽 가이드 글도 읽어보세요~

기본적인 인페인트 설정

원본 이미지는 다음과 같은 프롬프트를 사용한 것입니다.

모델: DreamShaper
프롬프트: [emma watson: amber heard: 0.5], (long hair:0.5), headLeaf, wearing stola, vast roman palace, large window, medieval renaissance palace, ((large room)), 4k, arstation, intricate, elegant, highly detailed 
부정적 프롬프트: ugly, tiling, poorly drawn hands, poorly drawn feet, poorly drawn face, out of frame, extra limbs, disfigured, deformed, body out of frame, bad anatomy, watermark, signature, cut off, low contrast, underexposed, overexposed, bad art, beginner, amateur, distorted face, b&w 
CFG: 7
Sampling Steps:25
Image Size: 768*512

원본 이미지 생성을 위한 설정

위 프롬프트에서  [emma watson: amber heard: 0.5]는 Emma Watson 얼굴과 Amber Heard의 얼굴을 5:5로 섞으라는 뜻이며, ()는 해당 키워드를 강조하라는 의미입니다. 아래는 이렇게 생성된 이미지입니다. 

원본 이미지

그런데 보시는 것처럼 얼굴이 이상합니다. Restore Face 옵션을 켰는데도 말이죠. Emma Watson 얼굴과 Amber Heard의 얼굴을 섞으라고 했는데, 제가 사용한 모델인 DreamShaper 가 사실적 사진과 컴퓨터 그래픽 중간쯤이라서 배우의 얼굴에 취약한 것 같네요. 그래서 이 상태에서 다른 모델로 바꿔보도록 하겠습니다.

인페인트 모델(옵션)

인페인트를 위해 학습된 스테이블 디퓨전 모델이 있다는 걸 아시는지? 최적의 결과를 얻으려면 이 모델을 사용하는 것이 좋습니다. 물론 원래 이미지를 생성했을 때 사용했던 모델을 그대로 사용해도 무방합니다. v1.5 인페인트 모델을 설치하려 모델 체크포인트 파일을 다운로드 받아 아래의 폴더에 넣어주시면 됩니다.

stable-diffusion-webui/models/Stable-diffusion 

그 다음  아래와 같이 AUTOMATIC1111에서 모델 선텍하는 드롭다운 메뉴 옆에있는 새로고침 버튼을 클릭하고, 드롭다운 메뉴를 눌러 sd-v1-5-inpainting.ckpt 를 선택해주면 해당 모델이 활성화됩니다.

인페인트 마스크 생성

생성된 그림중에서 수정하고 싶은 이미지가 있다면, 해당 그림 아래의 [Send to inpaint] 버튼을 누릅니다.

Send to Inpaint  버튼

다른 이미지를 수정하고 싶다면, 인페인트 탭을 누르고 캔버스를 클릭해 원하는 이미지를 불러올 수도 있습니다. 그러면 아래와 같은 상태가 됩니다. 여기에서 마우스로 까만 점을 드래그하면서 새로 그리고 싶은 곳을 칠해주면 됩니다. 이 때 오른쪽위에 있는 버튼 4개중 아래쪽 버튼을 클릭하면 까만 점(브러시)의 크기를 변경할 수 있습니다.

Inpaint 화면

아래가 이렇게 생성한 마스크입니다. 아래 설정을 보시면 아시겠지만, 마스크 내부만 혹은 마스크 바깥쪽만 변경시키는 방법도 있지만, 이미지 전체를 변경시킬 수도 있습니다. 그래서 아래쪽에 있는 머리카락에 마스크를 지정하지 않아도, 필요하다면 여기까지 변경됩니다.

완성된 Inpaint 마스크

인페인트 설정

프롬프트

프롬프트는 원래의 프롬프트를 그대로 사용합니다. 물론 새로운 이미지를 불러왔다면 필요한 프롬프트를 새로 입력해야겠죠. 이때 프롬프트는 txt2img 에서 입력하는 프롬프트와 동일하게 입력하면 됩니다. 자세한 내용은 여기를 읽어보세요.

이미지 크기

이미지 크기는 원래의 이미지와 동일한 크기로 설정합니다.(저의 경우엔 768x512입니다)

얼굴 복원(Face restoration)

얼굴을 새로 그릴 예정이라면 Restore face옵션을 켭니다. 설정(Settings)에서 Face restore model을 클릭하면 모델을 선택할 수 있는데, 기본으로 설정된 CodeFormer 으로 훌륭하게 작동합니다.

하지만, 이 옵션을 사용한다고 해서 항상 얼굴이 깔끔하게 나온다는 뜻은 아닙니다. (위의 그림도 restore face 옵션을 사용했음에도 이상하게 생성된 겁니다.)  또한 모델 스타일과 다른 형태로 생성될 수도 있습니다.

마스크 모드(Mask mode)

[Inpaint masked]는 마스크로 칠해둔 부분을 새로 생성한다는 뜻이고, [Inpaint not masked] 는 그 반대입니다. 이 예제에서는 Inpaint masked 를 선택합니다.

인페인트 지역(Inpaint Area)

[Whole picture]는 마스크한 지역이외의 바깥쪽도 새로 그린다는 뜻이고, [Only masked]는 마스크로 덮은 지역만 새로 그린다는 뜻입니다. 저는 대부분 [Whole picture]를 사용합니다. 이 옵션을 사용해도 마스크 바깥지역은 그다지 영향을 많이 바디 않습니다.

마스크 콘텐트(Mask content)

대부분의 경우 [original]을 선택합니다. 원래의 이미지(마스크로 가려진 부분)에 있던 색과 형태를 기반으로하여 새로운 형태를 사용한다는 뜻입니다. 

[latent noise] 또는 [latent nothing]을 사용하면 원래 이미지와 완전히 다른 무엇인가를 재생성합니다. 이렇게 하면 마스크 내부의 원본 이미지는 완전히 무시하고 새로운 잡음을 넣어 생성하게 됩니다.

잡음 제거 강도(Denoising strength)

잡음 제거 강도란 원본 이미지와 비교해 얼마나 많이 변경시킬 것인지를 제어하는 옵션입니다. 0으로 설정하면 마스크로 가려두었던 원본이 그대로 나타나게 되고, 1로 설정하면 원본과 아무런 관련없는 내용으로 새로 그리게 됩니다. 대부분 0.75가 출발점으로 좋습니다. 결과물이 마음에 안든다면 이 값을 조금씩 조정해 가면 됩니다.

여기에서 조절이 가능하기 때문에 위의 마스크 콘텐트에서 [latent noise]를 사용하지 않고 [original]을 사용하라고 추천한 것입니다.

아래는 이와 같은 사항을 반영한 설정입니다.

Inpaint 설정

아래는 인페인트를 실행한 결과중에서 그나마 잘 나온 것을 몇개 추린 것입니다. 그런데 인페인트를 할 때마다 느끼지만, 좋은 결과가 나오는 비율이 그다지 높지 않았습니다. 좀 불만스럽네요.

물론 더 수정하고 싶다면 다시 인페인트를 돌려도 됩니다. 필요하다면 몇번씩 반복해도 무방하고요. 하지만, 이정도로 만족하겠습니다. 아래는 원래 사진과 위의 오른쪽 사진을 비교해 본 것입니다. 원본과 비교하니 수정이 확실하네요.

아래는 제가 인페인트로 생성한 사진을 모두 모아 움짤로 만들어 본 것입니다. 보시는 것처럼 전체 이미지를 재생성하라고 설정했음에도 마스크 바깥쪽은 그다지 변하지 않음을 알 수 있습니다.

Inpaint로 생성된 이미지 모음

기존 이미지 수정하기

자신이 촬영한 사진이든, 인터넷에서 찾으신 사진이든 마음에 안드는 부분이 있다면 인페인트를 사용해 수정할 수 있습니다. 아래는 제가 구글 검색으로 가져온 사진입니다. 워터마크까지 있어서 사실 이렇게 해서는 안되지만, 극악한 사진도 수정할 수 있다는 걸 보여드리기 위해서 선택했습니다.

원본 사진- 두명의 등산객과 워트마크가 많음

이 사진을 인페인트에 올리고 아래와 같이 마스크를 만들었습니다.

인페인트 마스크

이렇게 가져온 사진은 프롬프트가 없습니다. 그래서 프롬프트를 새로 만들어야 합니다. 일단, [Generate] 버튼 옆에 있는 [Interrogate CLIP] 버튼을 눌러줍니다. 이 버튼은 그림을 분석해서 적절한 프롬프트를 만들어줍니다. ([Interrogate DeepBlue]도 비슷한 기능을 합니다.) 아래는 이렇게 생성된 프롬프트입니다. 보시는 것처럼 마스크를 칠한 뒤에 눌렀음에도 원본 이미지를 사용해 프롬프트를 만들어주므로, 남녀가 하이킹하는 내용으로 나옵니다.

two people hiking up a hill with the sun shining on them stock photo and royalty photo of a couple hiking up a hill with the sun shining on them, Bascove, cinematic landscape, a stock photo, romanticism

그래서 관련없는 내용은 조금 지우고 아래와 같이 핵심적인 내용만 뽑아 내 편집을 했습니다. ocean in distance 는 추가했고요.

a hill with the sun shining, Bascove, cinematic landscape, romanticism, ocean in distance

이대로 사용해도 되지만, 좀더 괜찮은 프롬프트를 만들고 싶어서 chatGPT에 아래와 같이 입력해서 프롬프트를 만들어 달라고 했습니다. (chatGPT를 사용한 프롬프트 생성방법은 이 글을 읽어보세요)

 
"a hill with the sun shining, Bascove, cinematic landscape, romanticism, ocean in distance" 이 프롬프트를 예시로 해서, 좀 더 멋있는 작품이 나올 수 있게 프롬프트를 만들어줘. 주어와 동사가 없는 영어 문구로 구성해야해.

이렇게 입력해도 문장 형태의 여러가지 수식이 많은 프롬프트가 만들어집니다. 

A sunlit hilltop overlooking the vast expanse of the ocean in the distance, inspired by the enchanting style of Bascove. The composition captures a cinematic landscape with a touch of romanticism, inviting viewers to immerse themselves in the breathtaking beauty of nature. The warm sunlight casts a golden glow, illuminating the rolling hills and creating a sense of serenity and tranquility. The artwork exudes a timeless charm, evoking a deep appreciation for the wonders of the natural world.

이걸 약간 축약시켜 달라고 한뒤, 좀 더 필요하다 싶은 걸 추가해서 최종적으로 아래와 같이 프롬프트를 만들었습니다.

A sunlit hilltop, cinematic landscape,  romanticism, Bascove, sun shining, mountains and ocean in the distant, sunset, golden glow of serenity.

이 것을 프롬프트에 넣고, 다른 설정은 위와 비슷하게 둔 상태로(콘텐트는 original에서 latent noise로 바꿨습니다. 이유는 아래를 읽어보세요.) 실행시켰습니다. 아래는 결과중 몇가지입니다. 몇장은 여전히 워터마크가 있는 것도 있지만, 괜찮게 만들어진 이미지도 나오네요.

중요 인페인트 매개변수

잡음 제거 강도(Denoising strength)

잡음 제거 강도는 최종 이미지가 원본 콘텐트를 얼마나 반영할지를 제어합니다. 0으로 설정하면 아무것도 변화하지 않고, 1로 설정하면 관계없는 이미지가 생성됩니다. 아래는 잡음 제거 강도를 달리했을 때 발생하는 이미지의 변화를 보인 것입니다.

잡음 제거 강도와 최종 이미지의 관계

CFG 척도

text-to-image 와 마찬가지로 CFG(분류 자유도 척도, Classifier Free Guidance scale)은 최종 이미지가 프롬프트를 얼마나 따르느냐를 결정하는 매개변수입니다. 1이면 거의 프롬프트를 무시하고 30이면 완전히 프롬프트를 따릅니다. 대부분 7 정도가 좋습니다.

마스크 콘텐트

마스크된 영역을 어떻게 초기화시킬지를 결정합니다.

  • Fill(채우기): 원본 이미지를 흐리게 만듧니다.
  • Origianl(원본): 원본 이미지를 그대로 사용합니다.
  • Latent noise(잠재 잡음):  마스크 지역을 fill 로 채운 후, 잠재 공간(latent space)에 무작위 잡음을 채워넣습니다.
  • Latent nothing(잠재 없음): 잠재 잡음과 비슷하되, 무작위 잡음은 넣지 않습니다. 

아래는 마스크 콘텐츠에 따른 효과로서, 샘플링에 들어가기 직전 상황입니다.

마스크 콘텐트의 효과

인페인트 팁

다음과 같은 사항을 준수하면 더 좋은 결과물을 얻을 수 있습니다.

  • 한지역을 한번에 할 것
  • 마스크 콘텐트를 Original로 두고 잡음제거 강도만 조정하는 방법으로 90%가 해결됨
  • 마스크 콘텐트를 바꿔가며 어떤 것이 최적인지 시험해 볼 것
  • AUTOMATIC1111 설정을 아무리 바꿔봐도 마음에 들지 않으면, 포토샵이나 GIMP등을 사용해 마스크하고 싶은 지역을 지우고 원하는 형태와 색상으로 대층 채운뒤 업로드시켜 인페인트를 적용해 볼 것

이상입니다. 이 글은 https://stable-diffusion-art.com/inpainting_basics/ 을 참고로 예제는 모두 대체하고, 일부 내용은 제가 원하는 것으로 추가해서 작성한 글입니다.