t2i를 돌리다보면 정말로 마음에 드는데 일부분이 삐꾸가 나서 아쉬웠던 경험 다들 있었을 것이다

만족하고  해당 그림을 그대로 쓸수도 있지만 역시 마음에든 그림은 완벽했으면 하는 사람들을 위한 글이다

여기서 핵심은 '마음에 든' 그림이다. i2i를 사용해 비슷한 구도, 비슷한 색감을 유지하고 다른 그림을 얻을 수 있지만,

구도와 색감을 모두 '원본을 유지한 채' 삐꾸난 부분만 수정해 완벽한 그림을 얻어내는 것이 목표이다


필자는 원클릭 코랩을 사용중이며 이 플랫폼을 기준으로 작성한 글이다


오늘 인페인트를 해볼 그림

아이고! 내 자캐의 특징중 하나인 바보털을 빼먹었다 인페인트를 통해 그려보자

또 손이 아직 좀 어색하다... 조금 더 자연스럽게 고쳐보자

그리고 왼쪽 사람귀가 보인다 네코미미에 사람귀라니 어불성설이다. 지워보자


먼저 i2i페이지 중 복원(inpaint)페이지를 뜯어보자

1번 영역은 글 전제상 t2i를 사용할줄 안다고 생각하고 설명은 생략한다

하지만 굳이 넣은 이유는 앞으로 인페인트를 사용할때 꽤 중요한 역할을 하기 때문이다


2번 영역은 이미지 업로드 영역이다

이곳에서 직접 인페인트 할 이미지를 업로드 할수도 있지만

t2i를 돌리다가 마음에 든 그림을 인페인트 하는것이기 때문에 t2i에서 바로 인페인트로 보내는 방법을 알아보자

t2i결과창의 화면이다. 붉게 표시한 상자의 inpaint로 보내기를 선택하면


 와! 프롬프트가 모두 자동으로 입력됐다

인페인트 할때 원본의 프롬프트를 입력해야한다. 이 과정을 생략해준다


그리고 그림도 자동으로 등록돼었고 샘플링 수와 폭과 높이도 모두 t2i에서 사용하던 대로 입력됐다

하지만 샘플링 방식은 t2i방식을 따라가지 않으니 주의해야한다

여기서 샘플링 방식이 원본의 방식을 따라가지 않는 이유는 인페인팅을 할때 원본의 샘플링 방식을 따를 필요가 없기 때문이라고 생각한다


cfg범위는 계승되지 않지만 시드는 계승된다

여기서 시드가 t2i결과물의 시드가 아닌 -1이 입력된 이유는 랜덤짤을 생성하다 그대로 마음에 든 그림을 inpaint로 보낸 경우기 때문이다

만약 시드를 사용해 그림을 뽑고 있었다면 특정 시드가 입력돼 있을 것이다

상단에 보이는 노이즈 제거 강도는 중요한 내용이므로 나중에 다시 설명한다


3번 영역은 마스크와 관련된 옵션의 영역이다

가장 사용하기 쉬운 기본 세팅을 사용하도록 하자

마스크 그리기, 복원 마스크 됨, 원본이다


마스크 업로드의 경우 외부 프로그램을 사용해 마스킹을 만들어 업로드해야 하므로 본 글에서는 생략한다

즉 마스크를 web ui상에서 직접 그려서 인페인트한다


다음 복원 마스크됨과 복원 마스크되지 않음의 차이

마스크한 부분
복원 마스크됨
복원 마스크되지 않음

표를보면 한눈에 확인할 수 있다

그림에서 삐꾸난 일부 부분을 수정할 것이기 때문에 복원 마스크됨을 사용한다


마스크된 컨텐츠는 원본을 사용하도록 한다

여기까지가 기본 인페인트 화면 설명이다

사실 인페인트로 보내기를 누르면 자동 세팅되는 내용들이다



위 내용은 정말 기본적인 내용들이라 접어두었다

하지만 인페인트를 처음접한다면 도움이 될 내용이라고 생각한다


다음으로 인페인트를 하기 전 설정이다

대부분 vae를 키고 web ui를 사용할테니 이 부분도 접어두겠다

만약 인페인트를 하는데 색감이 이상하다면 도움이 될 부분이다

해당 문제가 없다면 설정은 건너뛰어도 좋다


인페인트를 위한 설정

인페인트를 했는데 색이 이상하게 나온경우가 있을 것이다

이렇게 했는데, 
이렇게 나온 경우

인페인트 한 부분이 누렇게, 또는 뿌옇게 나왔다

이것을 해결하는 방법엔 두가지가 있다


아래 화면은


위 탭의 설정에서 찾아볼 수 있다.


