Hires Fix 워크플로우를 작성해보자


우선 Hires Fix에는 두 가지 방법이 있다.


1. Latent 영역을 직접 업스케일

2. 이미지로 변환 후 업스케일러를 사용한 업스케일


첫 번째 Latent Hires Fix를 보자


(위 이미지를 ComfyUI에서 로드하면 세팅된 워크플로우를 사용할 수 있다)


이전 기본 워크플로우에서 새로 추가된 파란색 노드가 Latent Hires Fix를 사용하는데 추가로 필요한 노드이다.

(보라색 노드는 각 샘플러에서 나온 이미지를 확인하기 위해 임시로 추가한 노드 이므로 삭제해도 무방하다)


Upscale Latent By 노드

첫 번째 샘플러에서 그림 생성 후 나온 Latent값을 받아서 업스케일을 해주는 노드.

업스케일 매소드와 업스케일 배율을 설정할 수 있다.

업스케일 매소드는 이렇게 있는데 각각 파이썬 업스케일 방식을 선택하는데 자세한건 구글링으로...

주로 사용하는 nearest-exact를 선택하면 된다.

직접 이미지 사이즈를 입력할 수 있는 Upscale Latent 노드도 있으니 참고.


KSampler 노드.

기본 워크플로우 가이드에 설명한 것과 같은 샘플링 노드다.

다른 점은 업스케일을 진행한 Latent값을 받아줘야 한다.

WebUI의 Hires Fix 세팅과 같이 스탭과 디노이즈 강도를 맞춰준다.

Latent 업스케일을 진행했기 때문에 알다시피 디노이징 강도는 최소 0.55이상을 주는게 좋다. 

그렇지 않으면 결과물에 노이즈가 남아있다.


이왕 쓰는 김에 Latent 업스케일은 왜 디노이징을 높게 주는지 간단히 알아보자

Latent 업스케일 결과물Latent 업스케일 후 디노이징 강도 0.4로 샘플링 진행


WebUI를 사용할 때는 샘플링 없이 업스케일만 진행한 결과는 본 적이 거의 없을 거다.

실제로 Latent 업스케일을 진행하면 이런 식으로 상당한 노이즈가 생기는데

디노이징 0.4로는 다 처리하지 못하는 모습이다.

최소 0.55 이상은 줘야 노이즈가 말끔히 사라진다.

업스케일 매소드에 따라서 노이즈는 격자 무늬, 빛 번짐 같은 형태로 나타나기도 한다.


혹시나 WebUI유저들도 Hires Fix를 사용하여 짤을 뽑았는데 얼굴을 중심으로 번짐 효과 같은게 발생한다면

업스케일러를 Latent 계열로 선택 했는지 확인해보고 맞다면 디노이즈 강도를 조절해보면 웬만해선 해결될거라 본다.



이제 두 번째 방법인 이미지 업스케일러를 이용한 Hires Fix 워크플로우를 작성해 보자.


(위 이미지를 ComfyUI에서 로드하면 세팅된 워크플로우를 사용할 수 있다)


WebUI에서 업스케일러를 선택해 보았듯이 그것과 같은 업스케일러 모델을 사용한다.


이 업스케일러를 사용하기 위해서는 이미지가 생성된 Latent영역을 이미지로 변환 할 필요가 있다.


하나씩 뜯어보자.


VAE Decode 노드

이미지가 생성된 Latent값을 받아서 이미지로 변환시켜준다.


Load Upscale Model 노드

업스케일러 모델을 불러온다.

본인이 사용 할 업스케일러 모델을 models\upscale_models\ 안에 넣어주면 된다.


Upscale Image (using Model) 노드

선택한 업스케일러를 사용하여 이미지를 업스케일 한다.

이미지 값은 앞의 VAE Decode에서 변환시킨 이미지를 연결해준다.


Upscale Image By 노드

업스케일 매소드와 업스케일 배율을 설정할 수 있다.

업스케일 매소드는 Bilinear를 선택하자. ComfyUI 제작자의 예제 에서도 권장하고 있다.

이미지 값은 앞의 Upscale Image (using Model) 노드에서 업스케일한 이미지를 연결해준다.


앞의 업스케일 이미지 노드는 선택한 업스케일러를 사용하여 1차로 업스케일을 진행하는데

업스케일 모델 이름을 보면 보통 4x라고 적혀 있을텐데 이건 기본적으로 4배로 업스케일 해주는 모델이라는 거다.

1차로 업스케일을 4배로 진행하기 때문에 2차로 배율을 사용하여 사이즈를 맞춰준다.

나는 2배로 업스케일한 사이즈를 얻기 위해 0.5배를 입력했다.(중요! 2배를 입력하면 결과적으로 8배 업스케일을 진행하면서 터질거다)


VAE Encode 노드

VAE Decode 노드와는 반대로 이미지를 Latent영역으로 변환 시킨다.

샘플러 노드에서 디노이징을 하기 위해선 무조건 Latent영역 에서만 진행하기 때문에 이 작업이 필요하다.


KSampler 노드

Latent 값은 앞에서 업스케일 진행 후 인코더를 통해 Latent로 변환한 값을 연결하면 된다.

이미지 업스케일러로 진행하는 Hires Fix는 알다시피 디노이징을 적게 설정해도 문제없다.


Latent 업스케일과의 차이점을 간단히 알아보자


Image Upscale 진행 결과물
Image Upscale 진행 후 디노이징 강도 0.4로 샘플링 진행


Latent 업스케일과는 다르게 노이즈가 없다.

이미지 업스케일러가 그림 사이즈를 바꾸면서 픽셀들을 잘 정리해 주기 때문이다.

이로 인해 디노이징을 자유롭게 설정할 수 있다.

업스케일만 진행하면 그림 사이즈만 커졌기 때문에 디테일이 다 죽어있다.

여기에 샘플링이 한번 진행되면 디테일을 잡아주면서 Hires Fix는 완료된다.



두 가지 Hires Fix 방법에는 각각 장단점이 있다.

Latent 업스케일은 노이즈가 발생하여 디노이즈 강도를 높게 줘야 하지만 원본과는 다른 다양한 결과를 얻을 수 있고,

이미지 업스케일은 노이즈가 없어 디노이즈 강도를 자유롭게 줄 수 있지만 결과물이 원본에서 크게 벗어나지 않아 디테일을 살리는데 용이하다.

WebUI의 Hires Fix도 이것과 같은 방식으로 작동한다.



뭔가 길게 주저리 주저리 써 놓았지만 결국 기본 이미지 생성 후 몇 개의 노드만 추가하면 끝난다.

이것 역시 몇 번 작성 해보면 가이드라인 없이도 바로바로 만들 수 있을 거라 생각한다.



(ComfyUI) 가장 기본적인 이미지 생성 워크플로우 가이드

(ComfyUI) Hires Fix 워크플로우 가이드

(ComfyUI) 로라 적용하기

(ComfyUI) img2img 워크플로우 가이드

(ComfyUI) Inpaint 워크플로우 가이드

(ComfyUI) 컨트롤넷 적용하기

(ComfyUI) 원하는 기능을 켜고 끄는 스위치 만들기