잡글) civitAI 랭킹 근황

이미지
 요즘 LoRA 학습에 푹 빠져있는데 LoRA가 잘 만들어졌는지 테스트 하려면 테스트할 프롬프트가 필요하다.  필자는 매번 프롬프트에 아무거나 넣어보다가 잘되면 기록해놓는데 정말 잘 나온 애들은 civitAI에 올려놓는다.  https://civitai.com/images/7622855 요런거 개인적으로 잘나왔다고 본다. 암튼, 그래서 civitAI에 올린 프롬프트와 파라미터를 찾으러 갔는데 우측에 브론즈 딱지가 붙어있는 것을 봤다. civitAI SDXL 크리에이터 93위... 베이스모델 49위... 음.... 100위 안에 랭크인 됬는데 브론즈다. 생각보다 모델 올리는 사람이 없나 보다.  49위한 베이스모델은 정말 초창기에 SD 1.5모델을 올렸던게 인기가 좀 있었던거 같다. 사실 그당시엔 아무거나 올려도 열광할때라 선점효과가 강력했다. 지금은 업로드하는 사람이나 다운받는 사람이나 굇수들만 남아서 어중간한 모델은 인기가 없는 거 같다 ㅠㅠ (AnimagineXL 3.0이 너무 강력해서 그만..) 그리고 SD모델이 점점 커져서 SDXL같은 건 정말 좋은 GPU를 갖고 있는 유저들만 돌릴 수 있고 NAI나 기타 AI 생성 서비스가 좋아져서 굳이 civitAI까지 안 가도 되긴하다. 할부로 긁은 RTX4090이 언제까지 버틸련지... 어제 엔비디아 블랙웰 기사를 보는데 GPU가격은 천정부지에 소비전력과 크기도 만만치 않다... 물론 성능도 중요하지만 쿼드로~지포스급에선 성능보단 메모리 싸움인데, 이번 5000대도 24기가 달고 나오면 굳이 넘어가야하나? 싶다. 물론 엔비디아가 장사를 잘한다면 32GB나 48GB를 달고 나오겠지 어디까지나 희망사항이다. 근데 랭크인하면 이제 뭐함...? 네이버 생성형 AI쪽 취직 좀 시켜줬으면 GPU 개고순디

스테이블 디퓨전으로 고품질 그림을 생성하는 팁 몇 가지(3. hire.fix)

 팁 1, 2에서는 퀄리티 태그와 네거티브 프롬프트를 이용하여 높은 퀄리티의 그림을 생성하는 법을 보았다. 계속 프롬프트 이야기만 할 수는 없으니, 이제 파라미터 쪽으로 넘어가려한다.

이번에 다룰 주제는 hires.fix(High resolution fix)이다. 2023년도 후반에는 SDXL로 넘어오면서 기본 생성 해상도가 증가했고 hires.fix 까지 사용하는 코어 유저들은 img2img도 주로 사용하기 때문에 중요성이 떨어지긴 했으나, 필자같이 img2img가 귀찮은 유저들은 hires.fix를 주로 이용지도 모르겠다. 그래도 hires.fix를 사용하면 단번에 그림의 디테일이 상승하기 때문에 일단 알아두자. 특히 필자는 배경을 생성할때 hires.fix가 필수 옵션이라 생각하고 애용하고 있다.

high resolution fix = 고해상도 고치기다. 고해상도 생성시에 그림이 틀어지거나 퀄리티가 낮아지는 현상을 고쳐주는 옵션이다. 이 옵션이 왜 나왔냐면...

해상도: 1336*2032

해상도가 높으면 괴물이 나온다..... 참고로 hires.fix사용하기 전은 아래와 같다.

해상도: 832*1312

그리고 여기에 hires.fix를 이용하면?
해상도: 1080*1704

대충 필요성은 파악됬는가? hires.fix를 이용하면 저해상도로 생성하던 그림을 대강 유지하면서 고해상도로 생성하는 것이 가능하다. 사실 SDXL로 넘어오면서 1K가 넘는 해상도도 쉽게 생성할 수 있지만, SD1.5 시절에는 정말 필수 옵션이었다. 아무리 SDXL이 좋다 해도 해상도가 높아버리면 괴생명체가 나오는 것은 피할 수가 없기에 hires.fix를 알아두는 것이 좋다.
그럼 이제 진짜 hires.fix를 알아보자.

