AI 이미지/Stable Diffusion

Stable Diffusion - HiRes. Fix를 활용한 고품질 이미지 생성

하늘이푸른오늘 2023. 10. 26. 01:07

이 글에서는 HiRes Fix (High Resolution Fix, 고해상도 수정)이라는 기법을 소개합니다. 이 기법은 2 패스 Txt2Img 기법이라고도  하는데, txt2img 방식으로 저해상도 잠재 이미지를 생성한 후, 이 잠재 이미지를 확대하고  다시 img2img 방식으로 이미지를 생성하는 기법을 말합니다. 뭔가 여러번 단계를 거쳐야 해서 약간 복잡하기는 하지만, 그냥 이미지를 확대하는 것에 비해 매우 고품질의 이미지를 얻을 수 있는 장점이 있습니다. 

먼저 결과물을 보여드리겠습니다. 아래 왼쪽은 그냥 txt2img로 생성한 이미지이고, 오른쪽은 HiRes. Fix 기법을 적용해 생성한 이미지입니다(이미지 크기가 다르지만 동일한 크기로 비교해봤습니다). 보시는 것처럼, 이미지 크기가 커진 것과는 별개로 머리에 꽃 장식이 추가되었다거나, 드레스의 질감이 더 풍부해지는 등, 전체적으로는 비슷하지만, 훨씬 멋진 이미지가 생성되었음을 알 수 있습니다. 

768x768 - 일반 txt2img 1152x1152 High res. fix

이 글에서는 이미지 확대 및 이와 관련한 품질 향상기법을 몇가지 다룹니다. 목차는 아래와 같습니다.

ComfyUI의 High Res. Fix 예제

아래는 ComfyUI 예제 사이트에 올려져 있는 워크플로를 약간 수정한 것입니다. (이 이미지를 포함해서 이 글에 있는 모든 이미지를 ComfyUI 에 Drag&Drop 하면 해당워크플로를 사용할 수 있습니다)  노드의 위치만 약간 변경했기 때문에 원래의 워크플로와 동일하다고 생각하셔도 됩니다.

High Res. Fix 워크플로

보라색에 있는 워크플로는 ComfyUI를 한번이라도 사용해 봤다면 구지 설명할 필요가 없을 정도로 매우 익숙한 기본 Txt2img 워크플로입니다. 

txt2img 워크플로

아래가 Hires Fix의 가장 핵심 부분으로서, 위에서 생성된 잠재 이미지를 [UpScale Latent] 노드를 사용해 크기를 키우고, 이를 KSampler의 latent-image 입력 슬롯에 공급하여, 다시 한번 잡음 제거 샘플링을 수행하는 방식임을 아실 수 있을 것입니다. 

원래 ComfyUI에서 txt2img 와 img2img는 거의 비슷한 프로세스입니다. 잠재 이미지(latent image)를 완전히 무작위 잡음을 넣으면 txt2img 방식이고, 기존 이미지를 잠재 이미지로 바꾸어 넣어주는 img2img 방식이 되는 겁니다. 이 워크플로에서는 이 사실을 명확히 알 수 있습니다. 

아래는 이러한 워크플로에 의해 생성한 이미지입니다. txt2img에서는 768x768로 생성했고, 이를 1152 x 1152로 키운 후 img2img 를 수행한 결과인데, 정말 극적인 변화라고 할 수 있습니다. 

768x768 - 일반 txt2img 1152x1152 HiRes. Fix

아래는 SDXL 모델중 하나인 Counterfeit 모델을 사용해서 생성해본 결과입니다. SDXL에서도 약간의 변화가 보이기는 하네요. 그런데 여러번 테스트해봐도 SD1.5에서 만큼의 극적인 효과는 기대하기 힘든 것 같습니다. 오히려 품질이 나빠지는 듯한 부분도 보이고요. 게다가 SDXL 에서는 refiner 모델을 적용하면 디테일이 추가되고 더 품질이 좋은 이미지가 생성되므로 구지 이 기법을 활용할 필요는 없을 것 같네요.

1024 x 1024 txt2img (base 모델만 사용) 1536 x 1536 HiRes. Fix

단순 Upscaling 워크플로

그런데 원래 고해상도로 확대하면 이미지 품질이 약간이라도 좋아지는 경향이 있습니다. AUTOMATIC1111 이미지 확대기 사용법을 보시면 그냥 확대하는 것보다, AI Upscaler를 사용하면 보다 많은 디테일이 추가되죠. 그래서 위에서 설명한 HiRes. Fix와 단순 이미지 확대가 얼마나 차이가 있는지를 확인해보겠습니다.

