【Stable Diffusion】VAEの選び方とbaked VAEの違い|画質劣化・色味異常の解決法

問題の概要:生成画像の画質劣化、色味異常、ぼやけ

Stable Diffusionで画像生成を行う際、以下のような問題に遭遇したことはありませんか?

  • 生成された画像が全体的に「ぼやけている」「ディテールが潰れている」
  • 顔や肌の色が不自然に青白い、または灰色がかっている
  • 高解像度で生成しても、低解像度のような「にじみ」や「ざらつき」が発生する
  • 特定のモデル(チェックポイント)を使うと、なぜか画質が悪くなる

これらの症状は、VAE(Variational Autoencoder)の設定が適切でない、またはモデルに内包された「baked VAE」の理解が不足していることが原因である可能性が非常に高いです。エラーメッセージというよりは、生成結果の品質問題として現れますが、根本的な原因はVAEにあります。

# 問題が発生している場合の生成コマンド例(AUTOMATIC1111 WebUI)
# 何も指定せずに生成すると、デフォルトのVAEが適用される
Prompt: masterpiece, best quality, 1girl, detailed face
Negative prompt: lowres, bad anatomy
Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: -1, Size: 512x768

原因の解説:VAEとbaked VAEの役割と違い

この問題を解決するには、まずVAEの役割と「baked VAE」の概念を理解する必要があります。

VAE(Variational Autoencoder)の役割

Stable Diffusionの画像生成プロセスは、大きく分けて2段階あります。

  1. 潜在空間での生成: ノイズから、低解像度(例: 64×64)の「潜在表現(Latent)」を生成する。
  2. 潜在表現のデコード: 生成された潜在表現を、高解像度の画像(例: 512×512)に「デコード(変換)」する。

この2番目の工程、「潜在表現を人間が見られる画像に変換する役割」を担うのがVAEのデコーダー部分です。つまり、VAEは生成の最終段階で画質や色味を決定する極めて重要なコンポーネントなのです。不適切なVAEを使用すると、せっかく高品質な潜在表現が生成されても、最終画像が台無しになってしまいます。

baked VAE(焼き込み済みVAE)とは?

Stable Diffusionのモデルファイル(.ckptまたは.safetensors)には、通常以下の要素が含まれます。

  • U-Net(画像生成の中核モデル)
  • CLIP(プロンプトを理解するテキストエンコーダ)
  • VAE(オプション)

この「オプション」の部分がポイントです。モデル作成者が学習時に使用した特定のVAEをモデルファイルに内包(焼き込み)することがあります。これがbaked VAE(焼き込み済みVAE、内蔵VAE)です。baked VAEが存在するモデルでは、ユーザーが別のVAEを明示的に指定しない限り、この内蔵されたVAEが自動的に使用されます。

問題の核心はここにあります。 モデルによっては、baked VAEの品質が低かったり、特定の用途(アニメ調など)に特化しすぎていたり、あるいはそもそもbaked VAEが破損している場合さえあります。その結果、冒頭で述べた画質劣化や色味異常が発生するのです。

解決方法:適切なVAEを選択・適用するステップバイステップガイド

問題を解決し、最高の画質を引き出すための具体的な手順を説明します。

ステップ1:使用中のモデルにbaked VAEが含まれているか確認する

AUTOMATIC1111 WebUIを使用している場合、生成時の情報欄を見ることで確認できます。

# 生成後に表示される情報の例
Model: anything-v4.5.safetensors [c45c6eb696]
VAE: N/A ← これが「N/A」や何も表示されない場合、baked VAEが使用されている可能性が高い。
VAE: vae-ft-mse-840000-ema-pruned.ckpt ← 外部VAEが明示的に適用されている場合、ここに名前が表示される。

「VAE: N/A」と表示されるモデルは、ほぼ確実にbaked VAEを持っています。

ステップ2:高品質な外部VAEをダウンロードして適用する

baked VAEに問題を感じたら、またはより汎用的な画質を求めるときは、外部のVAEを適用します。おすすめのVAEは以下の通りです。

  • SD 1.x モデル用: `vae-ft-mse-840000-ema-pruned.ckpt` (Hugging Faceなどで配布)
  • SD 2.x モデル用: `vae-ft-mse-840000-ema-pruned.safetensors` (SD2.x用に微調整された版)
  • Anime系モデル用: `orangemix.vae.pt` (Anything-V3.0などアニメ系モデルと相性が良い)

適用方法(AUTOMATIC1111 WebUI):

  1. ダウンロードしたVAEファイルを `stable-diffusion-webui/models/VAE` フォルダに配置します。
  2. WebUIを再起動するか、設定画面から「Reload UI」をクリックします。
  3. WebUI上部の「Settings」タブ → 「Stable Diffusion」をクリック。
  4. 「SD VAE」のドロップダウンメニューから、先ほど配置したVAEを選択します。
  5. 画面最上部の「Apply settings」をクリックし、続いて「Reload UI」をクリックして設定を反映させます。
