AI 이미지/Flux AI

Flux Fill GGUF 를 사용한 자동 인페인트 아웃페인트

하늘이푸른오늘 2025. 2. 4. 15:34

제가 꽤 오래전에 SDXL 모델을 사용한 자동 인페인트 아웃페인트 워크플로를 소개시켜드렸습니다. 인페인트(inpainting)란 이미지의 일부만 다시 그리는 것을 말합니다. 옷이나 스타일을 바꾸고 싶거나 배경중 일부를 지우고 싶을 때 등에 사용합니다. 아웃페인트(outpainting) 이란 이미지를 바깥쪽을 채우는 방식으로 이미지를 키우는 것을 말합니다. 아래는 예전 글에서 만들어 둔 예로서, 좌측 원본 이미지(1024x1024)를 1536x1024 크리고 늘린 이미지입니다.

특히 이 워크플로에서는 이미지를 분석해서 프롬프트를 자동으로 만들어주는 기능이 들어 있어서 그냥 원하는 새로 그리고자 하는 부분만 지정하면 자동으로 인페인트/아웃페인트가 되는 장점이 있습니다.

이러한 워크플로는 Flux.1 dev Fill GGUF 모델로도 구현할 수 있습니다. 

소프트웨어

이 글에서는 스테이블 디퓨전용 GUI중에서도 제가 제일 좋아하는 ComfyUI를 사용합니다. ComfyUI가 처음이시라면, 설치 및 기본 사용방법초보가이드를 확인하시기 바랍니다.

Flux Fill 모델이란

모델

Flux.1 Fill 모델은 인페인트 모델입니다. 인페인트 모델은 이미지 전반에 걸친 일관성을 최대한 유지하면서 비어있는 콘텐츠를 채우도록 훈련된 모델입니다.

Flux.1 Dev Fill 모델인 Flux.1 Pro Fill 모델의 빠른 버전입니다. 안내 농축(guidance distillation)을 사용하여 속도를 올리고 무분류기 안내(CFG, Classifier-free guidance) 없이 잡음을 제거합니다. 그 결과 품질은 거의 변함이 없으면서도 속도가 2배로 빨라집니다.

GGUF(GGML Universal File)는 텐서와 메타데이터를 단일 파일에 저장하는, 모델 데이터를 빠르게 저장하고 로드할 수 있도록 설계된 파일 포맷입니다. 원래 Flux Fill 모델은 최소 24GB VRAM을 요구하지만, GGUF 파일을 사용하면 GTX3070으로도 무난하게 돌릴 수 있습니다.

라이선스

Flux.1 Fill 모델은 동일한 비-상업용 Flux.1 Dev 라이선스를 따릅니다. 따라서 생성된 이미지를 상업적 목적으로도 사용할 수 있습니다.

따라하기

1 단계: Flux.1 Fill dev GGUF 모델 다운로드

GGUF unet 모델

아래 사이트에서 파일을 다운로드 받아, ComfyUI\models\unet 폴더에 넣어줍니다.

FLUX.1-Fill-dev-gguf

여기에는 아주 많은 파일이 들어있는데, 다 받을 필요는 없습니다. 저는 파일 크기가 가장 큰 flux1-fill-dev-Q8_0.gguf 만 받았습니다.

CLIP 모델

아래 사이트에서 파일을 다운로드 받아, ComfyUI\models\clip 폴더에 넣어줍니다. 마찬가지로 다 받을 필요가 없고, 다운로드 받은 unet과 동일한 버전만 받으시면 됩니다.

t5-v1_1-xxl-encoder-gguf

또한 clip_l.safetensors 파일도 동일한 폴더에 다운 받아줍니다.

vae 모델

마지막으로 vae 모델이 필요합니다. 여기에 들어가서 다운로드 받은뒤, ComfyUI_windows_portable\ComfyUI\models\vae 폴더에 넣어주시면 됩니다. 원하시면 구분하기 쉽도록 파일명을 flux-dev-gguf.safetensors 로 변경해주시면 좋습니다.