아래 워크플로에서 왼쪽 보라색 부분은 일반 txt2img 워크플로이니 따로 설명드리지 않겠습니다. 

Upscaling 워크플로

Upscale 에서 가장 중요한 부분은 아래와 같습니다. [KSampler] 노드에서 생성된 잠재 이미지를 [VAE Decoder]를 통하면 일반 이미지가 되는데, 이를 [Upscale Image] 노드를 통해 확대합니다. 이때 AI확대 모델은 [Load Upscale Model] 노드를 통해 R-ESRGAN 을 사용했습니다.

Upscaling 워크플로중 핵심부분

아래가 그 결과입니다. 좌우를 비교해보시면 그냥 차이가 전혀 안보입니다. 물론, 왼쪽 이미지를 그냥 2배 키운 이미지와 오른쪽 이미지를 비교해보면 디테일이 차이가 나긴 납니다. 그래도 전체 분위기는 완전히 동일합니다. 

768 x 768 txt2img 1536 x 1536 Upscaling

이처럼 HiRes. Fix 는 단순 Upscale과는 달리 이미지를 확대하면서 훨씬 디테일이 풍부한 이미지를 만드는, SD1.5에서는 상당히 쓸만한 기법인 것 같습니다.

AUTOMATIC1111 에서 적용하는 방법

AUTOMATIC1111에서 이 기법을 적용하려면, 먼저 txt2img에서 이미지를 생성하면서 HiRes Fix를 지정하면 됩니다. 대략 아래와 같이 설정합니다. 이 설정은 위의 ComfyUI의 설정값과 가능한 한 유사하게 설정했습니다. txt2img 설정은 아래와 같습니다. 

모델: Anything v5
프롬프트: 1girl, floating in the sky, cloud, (close-up:1.1), bright, happy, fun, soft lighting masterpiece, best quality, movie still
부정적 프롬프트: disfigured, ugly, bad, immature, cartoon, anime, 3d, painting, b&w 
샘플러: DPM++ 2M Karras
단계수: 20
이미지크기 : 768 x 768

Hires. fix 설정은 아래와 같습니다. 

Upscaler : Latent
단계수 12
Upscale 배수 : 1.5 (768 x 768 이미지를 1152 x 1152로 확대합니다.)

AUTOMATIC1111의 Hires fix 설정

아래는 이렇게 생성한 결과입니다. 동일한 씨드값(3565566140)을 사용했는데, Hires. Fix를 사용하면 디테일이 훨씬 추가되었음을 알 수 있습니다. 저는 이제까지 이 부분이 그냥 단순 Upscale로 알고 있었는데, 이런 효과를 가진줄은 처음 알았네요. 

768 x 768 txt2img 1152x1152 Hires. Fix

Efficiency Nodes를 사용한 High Res. Fix 워크플로

아래는 맨위의 워크 플로Efficiency Nodes 를 사용해 재 구성한 것입니다(원래 Efficiency Nodes Github에도 워크플로가 있지만, 노드가 업데이트 되어서 그쪽 워크플로를 가져오시면 오류가 발생합니다) 보시는 것처럼 아주 깔끔합니다. 

Efficiency 노드를 사용한 Hires. Fix 워크플로

여기에서 가장 중요한 것은 아래 [HighRes-Fix Script] 노드입니다. 잠재 이미지를 1.3배 키우고 12 단계를 수행하라는 등으로 설정되어 있습니다. 

[HighRes-Fix Script] 노드

이렇게 설정한 [HighRes-Fix Script] 노드의 SCRIPT 출력슬롯은 아래 그림과 같이 [KSampler (Efficient)] 노드의 script로 연결시키고, 바로 아래에 있는 "sampler_state" 위젯은 "Script"로 설정해야 정상적으로 수정됩니다. 

Hires Fix를 위한  [KSampler (Efficient)] 노드 설정

아래는 실행 결과입니다. 깔끔하게 잘 나왔네요. 오히려 장식이 너무 많은 게 아닐까 싶은 정도로 디테일이 풍부합니다. ㅎㅎㅎ

Efficiency Nodes를 사용한 High Res. Fix 결과

이상입니다. 이제까지 AI 이미지 생성에 관한 글은 대부분 외부 사이트에 있는 글을 번역하면서 필요에 따라 수정해 게시했는데, 이 글은 완전히 자력으로 작성했습니다. 기분이 좋네요. ㅎㅎㅎ 앞으로도 꾸준히 올리겠습니다~!

민, 푸른하늘