1. 색보정 키기

아까와 모든 조건은 같게, 색보정만 키고 난 뒤 결과이다. 물론 마스크한 부분도 같다

 색이 이상하게 나오지 않는다

해결!


2. VAE키기

필자처럼 VAE를 사용하지 않는 경우 유효한 방법일테다

다시 색보정을 끄고 VAE만 키고 인페인트해보았다

 색이 이상하게 나오지 않는다

해결! (눈치가 좋은 사람이라면 그림이 살짝 바뀐것을 확인할 수 있는데, 아래 인페인트에 김?섹션을 참고바람)


물론 둘다 켜도 잘 된다


추가로 가끔 업데이트 후 원본 색보정이 먹히지 않는 경우가 있는데

그런 경우 과거 커밋 해시값을  REPO_COMMIT: 란에 넣으면 잘 된다

a2feaa95fc0c4c94131eb75b5b1bc0eaa1696551 (필자가 쓰는 커밋 해시값)

물론 VAE를 키면 해결되니까 귀찮으면 VAE얌전히 키자




인페인트에 김?

아래 내용은 필자도 잘 모르지만 해당 현상이 발생했을때 주로 사용하는 방법이다

 

놀라지 마시라.. 마스크한 부분이 아니라 인페인트 한 결과물이다

인페인트를 하다보면 가끔 이런식으로 마스크한 부분이 검게 나오는 경우가 있다

이런 경우 해당 그림은 뭔짓을 해도 김이 나오더라... 너무 슬픈 경우다


이때 t2i로 돌아가 시드를 고정하고 프롬프트의 중요도가 낮은 그림의 가중치를 아주 살짝 수정한다 0.01수준으로 

(sunflower:1.2)에서 (sunflower:1.19)로 변경한 그림


그럼 아주 유사한 그림을 얻을 수 있는데 (좌측 상단 해바라기가 사라졌다)

이 그림으로 인페인트를 할 경우 김이 나오지 않는다

 이런식으로!


이번 글을 쓰면서 알았는데 VAE가 해당 현상의 원인으로 의심된다

VAE만 키면 김이 출력됐기 때문이다. 따라서 이번 글에서는 인페인트 설정의 1번 방법을 사용하도록 한다 (원본 색 보정)

VAE가 원인이라는것은 순수 뇌피셜이므로 흘려읽어도 좋다

이 현상이 자주 발생하는게 아니므로 검증에도 다소 무리가 있다

 


또 인페인트시 가끔 발생하는 김에 대해 필자가 쓰는 방법을 글로 옮겼다

해당현상이 발생한 경우 참고하면 좋다 (제시된 방법은 완벽한 방법이 아니다...)


본격적인 내용이다

다음 필자가 가장 중요하게 생각하는 디노이즈 강도에 대한 설명이다. 따라서 접지 않았다

디노이즈 강도는 0부터 1까지의 값을 갖는데 0을 선택하면 원본과 차이가 없도록 그리고,

1을 선택하면 원본을 참고하지 않고 처음부터 그리라는 의미이다

그 사이 값은 0에 가까울수록 원본에 가까운 그림을 그려주고 1에 가까울수록 원본과 다른 그림을 그려준다


설명보다는 아래 x/y plot을 보면 더 이해가 잘 될 것이다 (클릭하면 커진다)

스텝스 15에서 완성된 그림을 기준으로 봐보자

디노이즈 강도 0에서는 원본과 차이없는 그림을 얻었다

하지만 1은 옷의 장식이 변했고 심지어 자세또한 바뀌었다. 원본을 전혀 참고하지 않고 인페인팅 하는데도 원본과 큰 차이가 없는 것으로 느껴지는 이유는 원본의 프롬프트를 그대로 사용했기 때문이다


0.8에서도 원본과 상당히 동떨어진 그림을 얻을 수 있었고

0.6에서는 원본과 비슷하지만 배꼽이 더 강조되는 등 꽤 다른 그림을 얻었다

0.4에서는 자세나 옷이 변경되는것은 거의 없었지만 디테일이 다소 바뀐것을 확인 할 수 있다

0.2에서는 차이가 거의 없지만 옷의 주름이나 단추색 등 디테일이 바뀌었다

위 결과를 참고하여 제시된 값 외의 값을 선택하는것은 순전히 본인의 경험에 따라 선택하면 된다


이처럼 상황에 맞는 디노이즈 강도 값을 설정해주는것이 인페인트시 타율을 높이는 지름길이다

막말로 디노이즈 강도를 1로 해두고 가챠를 엄청 하면 언젠간 당첨이 되긴 할것이다... (시간은 오래걸리지만)



이제 본격적으로 인페인트 해보자

