WebUI 또는 ComfyUI를 활용해 인물 그림을 생성하시는 분들은 한 번쯤 Stable Diffusion 얼굴 뭉개짐에 대해 고민해보신 적이 있을 것입니다. 특히 전신 인물을 그릴 때 얼굴이 괴상하게 변하는 경우가 많은데요, 본 글에서는 스테이블 디퓨전 얼굴 뭉개짐의 이유와 그 해결 방법에 대해 한 번 살펴보고자 합니다.
Stable Diffusion 얼굴 뭉개짐 이유
대부분의 사람들이 사용하고 있는 스테이블 디퓨전 버전은 크게 SD1.5와 SDXL로 나뉠 수 있습니다. 특히 수많은 로라와 여타 신기술들은 아직도 SD1.5 버전에 맞게 공개되는 경우가 대부분입니다. 여기서 중요한게 SD1.5, SDXL의 본 모델 학습 해상도가 각각 512×512, 1024×1024라는 것입니다.
그럼 이제 SD1.5로 그림을 그리는 상황을 가정해보겠습니다. 전신을 그리기 위해 512×512 해상도가 아닌 1024×1024 해상도로 인물을 그려보면, 프롬프트와 달리 여러가지 이상한 그림이 생성되곤 합니다. 예를 들어 1명을 그리라고 했으나 2명, 3명이 나타나거나, 1명이지만 팔다리가 인체 신비전을 보여주는 등의 기괴한 그림입니다. 설령 1명의 사람이 잘 그려졌다 하더라도, 얼굴이 뭉개진 그림이 나오게 됩니다.
위 그림은 1024×1024 해상도로 생성한 그림입니다. 프롬프트에는 1girl, solo를 입력했지만 2번째 사진을 보면 역시나 2명의 사람이 등장하는 것을 볼 수 있습니다. 게다가 두 사진 모두 얼굴을 자세히 보시면, 디테일이 매우 떨어집니다. 눈코입은 있지만 역시나 어딘가 어색한 형태입니다.
그럼 도대체 왜 높은 해상도로 그리면 얼굴이 뭉개지고 원치않은 인물이 추가로 등장하는 것일까요? 그 이유는 바로 스테이블 디퓨전이 빈 공간을 싫어하기 때문입니다. 무슨 말인가 하면, 512×512 해상도로 학습된 모델로 그림을 그리는데, 그 이상의 해상도로 그림을 그려달라고 요구하면, 스테이블 디퓨전은 이제 추가된 공간에 뭐라도 그려넣으려고 노력한다는 것입니다. 그러다보니 의도치 않은 인물이나 사물 등이 추가로 등장하기도 하는 것입니다.
또한 스테이블 디퓨전이 사용자의 의도가 반영된 프롬프트를 재현하는데 온전히 집중하지 못하고 추가 공간에 그림을 그려넣는 것에 힘을 쓰다보니 전반적인 그림의 퀄리티가 하락하는 것입니다. 그럼 스테이블 디퓨전 얼굴 뭉개짐을 해결하는 방법은 없을까요?
스테이블 디퓨전 얼굴 뭉개짐 해결 방법
스테이블 디퓨전 얼굴 뭉개짐 뿐만아니라 인체신비전 또는 기괴한 사물, 추가 인물 등장 등을 방지하고 사용자가 원하는 의도대로 전신 인물을 생성하는 방법에 대해 살펴보면 크게 아래와 같이 3가지 방법을 고려해볼 수 있습니다.
업스케일(upscale)
업스케일은 이미 그려진 그림을 높은 해상도로 올리는 작업입니다. 따라서 512×512 해상도의 그림을 그린 뒤, 해당 그림을 2배 업스케일하여 1024×1024로 만드는 원리로 Stable Diffusion 얼굴 뭉개짐을 예방할 수 있습니다. 이때 아래와 같이 Hires.fix 기능을 사용하면 단 한번의 생성(Generation) 버튼을 눌러 업스케일을 진행할 수 있습니다.
Hires.fix 기능에서 조작 가능한 설정값을 살펴보면 다음과 같습니다.
- Upscaler : 업스케일에 사용할 모델 선택, 주로 실사는 R-ESRGAN 계열을 사용합니다.
- Hires steps : 업스케일을 진행하는 스텝(기본값 0으로 두면 알아서 진행, 사용자 수정 가능)
- Denoising strength : 업스케일 진행시 원본과 얼마나 다르게 할것인지 입력(0~1.0)
- Upscale by : 업스케일 배수 입력
디노이징 강도를 0.5 이하로 잡으면 업스케일 전후 사진에서 큰 변화가 없지만, 0.5 이상의 값으로 업스케일을 하게 되면 원래 그림에서 변형되는 것을 보실 수 있습니다. 아래 그림은 위 세팅대로 업스케일 전후를 비교한 그림입니다.
두 사진을 비교해보면 업스케일링을 통해 확실히 얼굴 뭉개짐이 개선된 것을 확인할 수 있습니다.
인페인트(inpaint)
업스케일을 진행하지 않고도 얼굴만 다시 디테일을 살리는 작업을 해주는 방법도 있습니다. 바로 i2i에서 인페인트(inpaint)기능을 활용하는 것입니다.
먼저 512×512 해상도로 생성된 뭉개진 얼굴 사진을 inpaint영역에 삽입한 뒤, 얼굴을 마스킹해줍니다. 이후 설정값을 다음과 같이 입력합니다,.
- Resize Mode : Just resize(latent upscale)
- Mask mode : Inpaint masked
- Masked content : original
- Inpaint area : Only masked
- Resize to : 512×512
- Denoising strength : 0.75
이렇게 설정하고 생성을 누르면 사용자가 마스킹한 부분을 512×512 사이즈로 다시 그려서 원본 그림에 해상도 맞게 업스케일 하여 합성(Just resize)해주는 작업이 진행됩니다. 디노이징 강도를 적당히 조절하면 원본과의 유사도를 유지할 수도 있습니다.
전체 그림을 그대로 유지한 채로 얼굴만 다시 그려넣은 것을 확인할 수 있습니다. 앞서 위에서 진행했던 Hires.fix의 경우 얼굴 이외의 부분에도 디테일이 상승되었지만, inpaint를 활용한 경우는 이처럼 의도한 일정 부위만 다시 그려넣기 때문에, 얼굴뿐만 아니라 다른 수정사항(예를 들어 손과 발의 위치나 디테일이 떨어지거나, 신발을 바꾸고 싶다는 등)이 필요할 때도 활용할 수 있습니다.
디테일러(detailer)
디테일러는 다양한 WebUI 확장기능 중 하나입니다. 사용자에 따라 선호하는 디테일러가 다를 수 있는데요, 개발자가 얼마나 업데이트 및 유지 보수를 잘 해주는지, 최신 버전 WebUI와 호환성 여부 등을 잘 확인하여 선택해 사용하면 됩니다.
디테일러를 설치하여 사용하는 경우 대부분 앞서 살펴본 인페인트 작업을 자동으로 진행하는 방식으로 얼굴 및 인물의 전체적인 디테일을 끌어올립니다. 최근 가장 핫한 디테일러가 바로 BMAB인데요, 확장기능으로 BMAB을 설치한 뒤 여러 살정값을 주면 그림 내에서 인물을 더욱 깔끔하게 생성해낼 수 있습니다.
위 예시에서는 Enable BMAB을 활성화한 뒤, Face 탭의 Enable face detailing만 활성화하여 이미지를 생선한 결과입니다. 결과 그림에서 확인할 수 있듯 얼굴이 뭉개지지 않고 잘 그려진 것을 볼 수 있습니다. BMAB에는 얼굴 뿐만아니라, 손, 사람 전신, 컨트롤넷 등 디테일링을 제어할 수 있는 다양한 옵션이 있습니다. BMAB의 조금 더 구체적인 기능에 대해서는 다른 글에서 자세히 살펴보도록 하겠습니다.
이로써 Stable Diffusion 얼굴 뭉개짐의 원인과 해결 방안에 대해 살펴보았습니다. 특히 본문에서 제시한 해결방안 각가의 원리를 이해하면 꼭 얼굴 뿐만 아니라 다양 부분에 활용할 수 있으므로 꼭 한번 읽어보시고 다른 부분에도 응용해보시기 바랍니다.