3-1. img2img와 인페인팅
순수 노이즈가 아니라 이미 있는 그림에서 출발한다. 그림에 노이즈를 반쯤 섞고 거기서부터 걷는다. 0-1의 식 하나로 그림 고치기, 부분 수정, 크게 키우기가 전부 된다.
img2img: 중간에서 출발하기
지금까지는 t = 1(순수 노이즈)에서 출발했다. 출발점을 바꿔 보자.
- 가진 그림을 VAE로 잠재로 바꾼다.
- 그 잠재에 노이즈를 섞는다.
x_t = (1 − t)·x₀ + t·ε. t는 내가 정한다. - 그 t에서부터
t = 0까지 걷는다.
이것이 img2img(image to image)다. 0-1의 섞는 식을 그대로 쓴다.
걷는 동안 디노이저는 새 프롬프트를 조건으로 받는다. 그래서 원본의 구도는 남고, 내용은 프롬프트 쪽으로 바뀐다.
denoise 값
2-1에서 미뤄 둔 KSampler의 denoise 설정이 이 t다.
| denoise | 섞는 노이즈 | 결과 |
|---|---|---|
| 1.0 | 전부. 원본이 완전히 사라진다 | 원본과 무관한 새 그림. 일반 생성과 같다 |
| 0.7~0.8 | 많이 | 큰 구도와 색 배치만 남고 내용은 새로 그려진다 |
| 0.4~0.6 | 반쯤 | 형태는 유지되고 화풍과 디테일이 바뀐다 |
| 0.2~0.3 | 조금 | 거의 같은 그림. 질감과 작은 디테일만 다듬어진다 |
| 0 | 없음 | 원본 그대로 |
이것이 되는 이유는 0-1의 데모에서 봤다. 노이즈를 조금 섞으면 큰 형태는 남고 디테일만 가려진다. 많이 섞으면 형태까지 사라진다. 1-3에서 말한 "노이즈가 많은 구간에서 구도가, 적은 구간에서 디테일이 정해진다"와 같은 이야기다.
스텝 수도 따라 줄어든다. steps가 20이고 denoise가 0.5면 실제로 걷는 것은 뒤쪽 10걸음이다.
쓰임새
- 밑그림을 그림으로. 대충 그린 낙서나 3D 프로그램의 화면을 넣고 denoise를 0.6~0.8로 준다. 구도는 내가 정하고 그림은 모델이 그린다.
- 화풍 바꾸기. 사진을 넣고 애니풍 모델로 0.5쯤 돌린다.
- 다듬기. 생성한 그림을 0.2~0.3으로 한 번 더 돌려 질감을 정리한다.
크게 키우기
모델은 학습한 해상도 근처에서만 제대로 그린다. 처음부터 두 배 크기로 생성하면 같은 대상이 반복된다(2-1). 그래서 두 단계로 한다.
- 기본 해상도로 생성한다. 구도가 여기서 정해진다.
- 그림을 두 배로 키운다. 이때는 흐릿하다.
- 키운 그림을 img2img로 다시 돌린다. denoise는 0.3~0.5.
3번에서 구도는 이미 정해져 있으니 모델은 디테일만 채운다. 큰 해상도에서도 무너지지 않는다. 흔히 하이레스 픽스(hires fix)라고 부르는 것이 이 방법이다.
2번에서 키우는 방법은 둘이다. 잠재를 그대로 늘리거나, 픽셀 그림으로 푼 뒤 업스케일 전용 모델로 키우고 다시 잠재로 바꾼다. 뒤쪽이 선이 깔끔하다.
인페인팅: 일부만 다시 그리기
그림의 한 부분만 고치고 싶다. 손이 이상하다, 표정을 바꾸고 싶다, 옷을 갈아입히고 싶다.
마스크로 고칠 영역을 표시한다. 흰 부분은 다시 그리고 검은 부분은 그대로 둔다.
원리는 img2img에 한 가지를 더한 것이다.
걸음마다:
디노이저로 그림 전체를 한 걸음 옮긴다
마스크 바깥은 "원본에 지금 단계만큼 노이즈를 섞은 것"으로 덮어쓴다
마스크 바깥은 걸음마다 원본으로 되돌려진다. 마스크 안쪽만 새로 그려진다. 그런데 디노이저는 매번 그림 전체를 보고 일한다. 그래서 안쪽이 바깥의 빛, 색, 선과 이어지게 그려진다.
denoise와 인페인팅
| 하고 싶은 일 | denoise |
|---|---|
| 완전히 다른 것으로 바꾸기 (빈손에 컵을 쥐여 주기) | 0.8~1.0 |
| 형태를 살리면서 고치기 (이상한 손가락) | 0.5~0.7 |
| 살짝 다듬기 (얼굴 디테일) | 0.3~0.4 |
인페인팅 전용 모델
일반 모델로 인페인팅하면 경계가 어색하거나 주변과 안 어울릴 때가 있다. 전용 모델은 디노이저의 입력에 마스크와 "가려진 원본"을 추가로 받도록 학습했다. 어디를 채워야 하고 주변이 어떻게 생겼는지 처음부터 알고 그린다. denoise를 1.0으로 줘도 주변과 잘 이어진다.
편집을 지원하는 최신 모델(3-4)은 이 일을 지시문만으로 한다.
작은 얼굴 고치기
전신 그림에서 얼굴은 몇십 픽셀이다. 잠재로는 몇 칸이다. 디테일이 뭉개지는 것이 당연하다(1-1의 VAE 한계).
해법은 잘라서 키워서 고치고 다시 붙이기다.
- 얼굴을 찾아 그 영역을 잘라 낸다.
- 모델의 기본 해상도로 키운다.
- 키운 조각을 인페인팅한다. 이제 얼굴이 화면 가득이라 모델이 제대로 그린다.
- 원래 크기로 줄여 제자리에 붙인다.
이 과정을 자동으로 해 주는 노드가 있다. 디테일러라고 부른다. 얼굴을 찾는 데는 작은 탐지 모델을 쓴다. 손과 눈에도 같은 방법을 쓴다.
바깥으로 넓히기
그림의 바깥쪽을 이어 그리는 것을 아웃페인팅이라고 한다. 캔버스를 넓히고, 넓어진 빈 부분을 마스크로 지정해 인페인팅한다. 원리는 같다.
해 볼 것
- 같은 그림을 denoise 0.2, 0.4, 0.6, 0.8로 돌려 본다. 어디서부터 구도가 바뀌나?
- 기본 해상도로 만든 그림을 두 배로 키워, 그대로 본 것과 denoise 0.4로 다시 돌린 것을 비교한다.
- 전신 그림의 얼굴을 그대로 인페인팅한 것과, 잘라서 키운 뒤 인페인팅한 것을 비교한다.
예상 결과
- 0.4까지는 같은 그림으로 보인다. 0.6 근처에서 자세나 표정이 달라지기 시작하고, 0.8이면 색 배치만 남는다.
- 그대로 키운 것은 흐릿하다. 다시 돌린 것은 머리카락과 옷 주름 같은 디테일이 새로 생긴다.
- 잘라서 키운 쪽이 눈과 입이 또렷하다. 모델이 일할 칸이 충분해졌기 때문이다.
확인 문제
- steps 30, denoise 0.4로 img2img를 돌리면 실제로 몇 걸음 걷나?
- 인페인팅에서 마스크 바깥이 변하지 않는 이유는?
- 처음부터 2048×2048로 생성하지 않고 두 단계로 키우는 이유는?
풀이
- 12걸음이다. 30 × 0.4.
- 걸음마다 마스크 바깥을 원본(에 그 단계만큼 노이즈를 섞은 것)으로 덮어쓰기 때문이다.
- 모델은 학습한 해상도 근처에서만 구도를 제대로 잡는다. 구도는 기본 해상도에서 정하고, 큰 해상도에서는 디테일만 채우게 한다.