필자는 인페인트를 할때 배치사이즈 4를 사용한다

인페인트가 애초에 타율이 높지않고, 결과물의 경향을 보고 디노이즈 강도를 조절하기 위함이다

*이에대한 추가설명은 글의 마지막 부분에 따로 해두겠다


먼저 바보털을 만들어보자

원본에서 바보털이 없는 이유는 프롬에 해당 속성을 적어 넣는것을 잊었기 때문이다

따라서 프롬에 바보털을 뜻하는 huge ahoge를 추가한다

다음 바보털이 들어갈 만한 자리에 마스킹을 한다

가장 중요한 디노이즈 강도는 1을 적용한다

이유는... 완전히 새로운것을 만들어야하므로 원본을 참고해서는 안되는 경우이기 때문이다

그후 배치사이즈 4를 적용하고 인페인트를 실행하면...

보통은 4번을 선택한다

바보털도 만족스럽고 인페인트 되지않은 부분과의 조화(연결)도 훌륭하기 때문이다

하지만 이번엔 후처리에대해 보여주기 위해 1번을 선택해 진행한다

혹시 4장중에 마음에 드는게 하나도 없어도 괜찮다. 다시 가챠하지 뭐!


이런식으로 가장 마음에 드는 그림을 선택해 인페인트 해나가는것이 기본이다

앞으로의 인페인트과정에서도 계속 이것이 반복될것이며 글에서는 생략할 것이다


 선택된 1번이다

보면 하얀색 인페인트한 부분에 잡티같은것들이 눈에 띈다 이것을 먼저 제거하도록 하자

위와같이 잡티부분에 마스킹을하고 디노이즈강도 0.6을 준다

원본은 유지해야하지만, 어떤 요소를 지우는것이기 때문이다

 상당히 조화롭다

하지만 여전히 인페인트된 흔적이 보인다

이제 그 흔적도 지워보자

이렇게 마스킹을 하고 디노이즈 강도 0.15를 준다

원본은 거의 유지하고싶기 때문이다

음 좋다. 이제 이 영역은 넘어가자


이제 바보털을 만들었으니 손을 손보자

오른손은 지금이대로도 이상하지않은데 왼손이 이상하다

위와같이 마스킹 한 뒤 디노이즈 강도는 0.4를 준다

애초에 원본의 손 상태가 그렇게 나쁘지 않기 때문이다 (원본을 어느정도 유지하고 싶다)

*손이 아주 이상해서 디노이즈강도 0.8이상을 주는 경우 원본의 손모양보다 마스크범위를 더 넓게 잡아야한다

공간이 모자라서 예쁜 손이 마스크범위를 넘어 짤려 출력되는경우 정말 눈물이 난다

 

오 좋다, 하지만 외곽선이 생략된것이 있고 검지는 머리카락과 붙었다...

해당 부분을 마스킹 하고 디노이즈강도 0.5를 준다

특히 이번엔 검지가 머리카락하고 융합됐으므로 네거티브에  (fused hair + finger)를 삽입한다

이런 방식으로 좀 더 나은 그림을 얻었다

하지만 아직 어색하므로 추가로 인페인팅을 진행한다

(과정은 모두 같으므로 중략한다)

아주 만족스러운 손을 얻었다


이제 사람귀를 없애보자

여기까지 글을 읽었다면 디노이즈 강도를 얼마를 줘야할지 감이 잡힐 것이다

그렇다... 1이다

필요없는 요소를 삭제하는것이기 때문에 원본을 참고해선 안된다. 따라서 1을 준다 

위와같이 마스킹을 했다

표시된 사람귀보다 넓은 범위에 마스킹을한 이유는 좀더 자연스러운 헤어스타일이 나왔으면 하기 때문이다

사람귀는 없어졌지만 뭔지모를 위화감이 있다

해당 부분에 마스킹을하고 디노이즈강도 0.4를 준다

(이상 과정은 위에서 설명한 방법과 완전히 같다 따라서 중략)

와! 바보털도 만들었고 손도 고쳤고 사람귀도 지웠다

이제 조금더 손을 보면...


인페인트 전
인페인트 후

원본의 느낌, 구도, 색감 모두  유지한채 원하는 부분만 수정했다!

사실 이 작업은 진짜 자기만족의 영역이라...

그래도 해보면 굉장히 뿌듯하다 완벽한 그림 한장도 얻어가고


아래는 작업과정이 담긴 움짤이다

위 글을 읽고 감을 잡았겠지만 작업량이 결코 적지 않다

인페인트를 할 바엔 i2i나 t2i에서 가챠를 하는편이 더 나은 경우가 많다