# 設定が反映されたか確認するコマンド例
# 再度画像を生成し、情報欄を確認する。
Model: anything-v4.5.safetensors
VAE: vae-ft-mse-840000-ema-pruned.ckpt ← 選択したVAE名が表示されれば成功!

ステップ3:モデルごとにVAEを自動切り替えする(上級者向け)

複数のモデルを使い分ける場合、モデルごとに最適なVAEを設定したいことがあります。その場合は「Extra Networks」機能を使います。

  1. 使用したいモデル(例: `my_anime_model.safetensors`)と、それに紐づけたいVAE(例: `orangemix.vae.pt`)を用意します。
  2. モデルファイルの名前を以下のように変更します:
    `my_anime_model.safetensors` → `my_anime_model.vae.pt.safetensors`
  3. この改名したモデルファイルを `stable-diffusion-webui/models/Stable-diffusion` フォルダに配置します。
  4. VAEファイル(`orangemix.vae.pt`)は `models/VAE` フォルダにそのまま配置します。

この状態でWebUIから `my_anime_model.vae.pt` モデルを読み込むと、自動的に `orangemix.vae.pt` がVAEとして適用されます。これにより、baked VAEを強制的に上書きできます。

ステップ4:baked VAEを無効化・分離する(最終手段)

品質の悪いbaked VAEがどうしても邪魔な場合、モデルファイルからVAEの重みを取り除く(「unbake」する)ツールを使用できます。これにより、純粋なU-NetとCLIPのみのモデルが作成され、常に外部VAEを適用できるようになります。

注意:この操作はモデルファイルを永続的に変更します。必ずバックアップを取ってから行ってください。

# unbake処理を行うPythonスクリプトの使用例(概念)
# 実際にはCivitAIなどで配布されている専用ツールやWebUI拡張を使用します。
# コマンド例(ツールによって異なります):
python split_baked_vae.py --input model_with_bad_vae.safetensors --output model_unbaked.safetensors

コード例・コマンド例まとめ

# 状況別の対処法まとめ

# 【ケースA】baked VAEの品質が悪いと感じる場合
1. `models/VAE/` に高品質VAEを配置。
2. Settings → Stable Diffusion → "SD VAE" で選択。

# 【ケースB】特定のアニメモデルに最適なVAEを適用したい場合
1. モデル名を `model_name.vae.pt.safetensors` に変更。
2. 対応する `orangemix.vae.pt` を `models/VAE/` に配置。
3. 変更後のモデル名で読み込み。

# 【ケースC】コマンドライン(--vae-path)で直接指定する場合(WebUI起動時)
./webui.sh --vae-path models/VAE/vae-ft-mse-840000-ema-pruned.ckpt

# 【ケースD】生成スクリプト内でVAEを指定する場合(diffusersライブラリ使用例)
from diffusers import StableDiffusionPipeline
import torch

pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16,
)
pipe.vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse") # ここでVAEを差し替え
pipe.to("cuda")

まとめ・補足情報

VAEはStable Diffusionにおける「最終出力エンジン」であり、その選択は生成画像の品質を左右する最重要設定の一つです。baked VAEは便利ですが、常に最適とは限りません。画質に不満を感じたときの最初のチェックポイントとして「VAEを変えてみる」ことを強くお勧めします。

補足ポイント:

  • VAEのキャッシュ: VAEを変更した後、以前のモデルで生成した画像のキャッシュ(latent)が残っていると、期待通りの結果にならないことがあります。疑わしい場合は、生成時に「Seed」を「-1」(ランダム)に設定するか、WebUIを再起動してみてください。
  • VRAM使用量: 高精細なVAEは若干VRAMを多く消費する場合があります。メモリエラーが発生する場合は、`–medvram` や `–lowvram` オプションでWebUIを起動することを検討してください。
  • モデルとVAEの相性: 特にアニメ特化モデルとフォトリアル特化VAEなど、ジャンルが大きく異なる組み合わせでは、かえって不自然な結果になることがあります。モデル作成者が推奨するVAEがある場合は、まずそれを使用しましょう。

適切なVAEの選択は、Stable Diffusionの可能性を最大限に引き出すための鍵です。本ガイドを参考に、自分だけの最高品質の画像生成ワークフローを構築してください。

💡 この問題を根本的に解決するには

ローカル環境でGPUトラブルが頻発する場合、クラウドGPUサービスの利用も検討してみてください。環境構築の手間なく、すぐにAI開発を始められます。

  • RunPod — RTX 4090が$0.44/h〜、ワンクリックでJupyter環境が起動
  • Vast.ai — コミュニティGPUマーケットプレイス、最安値でGPUレンタル
この記事は役に立ちましたか?