Published on

Stable Diffusion LoRA 적용 시 색감 붕괴 해결법

Authors

서로 다른 LoRA를 붙였더니 피부가 회녹색으로 뜨거나, 전체가 누렇게 변하고, 그림자만 과도하게 빨갛게 물드는 현상을 흔히 ‘색감 붕괴(color shift/collapse)’라고 부릅니다. 문제는 단순히 strength 를 낮추는 것만으로 끝나지 않습니다. LoRA가 건드리는 레이어(UNet, Text Encoder), 베이스 모델과 VAE 조합, 샘플러와 CFG 의 상호작용, 그리고 학습 데이터의 색 분포 편향이 동시에 겹치며 증상이 만들어지기 때문입니다.

이 글에서는 재현 가능한 진단 절차를 먼저 잡고, 그 다음 **적용 단계(추론)**에서의 해결책, 마지막으로 **학습 단계(LoRA 자체 품질)**에서의 근본 해결책을 정리합니다. LoRA 학습 품질 이슈는 아래 글도 함께 보면 원인 분류에 도움이 됩니다.

색감 붕괴가 생기는 대표 원인 6가지

1) LoRA 강도 과다(특히 UNet)

LoRA는 베이스 모델의 가중치에 델타를 더합니다. UNet 쪽 강도가 과하면 명암/채도/색온도까지 같이 끌고 가면서 전체 톤이 무너집니다. 반면 Text Encoder 쪽은 스타일/키워드 결합에 영향을 주지만, 색 붕괴는 보통 UNet이 더 크게 유발합니다.

2) 베이스 모델과 LoRA의 도메인 불일치

예: 실사 베이스에 애니풍 LoRA, 혹은 SD1.5 베이스에 SDXL LoRA를 억지로 붙이면(혹은 변환 과정이 섞이면) 색뿐 아니라 대비/노이즈 특성까지 어긋납니다. 결과적으로 특정 색이 과도하게 튀거나 탁해집니다.

3) VAE 불일치 또는 잘못된 VAE 사용

VAE는 잠재공간을 RGB로 복원하는 디코더 역할을 합니다. 베이스 모델에 권장되는 VAE가 있는데 다른 VAE를 쓰면 피부톤이 회색/녹색으로 가거나 전체가 누렇게 뜨는 현상이 자주 발생합니다.

4) 학습 데이터의 색 분포 편향(화이트밸런스/필터)

LoRA 학습 데이터가 특정 필터(예: 인스타 감성, 시네마틱 LUT)에 과도하게 치우치면, LoRA가 그 색감 자체를 “스타일”로 학습해버립니다. 이 경우 LoRA를 적용하는 순간 색감이 강제로 끌려가며 붕괴처럼 보입니다.

5) 샘플러·스텝·CFG와 LoRA의 상호작용

같은 LoRA라도 CFG 를 높이면 텍스트 조건을 과하게 밀어붙이며 색이 깨지거나 과포화로 튈 수 있습니다. 특정 샘플러(예: DPM 계열)에서 LoRA가 더 공격적으로 작동하는 경우도 있습니다.

6) 다중 LoRA 스태킹의 간섭

두 개 이상의 LoRA가 같은 스타일/색 채널을 서로 다른 방향으로 당기면 색이 “중간값”으로 뭉개지거나 특정 채널만 과증폭됩니다. 특히 둘 다 UNet에 강하게 적용될 때 심합니다.

재현 가능한 진단 절차(10분 컷)

색감 문제는 감으로 만지면 끝이 없습니다. 아래처럼 변수를 고정하고 하나씩 바꿔야 원인을 좁힐 수 있습니다.

1) 기준 샷 만들기

  • 같은 시드, 같은 프롬프트, 같은 네거티브
  • 같은 해상도
  • 같은 샘플러/스텝/CFG
  • 같은 VAE

그리고 아래 3장을 비교합니다.

  1. 베이스 모델만
  2. LoRA 적용(기본 강도)
  3. LoRA 적용(강도 절반)

2) VAE만 바꿔보기

LoRA를 끈 상태에서도 VAE에 따라 피부톤이 흔들리면, LoRA 이전에 VAE 문제가 섞여 있습니다.

3) UNet/Text Encoder 강도 분리

가능한 UI(A1111, ComfyUI 등)에서는 UNet과 TE 강도를 분리해 테스트합니다. 색 붕괴가 UNet 강도에만 민감하면 해결 방향이 명확해집니다.

4) CFG 스윕

CFG 를 3, 5, 7, 9처럼 바꿔보고 색이 언제부터 깨지는지 확인합니다. 특정 CFG 이상에서만 붕괴하면 “LoRA 강도”가 아니라 “조건 과적합” 문제일 가능성이 큽니다.

적용(추론) 단계 해결책: 설정으로 잡는 방법