hires.fix 사용해보기


hires.fix옵션을 키면 다음과 같이 upscaler, hires steps, denoising strength, upscale by 옵션을 설정할 수 있게 되며, 이 옵션을 잘 설정해야 좋은 그림이 나온다. 그럼 어떻게 설정해야할까? 그 전에 먼저 hires.fix의 원리부터 알아보자.

hires.fix는 low-resolution pass(first pass, 첫번째 패스), high-resolution pass(second pass, 두번째 패스)로 나누어 생성한다. 즉, 두번 생성한다. 처음엔 text2img로 두번째는 img2img.

 low-resolution pass에선 저해상도로 생성하고, high-resolution pass에선 고해상도로 생성한다. 이름은 필자가 대충 붙였다. first pass, second pass가 가장 많이 사용되는 말인거 같다.(pass 대신 phase를 이용하기도 한다.)

암튼 왜 생성과정을 두개로 나누냐하면, 스테이블 디퓨전1은 512*512 해상도 이미지를 생성하는 AI 모델이다. 그런데, 1536*1536 같은 고해상도를 생성하라고 하면 못 한다. 그나마 512*512에 가까운 768급은 생성 가능하나, 1024를 넘기면 그림이 뒤틀리거나 망한 그림들이 나온다(위 그림참조). 그럼 이를 어찌하면 좋을까? 답은 img2img를 이용하는 것이다.

스테이블 디퓨전이 생성하기 적합한 해상도로 그림을 먼저 생성하고, 이미지 크기를 원하는 만큼 키운다. 그리고 크기를 키운 이미지를 img2img기능을 이용하여 덧칠하면 고해상도로 이미지가 생성된 것 같은 효과를 준다. 그래서 생성과정이 두개로 나뉘는 것이다. 첫번째 패스에선 저해상도로 이미지를 생성하고, 두번째 패스에선 고해상도로 이미지를 생성한다. 이 두 생성과정 사이에는 이미지를 키우는 Upscaler가 필요한데, hires.fix의 Upscaler 옵션은 어떤 방식으로 이미지 크기를 키울것인지를 고르는 옵션이다. 그럼 hires steps는? 두번째 패스에서 생성 steps를 몇으로 할지를 설정한다. Denoising strength는 img2img를 사용해보았다면 이미 알것이다. Denoising strength는 이따가 설명하도록하고, Upscale by는 이미지 크기를 몇 배로 늘릴것인지를 물어보는 것이다.

정리하자면 hires.fix는 이미지 생성과정을 하나 더 늘려서 두번에 과정에 걸쳐 이미지를 생성하는 기능이고, hires.fix에서 설정하는 옵션들은 두번째 생성과정에서 사용할 파라미터라 보면된다. 여기서 steps는 20 step만 되도 이미지 품질에는 크게 영향을 끼치지 않으므로 20~30으로 설정하면된다. 그럼 나머지 옵션들을 살펴보자.

Denoising strength

먼저 denoising strength를 알아보자. 이 denoising stength는 img2img에 있는 denoising strength와 동일한 옵션이다. img2img에서 지정하는 denoising stength는 기존 이미지에 노이즈를 얼마나 더하는 지를 지정한다. 0으로 넣으면 노이즈가 전혀 없으며, 1로 넣으면 이미지 전체가 노이즈로 뒤덮인다. 그런데 왜 굳이 이미지에 노이즈를 주어야할까? 스테이블 디퓨전의 이미지 생성과정은 노이즈 제거 과정과 비슷하다. sampler가 우리가 지정한 steps 만큼 노이즈를 제거하는 원리로 이미지를 생성한다. 그러니까, 노이즈가 존재해야 비로소 이미지가 새로 생성되는 것이다. (정확히는 데이터에 노이즈(잡음)를 주고 노이즈를 제거하는 과정을 반복한다. 실은 샘플러마다 다른데 정확히 아시는분 있으면 댓글로 달아주세요. 저도 몰름)