그럼에도 '마음에 든'그림을 '원본 느낌을 유지한 채' 더욱 완벽하게 만들고 싶다면 최고의 선택이다

그러니까 마음에 꼭 드는데 아쉬운 그림에 적용하길 바란다


디노이즈 강도 조절 팁

배치사이즈 4는 디노이즈 강도 조절을 할때 빛난다

4장의 결과를 보고 원본을 좀 더 유지해야할것 같으면 현재 디노이즈 강도에서 조금 더 낮추면 되고

생각보다 달라지는 점이 없다면 디노이즈 강도를 더 높이면 된다

바로 예를 보자

오른쪽 어깨의 지저분한 부분을 지우고 싶다

그런데 속성을 지우는것인데 원본을 유지해야할지 유지하지말지 애매하다

이런 경우 기본값인 0.75를 주고 4배치의 결과를 본다

마음에 드는 결과가 있었으면 좋았겠지만 그렇지 않다

이제 디노이즈 강도 조절을 해야하는데 어깨가 아예 망가진게 두장이나 있다

이런경우 원본을 좀더 유지해야한다. 즉, 디노이즈 강도를 낮춘다

0.6으로 바꾸고 다시 돌려본다

아까보다 어깨가 덜 망가졌다. 하지만 여전히 망가지고 있다...

따라서 디노이즈 강도를 과감히 더 낮춰본다. 0.4를 적용한다

이번엔 어깨가 유지됐지만 지저분한것이 효과적으로 제거되지 않았다

그렇다면 이제 디노이즈 강도를 다시 높일 차례다

0.4보다는 높게, 0.6보다는 낮게 설정해서 또 가챠를 한다

이게 디노이즈 강도 선택의 기본 골자다

만약 4장 가챠결과가 애매하다면 디노이즈 강도 변경없이 가챠를 반복하는 것도 방법이다



인페인트시 샘플러에 대하여

인페인트를 할때도 샘플러를 선택할 수 있다

원본을 만들때 사용한 샘플러를 인페인트 할때도 선택해야한다고 생각하기 쉽지만

실제로 그렇지 않다

다른 샘플러를 사용하더라도 원본의 느낌은 유지된다

물론 너무 넓은 범위를 인페인트한다면 샘플러 특유의 느낌이 묻어나지만

이번 글의 특성상 좁은범위를 인페인트할때는 샘플러 특유의 느낌이 묻어나지 않는다

 따라서 어떤 샘플러를 쓰다가 너무 결과가 나오지 않는다면, 샘플러를 바꿔보는것도 효과적인 방법이다


실제로 이번 예시 원본이 사용한 샘플러는 DPM++ 2M Karras이다

하지만 초반을 제외하고, 인페인트 할때는 Euler a를 사용했다

그럼에도 원본과 같은 느낌의 결과물을 얻을 수 있었다

이는 exif를 확인하면 확인할 수 있다


원본프롬프트 유지하기

인페인트를 한 뒤 원본과 결과물을 동시에 보관한다면 후에 같은 그림을 뽑을 때 문제가 없다

하지만 저장공간의 문제나 보관이 용이하지 않기 때문에 대부분 원본은 삭제 할 것이다

이때 인페인트 결과물의 exif를 조회한 뒤 이것으로 t2i를 돌리면?

전혀 다른 결과물이 나온다

당연하게도 인페인트할때 프롬프트도 조금씩 바뀌었고 샘플러도 바뀌었기 때문이다

물론, 시드도 바뀌었다

나중에 원본을 뽑을 방법은 없는걸까


필자는 이 방법을 사용한다

원본을 보관해 뒀다가 원본의 프롬프트와 시드, 샘플러, 스텝수, cfg스케일 등 그림에 영향을 주는 파라미터를 결과물에 적용한다

이때 마스킹은 하지 않는다


이렇게 말이다

그 다음 생성한다

실제로 마스킹하지 않았으므로 그림엔 아무 변화가 없을 것이다

그러니 일괄 처리 수를 1로 바꾸는것을 잊지말자

그 후 생성된 이미지를 png정보에 넣어 t2i로 보내기를 누르면

위와같이 표시된다

여기서 주의해야할 점은 인페인트의 디노이즈 강도가 exif에 남아있어서 고해상도 복구가 활성화된다는 점이다

원본을 생성할때 고해상도 복구는 사용하지 않았으므로 해당 체크박스를 해제한뒤 생성을 하면

인페인트 전의 원본을 그대로 얻을 수 있다

이 방법을 쓰면 원본을 보관할 필요가 없다


그건 그렇고 오일러도 굉장히 귀엽게 나오네 써봐야겠네 ㅋㅋ


모두 예쁜그림 인페인트로 더 완벽하게 뽑길 바라