1) LoRA 강도는 0.4 부근부터 시작

실무적으로는 아래 순서가 안정적입니다.

  • UNet: 0.35 ~ 0.7
  • Text Encoder: 0.2 ~ 0.6

스타일 LoRA는 낮게, 캐릭터/의상 LoRA는 조금 높게 가는 편이 안전합니다.

A1111 프롬프트 예시

아래처럼 인라인으로 강도를 조절합니다.

  • 단일 강도(일반)

<lora:my_style:0.55>

  • UNet/TE 분리(확장 문법을 지원하는 경우)

<lora:my_style:unet=0.55:te=0.35>

위처럼 부등호가 포함된 문법은 반드시 인라인 코드로 감쌌습니다.

2) VAE를 베이스 모델 권장 조합으로 고정

색감 붕괴가 “LoRA 문제”처럼 보이지만 사실 VAE 불일치인 경우가 많습니다.

  • SD1.5 계열: vae-ft-mse-840000-ema-pruned 같은 검증된 VAE를 우선 사용
  • SDXL 계열: SDXL 권장 VAE(모델 배포자가 명시한 것) 우선

진단 시에는 VAE를 바꾸지 말고, 하나를 고정한 뒤 LoRA만 조절하세요.

3) CFG를 낮추고 LoRA 강도를 올리는 전략

색이 깨질 때 흔한 실수는 CFG 를 더 올리는 것입니다. 오히려 아래가 안전합니다.

  • CFG4 ~ 6으로 낮춤
  • LoRA UNet 강도를 필요한 만큼만 올림

이렇게 하면 텍스트 조건이 색/톤을 과하게 강제하는 상황을 줄이면서, LoRA가 원하는 스타일만 가져오게 만들 수 있습니다.

4) 샘플러/스텝 조합을 바꿔 “색 과포화”를 완화

권장 접근:

  • 스텝을 무작정 올리기보다 20~30에서 안정화
  • 샘플러는 한 번에 하나만 바꾸기

예를 들어 DPM++ 계열에서 색이 과포화되면, Euler 계열로 바꿔 톤이 안정되는지 확인합니다(환경마다 결과가 달라 반드시 고정 시드로 비교).

5) 네거티브 프롬프트로 ‘색 채널 폭주’를 제한

LoRA가 특정 색을 과하게 밀어붙일 때는 네거티브가 즉효인 경우가 있습니다.

예시 네거티브(상황별로 일부만 사용):

oversaturated, overexposed, color banding, neon colors, yellow tint, green tint, magenta cast

핵심은 “예쁜 단어”가 아니라 증상을 기술하는 것입니다. yellow tint 처럼 색 캐스트를 직접 적으면 도움이 됩니다.

6) 다중 LoRA는 ‘역할 분리’와 ‘강도 합’ 관리

  • 스타일 LoRA와 캐릭터 LoRA를 동시에 쓰면 둘 다 강도를 낮게 시작
  • UNet 강도 합이 1.0을 크게 넘지 않게 관리(경험칙)
  • 비슷한 스타일 LoRA 2개는 피하기(색감 충돌 확률이 큼)

ComfyUI에서 색감 붕괴를 줄이는 워크플로 포인트

ComfyUI는 노드 단에서 원인을 분해하기 좋습니다.

1) LoRA 적용 위치 확인

  • Load Checkpoint 출력의 MODELApply LoRA 를 연결
  • CLIP 에도 LoRA를 적용할지 분리

색 붕괴가 심하면 우선 MODEL(UNet) 에만 적용하고, CLIP 적용은 꺼서 비교합니다.

2) VAE Decode 경로 고정

VAE Decode 에 들어가는 VAE가 체크포인트 내장인지, 별도 로드인지 혼동되면 색이 흔들립니다. 디버깅 시에는 VAE를 명시적으로 로드하고 고정하세요.

근본 해결: LoRA 학습/데이터 측면에서 색감 붕괴 줄이기

추론에서 어느 정도 완화할 수 있지만, LoRA 자체가 색을 “스타일”로 과학습했다면 한계가 있습니다.

1) 데이터 화이트밸런스와 색온도 정규화

  • 촬영 조건이 제각각인 실사 데이터는 화이트밸런스 편차가 큼
  • LUT/필터가 강한 데이터는 LoRA가 색을 고정 스타일로 배움

가능하면 학습 전 다음을 맞춥니다.

  • 동일한 색공간(sRGB)로 변환
  • 과도한 필터 제거 또는 필터 강도를 균일화
  • 노출/감마가 극단적으로 다른 샷 제거

2) 캡션에 색을 “불필요하게” 넣지 않기

캡션에 warm tone, cinematic color grading 같은 표현이 과도하면 LoRA가 색감을 목표로 삼습니다. 정말 색이 핵심인 LoRA가 아니라면 색 관련 토큰을 줄이세요.