그럼 hires.fix에서 denoisng은 뭘까? 답은 첫번째 패스에서 생성된 이미지에 얼마나 노이즈를 뿌릴건지 설정하는 옵션이다. 두번째 패스에서 이미지에 노이즈가 있어야 고해상도에 맞추어 덧그리기 때문에 우리는 노이즈를 줘야한다. 노이즈를 얼마나 주느냐가 두번째 패스의 생성 퀄리티에 영향을 많이 주기 때문에 적절한 값이 필수이다. 필자는 보통 비 latent계 업스케일러를 이용할 때는 denoising stength를 0.5이하로 주며, latent계 업스케일러를 이용할때는 denoising stength를 0.5이상으로 준다.

latent계는 뭐고 비 Latent계는 뭘까? 업스케일러에 대해 알아보도록 하자

업스케일러(upscaler)

업스케일러는 말 그대로 크기를 키운다. 즉, 이미지 해상도를 높이는 작업이다. 일반적인 업스케일러는 nearest, bicubic, 기타 등등 여러가지 있지만, Latent는 처음 듣는 사람이 많을거다. 왜냐면... 그야 업스케일러가 아니니까...

Latent란 사실 AI쪽 용어이다.

Latent는 잠재적인 데이터이다 (전공자들은 그냥 래턴트(래튼트) 혹은 레이턴트(레이튼트)라 읽는다. 정확한 발음은 Latent. ㅋ) Latent엔 이미지가 잠들어 있다고 보면 된다(매우 고차원적인 데이터이다). 스테이블 디퓨전에선 매 스텝마다 이 Latent를 갈고 닦고(Denoising), 최종 형태로 VAE를 통해 비로소 Latent가 이미지로 변환되어(Decoder) 우리가 예쁜 그림을 얻을 수 있는 것이다. 

그러니까 굉장히 쉽게 말하자면 노이즈가 낀 Latent를 잘 디노이징해서 노이즈가 제거된 Latent로 만들고 이걸 VAE로 디코딩하면 이미지가 생성된다.

이 Latent를 업스케일하는 것이 Latent계 업스케일러다. Latent계 업스케일러는 첫 번째 패스에서 수행한 Latent 정보를 업스케일하고, 노이즈를 Latent에 뿌리고, 샘플링 과정을 수행한다. 반면, 비 Latent계 업스케일러는 첫번째 패스에서 수행한 Latent를 VAE로 통해 이미지로 변환한다. 그 후에 이미지를 업스케일하고 VAE를 통해 다시 Latent로 변환한다. 이 후 과정은 Latent계와 동일하다. 즉, Latent와 비 Latent 둘의 차이점은 Latent를 업스케일하는가 아니면 이미지를 업스케일하느냐 차이이다.

이미지를 업스케일하는 것은 저해상도 이미지의 정보를 그대로 담고 2차원 정보를 2차원으로 업스케일하기 때문에 퀄리티가 저하되는 일은 없다. 그리고 디노이징 값도 0~1 아무 값을 택해도 문제 없다. 하지만, Latent계 업스케일러는 적절한 디노이징값과 적절한 해상도를 택하지 않으면 이미지가 심각하게 무너진다. 이 차이를 알아보기 위해 한번 생성해보도록 하자.

실험할 프롬프트와 파라미터는 다음과 같다.

프롬프트: 1girl, best quality, masterpiece, large breasts, french braid, swept bangs, light brown hair, blue eyes, (realistic:0.6), fantasy, absurd long hair, makeup, eyeliner, eyeshadow, portrait, general, bare shoulders

파라미터: Steps: 30, Sampler: Euler a, CFG scale: 6, Seed: 2468925542, Size: 832x1312, Model hash: c200fb1ff3, Model: remaster+1.2-fp16, VAE hash: 63aeecb90f, VAE: sdxl_vae.safetensors, Seed resize from: 832x1312, ENSD: 31337, Pad conds: True, Version: v1.7.0
832*1312로 생성된 저해상도 이미지와 1081*1705(1.3배) 이미지를 비교하면 다음과 같다. (X축 denoising strength, Y축 업스케일러)


