img2img入門(8) アップスケーリング基礎編
この記事では、img2img で生成した画像の解像度を上げる『アップスケーリング』を行う方法について解説します。
アップスケーリングの必要性
アップスケーリングとは、画像を拡張し、解像度を上げることを指します。AUTOMATIC1111の生成する画像のサイズは、デフォルトで512px×512pxとかなり低解像度です。Stable Diffusion を使った画像生成では、このように低解像度で生成した画像からノイズを除去し、超解像化していくことで高解像度の最終版を作っていきます。
しかし、それならなぜ最初から高解像度で生成しないのでしょうか。それは、高解像度の画像は、巨大な演算空間が必要になるからです。縦横が倍になると、ピクセル数は4倍になります。大きな画像を作るためには巨大なVRAM、つまり高価なGPUが必要になるからです。さらに、大きな画像を生成しようとすると画像自体が崩壊してしまうこともあります。
アップスケーリングの方法はいくつかありますが、ここではここでは、Stable Diffusion 1.x系のモデル「bluePencil_v9b」でのimg2imgを利用したアップスケーリングについて解説します(SDXL系はさらに大きなメモリが必要になるため)。
img2imgを使ったアップスケーリング
seed値を固定し、生成した画像をもとに img2img を繰り返し、画像のサイズを拡大した生成結果を比較していきましょう。まずt2iで画像を生成します。
モデル bluePencil_v9b
プロンプト masterpiece, best quality, ultra detailed, 1girl
ネガティブプロンプト worst quality, low quality, normal quality, easynegative, NSFW
生成サイズ 512×512
masterpiece, best quality, ultra detailed, 1girl,
Negative prompt: worst quality, low quality, normal quality, easynegative, NSFW,
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 43598724, Size: 512x512, Model hash: 6772b99463, Model: bluePencil_v9b, VAE hash: ab33ad55c6, VAE: clearvae_v23.safetensors, TI hashes: "easynegative: c74b4e810b03", Version: v1.6.0-2-g4afaaf8a
720×720
1024×1024
1280×1280
1920×1920
画像のサイズが上がるにつれ、クオリティが下がっていくのがわかります。1024×1024にすると人体が崩壊しはじめ、1920×1920では人間の面影もほとんどなくなってしまいました。
これは、Stable Diffusion 1.xが学習している画像のサイズが512×512であるために起こります。
Stable Diffusionは、CompVis、Stability AI、LAIONの研究者とエンジニアによって作成されたテキストから画像への潜在拡散モデルです。LAION-5Bデータベースのサブセットの512x512画像で学習されます。LAION-5Bは、現在存在する最大の、自由にアクセス可能なマルチモーダルデータセットです。
そのため、SD1.x系で高解像度の画像を生成したい場合は、512×512を基準とした低解像度で画像を生成し、それをアップスケーリングすることが重要なテクニックになってきます。
アップスケーリングの方法はいくつかありますが、ここではi2iを利用したアップスケーリングについて解説します。
i2iを使ったアップスケーリング
この方法は、シンプルにi2iで大きい画像サイズや倍率を指定して生成する方法です。
この画像を 🖼 「Send to Img to Img」ボタンを使って、i2iタブに渡し、『Resize to』のパラメータで大きいサイズを指定します。今回は2倍の1024×1024に指定しました。『Resize by』で拡大する倍率を指定してもかまいません。
今回は元のイラストと近いイラストを生成したいので、プロンプトはそのまま、変更しません。そして『Denoising strength』は0.5にしておきます。値が小さすぎると描き込みが増えず、元絵に忠実ではありますが、サイズが大きいにもかかわらず低解像度のような低品質な画像になってしまいます。ちょうどいい値を探りましょう。『Generate』で生成します。
高解像度化することができました。拡大して比較してみましょう。
線が滑らかになり、アップスケーリングに成功していることがわかります。
Step数を上げる
先ほどアップスケールしたイラストと元のイラストを比べると、手や口元などの細部が少し異なっていることがわかります。
これをより元のイラストに近づけたい時には『Sampling steps』の値を増やします。
Stepとは、デノイズ処理を行う回数のことです。デフォルトでは20ですが、60に上げて生成したものを先ほどのイラストと比較してみましょう。
stepを上げた画像の方が、手や口元の精度が増していますね。Script「X/Y/Z plot」を使って、Steps を {20,40,60}, Denoisingを {0.4,0.5,0.6}して比較するなどして 好みのバランスを探ってみてください。
例えば冒頭の例だと右手に持っている「何か」が少し邪魔ですね。
Step=40, Denoising=0.6 が口や表情の雰囲気がいいと思います。
この生成結果をさらに img2img や Extras にかけることで 512→1024→2048と精緻に制御を保ったまま細部を描きこみながら解像度を上げることができます。
この例は、上記の手法で錬成した1024x1024の画像を Extrasのアップスケーラー「R-ESRGAN 4x+ Anime6B」を使い x4倍、つまり4096x4096ピクセルにしたものです。アップスケールにかかる時間は10秒ほどで、生成にくらべてメモリ消費も大きくありません。
今回紹介したアップスケーリング手法は基本中の基本で、省メモリで効果が大きい手法になります。他にも Hirez.FixやVAE、ControlNetなど各種機能拡張でのアップスケーリング手法がありますが、まずは基本として何度か練習をしておくことをおすすめします。
ここから先は
応援してくださる皆様へ!💖 いただいたサポートは、より良いコンテンツ制作、ライターさんの謝礼に役立てさせていただきます!