학습목표
a. 업스케일은 무엇인가?
b. resize할때 선택해주는 interpolation은 무엇이었는가?
c. pixel upscale은 어떻게 하는가?
d. pixel upscale과 latent upscale의 차이는 무엇인가?
e. latent upscale은 어떻게 하는가?
Plain Text
복사
워크플로우
인덱스 | 워크플로우 이름 | 실행가능한 링크 | 요약 |
4.5.1 | Resize | upscale 이전에 resize에 필요한 interpolation을 함께 알면 좋습니다. | |
4.5.2 | Pixel Upscale | 픽셀 기반의 업스케일링이 가능합니다. | |
4.5.3 | Upscale Model Comparison | 픽셀 기반의 업스케일링에서도 어떤 모델을 쓰느냐에 따라 결과차이가 크게 납니다. | |
4.5.4 | Ultimate SD Upscaler | 픽셀 기반 업스케일링의 단점을 보완해주는 노드가 있습니다. | |
4.5.5 | Ultimate SD Upscaler (2) | generation한 image를 업스케일링하는 것과 외부에서 제작한 image를 업스케일링 하는 것 두 상황 모두 가능합니다. | |
4.5.6 | Latent Upscale | 생성ai의 강점을 살려, pixel이 아닌 latent상태에서 업스케일링을 할 수 있습니다. | |
4.5.7 | Latent Upscale(2) | latent 업스케일링을 하면 디테일이 달라지지만, 그 단점을 일부 헷징할 수 있습니다. |
a. 업스케일은 무엇인가?
sd1.5는 512x512를 sdxl은 1024x1024를 잘 만듭니다.
그렇다고 우리가 512x512 사이즈의 결과물을 실무에 쓰는 것은 아닙니다.
실무적으로 더 높은 해상도 또는 화질을 갖는 이미지가 필요한 경우가 있습니다.
512x512를 1024x1024 또는 2048x2048, 4096x4096, … 높이는 이런 작업을 업스케일이라고 합니다.
전통적으로 업스케일링을 해주는 생성ai가 아닌 전통적 ai를 통한 방법도 꽤나 잘 쓰이고 있습니다.
하지만 부족한 부분이 분명 존재하고, 생성ai는 그런 영역에서도 힘을 발휘할 수 있습니다.
b. resize할때 선택해주는 interpolation은 무엇이었는가?
많은 새로운 개념을 마주하다보니 어려우실 것 입니다.
나는 그냥 화질만 좋게 만들고 싶은데 이렇게 많이 어려운 것을 배워야 하는가 겁 먹으실 필요 없습니다.
interpolation 그리고 latent 라는 두가지 조금 낯선 개념만 익혀보는 것으로 합시다.
Interpolation
조금 근본적인 질문을 하나 하겠습니다. 512x512 이미지를 1024x1024 이미지로 4배 늘리는 건 어떤 방법으로 하는 걸까요?
(궁금하지 않으시다면, interpolation 선택하실 때, nearest 말고 bilinear 또는 bicubic 선택해주시고 넘어가셔도 됩니다.)
인공지능이 없고, 그냥 컴퓨터만 있던 시절에는, 어떻게 했었는지, 아주 간단히 이해해볼 수 있도록 해봅시다.
우리가 보는 이미지는 픽셀로 이루어져 있습니다. 0~10 사이의 값을 갖는 3x3 이미지를 5x5 이미지로 늘려보면서 살펴봅시다.
이렇게 위치시키게 된다면, 저 흰색 공간들은 어떻게 채워야 할까요? 가장 앞에 있는 0과 10 사이의 a라고 쓰여진 공간을 보겠습니다.
•
a는 0과 붙어있으니깐, a는 0으로 채워. 라고 할 수도 있을 것입니다. ⇒ 0 (nearest)
•
a는 0과 10사이의 값이니깐, 둘의 평균인 5로 결정하자. ⇒ 5 (bilinear)
◦
이 방법을 적용한다면 b는 3으로 c는 4로 결정될 수도 있을 것입니다.
여기서 더 설명하면 컴퓨터 공학과 알고리즘적인 부분에 대해 자세히 설명해야 합니다. 중요치 않아 생략하겠습니다.
이런식으로 그냥 이미지를 잡아 당기는 방식으로 확장/변형을 하게 되면, 어떤 방식(Method)로 값을 채워줄지 결정해야 합니다.
그래서, 평소에 resize를 해주는 작업을 할때 nearest로 설정해두는 것보다, bilinear 또는 bicubic을 쓰는 것이 좋습니다.
bicubic은 단순히 둘을 더한후 평균내주는 것보다 조금 더 미분 같은 방법을 써서 발전시킨 것이라고 생각하시면 됩니다.
(단, 지금 input으로 넣은 이미지의 경우 pixel이미지이기 때문에, 이 3개 방법 차이의 변화가 크게 관찰되지는 않습니다.)
c. pixel upscale은 어떻게 하는가?
위에서 설명한 보간보다 발전된 방법으로 픽셀 기반으로 업스케일링을 하는 인공지능 모델을 구워둔 것이 pixel upscale 입니다. 사용법은 정말 간단합니다. 어떤 업스케일 모델을 쓸지 결정하고, 그냥 업스케일링을 하는 것이 전부입니다. 모델의 영향을 크게 받죠. 이게 위에서 말한 생성ai가 아닌 전통ai적 방법론입니다.
그래서 여러가지 업스케일러 모델이 존재하는데, 어떤 모델은 얼굴을 잘 만들어주고, 어떤 모델은 범용적으로 잘 되고, 어떤 모델은 사진은 잘 안되는데 애니메이션에 대해서는 잘 되기도 합니다. 직접 그 결과를 비교해보시면서 본인에게 유용한 팁들을 쌓아나가셔도 좋을 것 같습니다.
Ultimate SD Upscaler
노드 중 하나인 ultimate sd upscaler 노드에 대해 설명하겠습니다.
위의 basic generation이 있다고 해서, generation 기반으로 업스케일링 한다고 생각하면 오해입니다.
이건 pixel upscaler 모델로 업스케일링을 하는 것 뿐입니다.
이걸 왜 쓰냐? 이미지가 512x512 → 1024x1024 정도로 4배 늘리는 작업 정도까지는 픽셀 기반 모델들이 잘 해줍니다.
하지만 그 이상으로 8배 또는 16배 늘리고자 하는 경우 또는 4096x4096 → 8192x8192 같은 식으로 높아지다보면, 같은 4배이지만 해당 모델들이 학습될때 그렇게 큰 이미지를 학습하는 것을 염두에 두고 학습되지 않았기 때문에 성능이 줄어듭니다.
그래서 이 노드의 아이디어는 512x512 사이즈의 타일들로 쪼개서, 그 경계선을 부드럽게 seam fix를 해주고, 그 seamfix를 해주는 과정에서는 ksampler generation을 먹이되, denoise를 약하게 줘서 원본에 변형을 주는 영향을 덜 끼치겠다는 것 입니다.
그래서 지금 워크플로우는 내가 갖고있는 체크포인트로 이미지를 만든 후에,
그 동일한 옵션으로 pixel upscale을 하되, 이미지를 만든 체크포인트를 통해 seam fix를 하겠다라는 뜻으로
upscale after generation이라고 볼 수 있으며
워크플로우를 이렇게 변형해서 만든 이미지가 아니라 외부에서 갖고있는 이미지를 넣어주면
내가 스테이블디퓨전 내부에서 만든 이미지가 아닌 다른 이미지를 넣어주면서 타일링을 적용해줄 수 있는 방법이 되겠지요.
(프롬프트를 바꿔주지 않은 것은 실수네요. 프롬프트는 넣지 않거나 내가 만들고자 하는 이미지와 유사하게 넣어주어야 합니다.
이런 식으로 다른 사람들의 워크플로우에서 실수가 발생할 수 있으니, 그 사람이 잘 했을거야 라는 신뢰는 살짝 낮게 가지셔도 좋습니다.)
현재는 512x512 이미지를 업스케일링 하기 때문에, 굳이 귀찮게 이렇게 타일링을 해야해? 라고 생각하실 수 있습니다.
네 맞습니다. 당연히 현재의 상황에서는 pixel upscaler만 쓰는 것이 더 우월할 가능성이 높습니다.
하지만 원래 큰 이미지를 업스케일 하거나 또는 내가 만든 이미지를 4096x4096 등 까지 올리고자 할때 쓰일 수 있는 방법론입니다.
d. pixel upscale과 latent upscale의 차이는 무엇인가?
앞선 2.2에서 KSampler를 공부하다가 Latent 개념에 대해 공부했습니다.
이미지가 Pixel일때 늘리지 않고 Latent일때 늘리는 것을 Latent Upscale이라고 합니다.
e. latent upscale은 어떻게 하는가?
sd1.5를 활용해 귀여운 고양이의 512x512 이미지를 한장 만들었습니다. 이 이미지를 늘려보겠습니다.
이 이미지를 1024x1024로 만들고 싶다면 pixel upscale을 하는 방법도 있습니다.
하지만, 바로 1024x1024 사이즈로 생성을 해보겠습니다.
이미 우리는 sd1.5가 512x512를 잘 만든다는 사실을 알고 있기 때문에
만들어보기전에도 잘 나오지 않을 것 같다고 예상하고 있습니다.
역시 두마리가 나왔군요! 그래도 1024x1024로 만들려고 노력한 티가 나긴 합니다.
그럼 이렇게 한번에 1024x1024로 뽑으려고 하지 않고,
완성된 이미지가 아닌 latent 상태에서 upscale을 해서 1024x1024로 만들어보겠습니다.
기본 워크플로우 뒤에 Latent Upscale By 노드와 KSampler, VAE Decode 노드를 연결해주면 됩니다.
참고로 method는 위의 interpolation에서 설명한것처럼 bicubic을 주고 denoise는 0.56 값을 줬습니다.
디테일이 아주 조금 달라지기는 했지만, sd1.5로 훌륭한 1024x1024 이미지가 만들어졌습니다.
(동일한 기법을 적용해서 sdxl로 2048x2048 이미지를 만드는 것에도 도전해보세요.)
실제 제품의 모습 또는 디테일이 정확하게 하나도 바뀌면 안되는 상황에서는 Pixel Upscale이 유일한 선택지이지만
반드시 실제 제품처럼 형상이 100% 일치해야 하는 경우가 아니라면, 이렇게 Latent Upscale 방법도 유용할 수 있습니다.
딱 세가지 테크닉을 더 알려드릴 수 있도록 하겠습니다. [1] Deep Shrink [2] ControlNet [3] HighRes 입니다.
Deep Shrink = PatchModelAddDownscale(Kohya deep shrink)
노드의 이름이 상당히 복잡합니다. 이 노드는 아주 간단히 무슨 역할을 하는지만 이해하시면 됩니다.
비유하자면, 512를 잘 그리는 모델에게 ‘너는 1024에서도 잘 그릴거야’라고 헷갈리게 해주는 역할을 합니다.
컨트롤넷과 함께 활용
Latent Upscale을 하는 과정에서, 아주 조그마한 디테일들이 달라질 수 밖에 없는데,
이 과정에서 디테일들이 조금이라도 더 보존되었으면 하는 마음으로, 멀티 컨트롤넷을 함께 걸어주는 것입니다.
대단한 원리가 있는 것은 아니고, 그냥 컨트롤넷을 함께 쓰는 정도로 이해해주시면 됩니다.
이상으로 몇가지 업스케일 기법에 대해서도 소개해드렸습니다. 그 이외에도 Comfy 생태계에서는 업스케일을 위한 여러 커스텀 노드를 지원하고 있으니 사용해보시면서 본인에게 맞거나 잘 맞는 노드를 찾는 것도 추천드립니다.
하지만 90%의 상황에서는, 현재 알려드렸던 업스케일러들만 잘 활용해도, Comfy로 생성한 이미지에 대해서는 4096x4096 이상의 훌륭한 이미지를 만들 수 있으니 상황에 맞게 비교해가며, 훌륭하게 생성된 이미지로 좋은 부가가치 창출을 하시길 바랍니다.