먼저 Latent를 보면 Denoising=0일 때, 이미지가 아닌 Latent를 업스케일하였기 때문에 VAE로 디코딩한 이미지를 보면 깨져 보인다. 그리고 Denoising=0.25도 다른 업스케일러에 비해 뿌옇게 보인다. Denoising 0.5부터 다른 이미지에 비해 뿌옇게 보이던 것이 사라지고 0.75는 다른 업스케일러와 비슷하다.
그외 Lanczos나 ScuNET PSNR은 디노이징에 따라 전부 비슷한 퀄리티를 보인다. Denoising 1.0일때는 1081*1705로 생성한것과 동일한 이미지이다. 목 길이와 어깨가 조금 부자연 스러운 것을 확인할 수 있다.
그럼 이제 해상도를 더 늘려보겠다. 1.6배(1328*2096)로 생성하면 다음과 같다.


해상도가 높아지니 denoising이 높을 수록 점점 미간이 심하게 넓어지기 시작했다. denoising 0.5도 미간이 조금 넓어진게 눈에 띄므로 1.6배는 0.5보다 낮게 생성해야할 것이다.

위 두 예시로 알 수있는 사실은 해상도가 증가하면 증가할수록 이미지가 뭉개진다는 것이다. 그러니 hires.fix의 해상도를 무작정 높이는 것 보단 적절한 한계치로 설정하는 것이 좋다. 물론, denoising 값을 낮추고 해상도를 높이는 방법도 있다. 업스케일로드 AI기반 고성능 업스케일러를 쓰면 더 좋을 것이다.

그럼 Latent계는 쓸 이유가 없지 않나? 그치만... Latent가 가장 빠르다.
아까 설명하였듯이 Latent계는 VAE로 디코딩하는 과정이 없기 때문에 빠르다. 또한, 메모리도 적게 먹는다. 비 Latent계 업스케일러 중에서 AI기반 업스케일러가 가장 성능이 좋지만 얘네들은 업스케일하는데 몇초씩 걸리면서 GPU 메모리도 많이 사용한다. 그런데 Latent는 그냥 Latent만 키우기 때문에 사실상 업스케일에 필요한 추가 자원이 0에 가깝다. 그런데 퀄리티를 보자. 특별히 떨어지는 부분이 있는가? 없다.

그리고 과연 SDXL에서 1.6배 업스케일할 수 있는 GPU가 몇개나 될까? 필자는 RTX 4090 24GB를 이용한다(200만원 중초반대 GPU이다). sdp-attention 옵션을 키고 생성하면 지금 생성한 1328*2096이 한계다. 270만 픽셀짜리 이미지를 생성하면 가용 GPU메모리가 24GB를 초과하는데, 일반 유저들이 이런 고해상도를 생성할 수 있을까? 불가능하다. 일반적인 수준의 GPU 메모리는 많아야 12GB 수준이다(RTX 3080ti, RTX4070ti 둘다 100만원 넘는 GPU이다).
그래서 필자는 Latent계를 추천한다. 뭐, 퀄리티 면에선 AI기반 업스케일러가 나은거 같기도 하다.

이번글은 hires.fix를 어떻게 이용할지에 대해 알아보았다. 인물 그림 그것도 portrait구도로 비교했는데, 실제로 사용해보면 인물 구도에 따라서(cowboy shot, fullbody), 그리고 풍경(scenery)인지에 따라서 적절한 업스케일러와 denoising값이 다르다.
필자는 scenery에선 latent에서 denoising을 높게주고, full body 인물샷에선 비 Latent계에서 denoising을 적게준다.
hires.fix에서 정답은 없다. 이번 글에서 각 파라미터의 경향성을 알았다면 이제 직접 사용해보면서 자신만의 적절한 파라미터를 찾아보자.

3줄 요약
hires.fix를 적절히 이용하면 고해상도 이미지를 잘 생성하는 것이 가능하다. hires 스텝수는 20~30(더 적게주어도 무방), upscale과 denoising값을 너무 높이면 그림이 이상해지므로 주의, 업스케일러도 Latent계와 비 Latent계 적절히 이용하자. Hires.fix 파라미터의 정답은 없다. 그림마다 적절한 파라미터를 찾아보자.

혹시 SDXL 쓰면서 잘 모르는 점이나 더 궁금한 점 있으면 댓글(글 쓸 소재) 달아주면 감사하겠다. 

댓글

이 블로그의 인기 게시물

Merged model ReMaster+ recipes(리마스터+ 레시피)

잡글) civitAI 랭킹 근황

야 너도 ComfyUI 쓸 수 있어. 스테이블 디퓨전 고수들만 쓰는 ComfyUI 기본 세팅하기 1