2단계: 워크플로 불러오기

아래의 JSON 파일을 ComfyUI에 불러옵니다. 좌측위의 Workflow->Open 메뉴를 사용하면 됩니다. 

Flux_Fill_InOutPaint_Auto.json
0.02MB

이 워크플로를 불러오면 대부분 오류가 발생할 것입니다. 그러한 경우, 다음과 같은 작업이 필요합니다.

3 단계: 이미지 불러오기

[Load Image] 노드에 편집하고자 하는 이미지를 불러옵니다. 아래의 사진을 사용하셔도 됩니다.

outpaint-flux-fill-example.png
1.93MB

4단계: 인페인트 마스크 생성 (필요시)

[Load Image]의 이미지에서 우클릭하고 "Open in MaskEditor"를 선택합니다.

변경하고자 하는 지역을 표시하고 "Save"를 선택합니다.

이제 워크플로로 돌아오면 이미지에 마스크가 표시됩니다.

5 단계: 아웃페인트 범위 설정

현재는 좌우로 128 픽셀씩 늘리도록 설정되어 있습니다. 더 크게 설정해도 괜찮습니다.

6 단계: 이미지 생성

[Queue] 버튼을 누르면 인페인팅이 시작됩니다. 아래는 결과 이미지입니다.

7 단계: 추가 인페인트/아웃페인트 (필요시)

이 워크플로를 한번 실행시키면, 아래 왼쪽에 새로 생성된 이미지가 나타납니다. 이걸 검토해 보고 더 확장하거나, 인페인트로 실행하고 싶을 수 있습니다. 이럴 때에는 아래 화살표를 쳐둔 [Switch (image, mask)] 노드에서 아래와 같이 2로 바꿔주면 아래에 새로 생긴 이미지가 입력으로 사용됩니다. 

다만, 위쪽에 동그라미를 쳐둔 [InvertMask] 노드의 경우, 입력으로 사용하는 이미지에 Mask가 있으면 이 노드를 통과하고, 아니면 Cntl+B를 눌러서 Bypass 시키고 사용하셔야 합니다. (이것은 제가 사용한 [Image Pad for Outpaint Masked]가 잘못 설계된 탓입니다. 이해해주시기 바랍니다.)

아래는 이렇게 인페인트/아웃페인트를 두번 적용한 결과입니다.

이상입니다.

SDXL 버전과 Flux Fill 버전 비교

예전의 SDXL 버전에서는 한꺼번에 크게 넓히려고 하면(예: 좌우로 400 픽셀씩) 아래에서 보시는 것처럼(4번 생성한 결과를 그대로 보여드린 겁니) 잘 채워지지 않는경우가 많았습니다. 그래서 조금씩 여러번 확대하는 방법을 사용해야 했습니다. 

그렇지만, Flux Fill 모델의 경우, 확대 범위가 넓어도 한번에 잘 Outpaint가 됩니다. 여러번에 나눠서 아웃페인트를 할 필요가 없습니다. 그냥 잘 그려집니다. 다만, 3070 기준 한장 생성하는데 1분 30초 정도 걸리는게 흠이네요.

아래는 SDXL용 자동 인페인트/아웃페인트에서 사용했던 예입니다. 윗쪽 두개는 원본 이미지 좌측 아래에 치마 형태가 조금 보여서이고, 아래쪽 두개는 이부분은 마스크한 뒤 Inpaint/Outpaint를 적용한 결과입니다. 

참고로, SDXL 버전에서는 [WD14 Tagger] 또는 [ClipTextEncodeSDXL]노드를 사용해 원 이미지의 프롬프트를 추출하여 이미지 생성에 사용했으나, 이번 Flux Fill 버전에서는 Prompt는 전혀 아무것도 건드리지 않고 이미지를 생성하였습니다.

이상입니다.