Stable Diffusion では様々なサイズの絵を描くことが出来ます。
大きめのサイズの画像が欲しいけど、なぜか出力された画像が変な結果の画像ばかり。使える画像がほとんどない!
そんな経験はありませんか?
実は基本的なモデルの学習が512×512で行われているため、サイズを大きくすると例えば512×512が2つ組み合わさったようなものになってしまっているため起きています。
他にも縦長画像を作った場合、例えば512×768ではうまく生成されるので、サイズを大きくして1024×1536にしたら、破綻した画像ばかり生成されることも良く起きます。
そこで今回は「Hires.fix」という機能を使って、画像を破綻させずに高画質化する方法について紹介します。
結果
・サイズが大きい画像を生成しても、「Hires.flx」を使うと破綻が少ない
・正方形でないサイズの画像生成時でも、破綻が少ない
・モデルとUpscalerによってはエラーが起きるが、変更することで解消できる
この記事を読むと
高画質の画像でも破綻せずに生成することが出来ます。
※記事内に広告が含まれています。
「Hires.fix」とは?
基本的な問題として、Stable Diffusion はノイズを除去することで絵を描いています。
そのため、小さいサイズを指定すると相対的に除去するノイズが大きくなってしまい、手足など詳細部分を荒く除去してしまいます。
その結果、手の平がぐちゃぐちゃになってしまったり、細かい情景がおかしくなってしまいます。
しかし単純に画像サイズを大きくした場合、特に正方形以外の画像サイズを大きくして出力すると、学習モデルからうまく追随できずに、良く分からない画像が生成されてしまいます。
例えば1024×1536のサイズなどでは、512×512のモデルを単純に2倍にしたものではないので、引き伸ばされた画像の間の補完がうまくいかずに、破綻した画像が描いてしまうためです。
「Hires.fix」とは生成した低サイズの画像をアップスケールして、そこに対して情報を追加し大きいサイズの絵として出力する機能になります。
そのため、512×512に近い形で絵を描くため破綻が少なく、そこからアップスケールするため大きいサイズの良い絵を描くことが出来ます。
「Hires.fix」のインストール
「Hires.fix」はStableDiffusion の拡張機能なので、StableDiffusionをインストールすると自動で使うことが出来ます。
【検証】実際にHires.fix使って描いてみた
実際に1024×1536の画像で、「Hires.fix」の使用有無で比較してみたいと思います。
「Hires.fix」準備
「Hires.fix」はタブが隠れている状態では機能OFF、表示されている状態でONになります。
スイッチなどはありませんので注意してください。
出力結果
Hires.flx:OFF
初めに「Hires.flx」OFFの状態で大き目のサイズの画像(1024×1536)を出力してみます。
使用するプロンプトは下記になります。
プロンプト
upper body,
(best quality, masterpiece, 16k, ultra detailed, beautiful skin, professional lighting),
create a blank space above the head, beautifully painted, 1 girl, young,20 years old, short hair, bob cut, (beautiful dark brown hair:1.1), blonde eyes, light smile, white skin
ネガティブプロンプト
flat color, flat shading, nsfw, retro style, poor quality, bad face, bad fingers, bad anatomy, missing fingers
結果:1枚は破綻が少なく女の子が生成されていますが、残りは風景と同化していたり、二人がせいせいされたりと、破綻していることが分かります。
画像サイズも大きいので、生成に時間がかかって出来上がったのがこれでは悲しいですよね。
Hires.flx:ON
元々1024×1536を作成していたものをHires.flxを使用して、(512×768)×2=1024×1536として出力してみます。
プロンプトやSampling stepsは同じ設定です。
項目 | 設定値 |
元の画像サイズ | 512×768 |
Upscaler | Latent |
Hires steps | 0(Sampling steps:25) |
Denoising strength | 0.6 |
Upscale by | 2 |
結果:6枚とも破綻なく生成できています。
アップスケール前の画像(512×756)では破綻がないため、そのままアップスケールしたため大きいサイズでも破綻なく、かつ書き込みが増えて綺麗な画像が生成されました。
光の加減や目の書き込み量が、より良い感じになっています。
各パラメータを変更した場合
Upscaler
アップスケールを行うためのアルゴリズムの種類です。
アルゴリズムによってアップスケールの方法が変わるので、最終的な絵の細かい部分が変わります。
まずはLatentから初めて、自身の描きたい絵に合わせて変更してください。
Latentが生成に時間がかからず、LDSRは逆に生成に時間が多くかかります。
Latent
LDSR
R-ESRGAN 4x+ Anime6B
また下記のようなエラーで止まってしまった場合は、画像の生成が64の倍数でないことが原因ですが、512などの値にしていてもエラーが出てくる場合は、Upscalerを変更すると通る場合があります。
Hires steps
高解像度化する際のステップ数を設定します。
0に設定すると、Sampling Step数と同じ値が設定されます。
そのため0にしてSamplingStep数と同じ値にするか、その値±5ぐらいの値から始めていき、自身の絵に合う値を探してください。
初めの時にこのstepsを「5」と入力すると、元のStep数+5になると思っていて、よくわからない絵がたくさん出力されたことがあります。
実際はSampling steps=5と同じ意味になってしまうので、画像生成が上手くいきません。
0(元のStep数と同じ)
Steps=5
元のStep+10
元々のSampling stepsが高めで生成しているので、+10しても大きく変化はしませんでした。
Denoising strength
元画像からアップスケールするときのノイズ除去の強度の値を設定します。
当然アップスケール時にノイズを除去した方が良い画像になるので、値は大きい方が良いです。
しかし、Stable Diffusionがノイズ除去で絵を描いているため、大きくしすぎると元絵の特徴部分まで、ノイズと断定されて除去されてしまうことがあります。
試した感じでは0.5~0.7ぐらいの値から初めて、特徴が削られない程度の値にしてください。
0.1
0.6
1.0
Upscale by
アップスケールする倍率の値です。
基本的には2倍ぐらいまでの値を入れると良いと思います。
元の画像サイズにもよりますが、あまり値を大きくすると生成時間が多くなります。
VRAMの容量の影響が如実に出てしまうので、GPUのメモリ不足のエラーが出た場合は、アップスケールした時のサイズが小さくなるように、値を小さくしてください。
エラーの対処?
私が試している中でも下記の「RuntimeError: Sizes of tensors must match except in dimension 1. Expected size XXX but got size YYY for tensor number 1 in the list.」というエラーは何回か起きました。
内容的にはサイズが64の倍数になっていないとダメというエラー文ですが、実際に2の乗数にしても解消されません。
XXXやYYYの時の数字が変わるだけでした。
各パラメータ値を弄ってもエラーは解消されず、「使用しているモデル」か「Upscaler」を変更することでしか解消できませんでした。
そのため実際に64の倍数であるかではなく、学習モデルとの相性によるものと思われますが、現在解消されているか分かりません。
まとめ
今回は「Hires.fix」を使用して、破綻せずに大きいサイズで描く方法について紹介しました。
改めて3行でまとめると…
・サイズが大きい画像を生成しても、「Hires.flx」を使うと破綻が少ない
・正方形でないサイズの画像生成時でも、破綻が少ない
・モデルとUpscalerによってはエラーが起きるが、変更することで解消できる
高画質化しようとして画像のサイズを上げると絵が破綻して、うまく高画質化できないこともありますよね。
そんな時に「Hires.fix」を使うことで小さいサイズでの構図のまま、画像を大きくすることができました。
縦横比が違う場合に画像が破綻するときにも有効なので、ぜひ「Hires.flx」を使用して素晴らしい絵をたくさん描いてみてください!!
StableDiffusionにお勧めのグラボ
ここまでの記事を読んでStableDiffusionを始めてみたいと思ったけど、どれを買ったか良いか分からない人向けに私の使っているグラボを紹介します。
私が使用しているグラボはNVIDIA GeForce RTX3060 搭載 グラフィックボード GDDR6 12GBになります。
StableDiffusionで絵を生成するときは、PCのCPUやメモリよりもグラボの性能が重要です。
StableDiffusionではVRAMが12GB以上であることが推奨されていますが、普通のゲーム用のグラボでは8GBのものが多いです。
経験上、一回のプロンプトで一発で望みの絵が出ることは少なく、10枚ぐらい出力してそこから近づけていく作業をします。
しかしVRAMが低いと1枚を生成する時間が長くなってしまいます(完全にVRAM依存ではないですが)
1枚の生成する時間が長いと、最終的なゴールまでの時間も多くかかってしまうので、推奨要領である12GBのグラボを買うことをお勧めします。
VRAMが低い=一度に計算できる数が少ない=生成速度が遅い
そのため解像度の高い絵を生成するのに時間がかかるだけでなく、生成できない可能性もあります(2GBや4GBなど)
Controlnet等、拡張機能を複数使用する場合やLora等の学習を行う場合は、より顕著にVRAMの差が出ます。
そのため単純にAIで出力してみたい。というだけでなく、その一歩先で色々やってみたい方は是非12GB以上を購入してみてください。
ちょっと試すだけなら、下記のような無料AI画像生成サービスを使うのも良いです。
コメント