3) 학습률/네트워크 차원 조절

너무 큰 rank(dim) 와 공격적인 학습률은 스타일을 과하게 주입해 색 붕괴를 유발할 수 있습니다. 특히 소량 데이터로 고차원 LoRA를 학습하면 색이 먼저 무너지는 패턴이 자주 나옵니다.

4) UNet만 학습 vs TE 포함 학습을 분리 검토

색 붕괴가 “키워드 트리거”와 강하게 묶여 있다면 TE까지 학습한 LoRA일 가능성이 있습니다. 용도에 따라:

  • 특정 키워드에만 반응시키고 싶다: TE 학습이 유리할 수 있음
  • 어디서나 자연스럽게 섞이고 싶다: TE는 최소화하고 UNet 중심이 안전한 경우가 많음

학습이 망가지는 전형적인 신호와 원인 분류는 아래 글을 참고하세요.

실전 체크리스트(문제별 빠른 처방)

증상 A: 전체가 누렇게/초록빛으로 뜸

  1. VAE를 베이스 권장으로 고정
  2. LoRA UNet 강도 0.4 수준으로 하향
  3. 네거티브에 yellow tint, green tint 추가

증상 B: 채도가 과도하게 올라가 네온처럼 됨

  1. CFG4~6으로 낮춤
  2. 스텝을 20~30으로 제한
  3. 네거티브에 oversaturated, neon colors 추가

증상 C: LoRA 2개 이상에서만 색이 깨짐

  1. 스타일 LoRA 강도를 먼저 낮춤
  2. UNet 강도 합을 1.0 근처로 관리
  3. 둘 중 하나를 TE만 적용하거나, 반대로 UNet만 적용으로 역할 분리

(코드) 자동 스윕으로 최적 강도 찾기: Diffusers 예시

UI에서 수동으로 맞추는 게 가장 빠르지만, 팀 작업이나 재현성을 원하면 스윕 스크립트가 유용합니다. 아래는 Hugging Face Diffusers로 LoRA 강도와 CFG를 스윕하며 결과를 저장하는 예시입니다.

import os
import torch
from diffusers import StableDiffusionXLPipeline

BASE_MODEL = "stabilityai/stable-diffusion-xl-base-1.0"
LORA_PATH = "./lora/my_style.safetensors"
OUT_DIR = "./out_sweep"

prompt = "portrait photo, natural skin tone, soft light"
negative = "oversaturated, neon colors, yellow tint, green tint"
seed = 1234

os.makedirs(OUT_DIR, exist_ok=True)

torch.manual_seed(seed)
pipe = StableDiffusionXLPipeline.from_pretrained(
    BASE_MODEL,
    torch_dtype=torch.float16,
).to("cuda")

# LoRA 로드
pipe.load_lora_weights(LORA_PATH)

# 스윕 파라미터
lora_scales = [0.35, 0.45, 0.55, 0.65]
cfg_scales = [4.0, 5.5, 7.0]
steps = 25

for lora_scale in lora_scales:
    pipe.set_adapters(["default"], adapter_weights=[lora_scale])

    for cfg in cfg_scales:
        g = torch.Generator(device="cuda").manual_seed(seed)
        image = pipe(
            prompt=prompt,
            negative_prompt=negative,
            num_inference_steps=steps,
            guidance_scale=cfg,
            generator=g,
        ).images[0]

        fn = f"lora_{lora_scale}_cfg_{cfg}.png"
        image.save(os.path.join(OUT_DIR, fn))

이 스윕 결과를 보면, 어떤 LoRA는 0.55에서도 멀쩡한데 어떤 LoRA는 0.45부터 색이 무너지는 식으로 “허용 범위”가 크게 다릅니다. 즉, 색감 붕괴는 모델이 나쁘다기보다 적정 강도/CFG 조합을 못 찾은 경우도 많습니다.

마무리

LoRA 적용 후 색감 붕괴를 해결하는 가장 효율적인 접근은 다음 순서입니다.

  1. VAE와 베이스 모델 조합을 고정하고, 동일 시드로 비교
  2. UNet 강도를 먼저 낮추고, 필요하면 TE 강도를 분리 적용
  3. CFG를 낮추는 방향으로 안정화한 뒤, 샘플러/스텝을 미세 조정
  4. 다중 LoRA는 역할 분리강도 합 관리
  5. 그래도 무너지면 LoRA 학습 데이터의 화이트밸런스/필터 편향을 의심

색감은 사용자가 가장 민감하게 느끼는 품질 요소라, 작은 설정 차이가 결과를 크게 바꿉니다. 위 절차대로 변수를 통제해가며 원인을 분해하면, “감으로 튜닝”하던 시간을 크게 줄일 수 있습니다.