画像生成AI

【StableDiffusion】Lora階層設定による特定特徴量の抽出【LoRA-Block-Weight】

この記事でわかること
  • 画風影響を最小に抑えてLoraを適用する方法
  • LoRA-Block-Weightの使い方
  • Loraの階層別影響の調査方法

こんにちは、「学びが人生を豊かにする」をテーマに本日は「loraを階層別に重みづけして適用する方法」についてです。

Loraファイルは特定の特徴量を追加学習したファイルを使用して思い通りの画像を生成する非常に強力な方法の一つです。
一方で追加学習したloraファイルの影響力が強すぎて、欲しい特徴以外の部分が色濃く画像に現れてしまい、思った画像にならないケースも多くあります。
特にloraを適用することでベースモデルの絵柄が大きく変わってしまうのは極力避けたいと思う人が大半だと思います。

そんなときに活用できるのがloraを階層別に重みづけして適用する手法です。
Loraファイルを階層ごとに強さを変えて適用することで、狙った特徴量のみを適用し画風影響を最小に抑えることが出来ます。

本記事では上記実現に必要な拡張機能等の使い方や手順等を詳細に解説します。
仕組み自体は非常に難しく理解するのが困難ですが、機能の使い方はそこまで複雑ではないため、是非インストールして試してみてください。

なお、本記事では以下の前提条件での内容になります。
環境やモデルによって異なる部分があるかと思いますのでご注意ください。

  • 環境: Windows11(ローカル)
  • Base Model: SD1.5
  • UI: StableDiffusionWebUI(v1.5)
  • GPU: GeForce RTX3060
  • model: 自作マージモデル(2D系)

Lora階層適用の基礎知識

まずはLoraについてLoraファイル使用者の観点で基礎知識を解説します。
技術的な部分や数学の話、特にLoraの階層毎の役割やネットワークなどは専門知識がある程度必要になるため対象外としています。

Loraファイルとは

Loraとは正しくはLoRA(Low-Rank Adaptation)というもので、簡単に言うと効率的な追加学習手法による追加学習モデルファイルの一つです。
通常の学習では大量のパラメータが必要となり生成されるベースモデルはサイズも非常に大きくなります。
このベースモデルに対して追加学習を行うには訓練時に全てのパラメタを保持しつつ学習を行う必要があるため膨大なメモリや時間などコストがかかってきます。

これに対してLoraは低ランク行列(少ないパラメタ)で学習を行うことができるため、モデルサイズやメモリなど学習コストが大幅に削減されます。
これにより、ベースモデルに対してLoraファイルを追加で読み込むことで、簡単に特定の特徴量を学習した画像生成が可能になるわけです。

特に人気の高いLoraファイルには「add_detail」というものがありますが、これは画像全体の細部書き込みを増やすことができる特徴量を持った追加学習モデルです。
実際にこのLoraファイルの使用有無を比較すると以下のようになります。(Seed値やプロンプトは共通です)

Loraファイルを適用するだけで、画像全体の書き込み量が大幅に増加しているのがわかります。
このようにLoraファイルを適用することで簡単に画像に特定の特徴量を追加することが可能です。
Loraファイルは上記のように画風を変えるものから、特定のキャラクターやポーズを再現するものなど様々なファイルが開発され共有されています。

Lora適用の問題点

プロンプトだけでは生成が困難な画像もLoraファイルを使用することで生成ができるようになるのがLoraの大きなメリットの一つです。
一方で、Loraファイルにもメリットだけでなくデメリットが発生するケースもあり得ます。
特に大きなデメリットの一つは取り入れたい特徴量以外の影響が強すぎるケースがあるというものです。

例えば前回の記事で手修正のLoraファイルについて紹介しましたが、手を修正したいだけなのに画像全体の画風まで変わってしまうということが発生しました。
下記の左が元画像で、右側が手修正用のLoraファイルを適用したものです。
手を修正したいだけなのに服装や髪など修正したくない部分にまでLoraファイルの影響が及んでいるのがわかります。

前回の記事でも少し言及しましたが、Lora適用によるこうした影響力を制御するにはLoraの階層重み付けが有効です。
StableDiffusionWebUIではLora階層制御するための拡張機能がリリースされており、階層毎の影響調査や重みを設定することが可能です。

LoRA-Block-Weightの活用

Loraの階層制御をするためには「LoRA-Block-Weight」という拡張機能が有効です。
LoraはU-Net層といわれる複数の階層からなるモデル(Loraの場合17層)であり、それぞれが画像に対して異なる影響を与えます。
各層が画像の背景や輪郭、装飾、人物の顔や体など様々な部分に影響を与えますが、層と画像の影響部分が1対1対応しているわけではありません。

そのため明確にどの層が画像のどの部分に影響を与えるのかは一概に定義することはできません。
さらにLoraファイルによっても階層と画像の影響する部分は異なっており、例えばLoraから顔に影響する部分だけを抽出するのは簡単にはできません。

それに対して「LoRA-Block-Weight」という拡張機能はLora階層別影響を調査したり、階層別に重みづけをすることを可能にする機能です。
「LoRA-Block-Weight」を使用して特定の重みだけをLora適用することで、必要な特徴量を抽出しつつ画風影響などを抑えることが可能となります。

下記は先ほどの手修正のLoraファイルを使用した比較画像ですが、右側の画像は「LoRA-Block-Weight」を使用した結果です。

単純にLoraファイルを使用するのと異なり、服装や髪など全体に対する影響を抑えつつ、必要なLoraの特徴量(手修正)が効いているのがわかります。
次章では、この「LoRA-Block-Weight」を使用してどのようにLora階層設定していけばよいのか解説したいと思います。

画風影響を最小に抑えてLoraを適用する方法

画風影響を最小に抑えてLoraを適用するには、大きく二つの手順が必要になります。

  1. Loraの階層別影響の調査
  2. Loraの階層別適用

分かりやすく言うとまずは必要な各層の重みを解析して、それをプロンプトに設定して適用するというものです。
Loraの階層影響の解析は突き詰めようとすると際限がなく非常に奥が深いものですが、ここでは基本となるシンプルな方法を解説します。

また拡張機能としては「LoRA-Block-Weight」が必要になるので事前にインストールしておきましょう。

インストールURL:
https://github.com/hako-mikan/sd-webui-lora-block-weight

拡張機能のインストールについては、下記の記事も参考にしてください。

今回は検証として以下のLoraを使用しながら解説したいと思います。

Loraファイル: Modern victorian fashion dress
DL from: https://civitai.com/models/65283/modern-victorian-fashion-dress-or-or-vol1
※2023/8/29時点でのバージョン

Loraの階層別影響の調査

まずはLoraの階層別影響の調査です。
手順としては以下の通り。

  1. 分析元となる画像を生成する
  2. LoraファイルからLoRA-Block-Weightで解析画像生成
  3. 元画像と比較しながら階層の取捨選択

分析元となる画像を生成

最初に分析元となる画像を生成します。
適用するLoraファイルに合わせてプロンプトを入力し画像を生成してください。
Loraを適用する際にはトリガーワードなどが必要となる場合もあるので、必要に応じて最初からトリガーワードも入れておいてください。
また、比較用にLoraなしの元画像だけでなく、Loraを単純適用したバージョンの画像も合わせて生成しておいてください。

今回は検証として「Modern victorian fashion dress」というLoraファイルを使用しますが、これは所謂ゴスロリ風の衣装Loraです。
そのためプロンプトには事前に「gothic lolita」などを入れています。
Loraを適用していない場合と単純適用した場合で下記の画像が生成されました。

上記はSeed値などは全て同じでプロンプトにLoraを指定しているのか、指定していないのかの違いのみになります。
単純なLora適用でも適用後の画像が好みであればそれで問題ありませんが、元画像の画風を維持して極力服装のみを変えたい場合は上記では不十分です。

LoRA-Block-Weightによる解析画像生成

比較画像を生成したら、次に「LoRA-Block-Weight」を使用して解析用の画像を生成します。
txt2imgの「Lora-Block-Weight」拡張機能設定欄を下記画像のように設定してください。

各パラメタは下記のような意味を持っています。

  • Effective Block Analyzer:
    この項目を指定することでLoraのどの階層が画像に影響を与えているのかを調査するモードになります。
  • change X-Y:
    生成された画像は各階層の画像が結合したGridとして出力されるのですが、デフォルトだと17枚が縦長になるため、見やすく横長にするために指定します。
  • Range:
    ここで指定した値を使用して解析画像が生成されます。
    数値は「Target,Source」の順番で指定してください。
    このときTargetには指定した値で各階層に重み付けして画像が生成されます。
    Sourceは比較用の全ての層に対する重みの値を指定します。
    デフォルトでは「0.5,1」となっていますが、これは全ての層に重み1で生成した画像と特定の層のみを重み0.5で生成したセット画像が生成されることになります。
  • Blocks:
    調査する階層を指定します。
    Loraの場合17階層であるため、17ALLを指定してください。

その他のパラメタに関しては基本的にはデフォルトで問題ありません。
Rangeに関しては「2,0」で設定するのがおススメです。
この場合、重み0(Lora適用無と同義)と特定の階層のみ重み2で生成した画像のセットが出力されます。

次にプロンプトのLora設定個所を以下のフォーマットで入力してください。

<lora:lo_dress_classic_style3_v1:1:1:lbw=XYZ>

指定するLoraファイルの後ろに「1:1:lbw=XYZ」という文字列を付けています。
lbwはLora block weightの略ですが、LoRA-Block-WeightをXYZ plotモードで使用するという意味になります。
このようにすることで、1枚の画像を生成する代わりにLoRA-Block-WeightのEffective Block AnalyzerモードのGrid画像が生成されます。

下記画像が出力結果ですが、上段の画像が重み0の画像(Lora適用無)で中段が特定の階層のみ重み2とした結果です。
階層の順番は決まっており、最上部に記載されていますが、「BASE,IN01,IN02,・・・」となっています。

ちなみに最下段の画像は上段と中段の差分画像でどのくらい二つの画像に違いがあるのかを表しています。
また、二つの画像の違いの量については最上段のパーセンテージを参考にすることもできます。
これは、設定欄の「difference threshold」で指定した値以上の差分が画像全体に占める割合がどれくらいあるかを算出しているものです。

階層の取捨選択

解析用の画像を生成したらどの階層が画像影響しているのかを実際に目視しながら確認していきます。
生成した画像の各階層について上段と中段を比較しながら、どの階層が必要としている特徴量に影響を与えているのかを確認してください。
今回の場合には、服装に関するLoraであるため背景や顔、構図に関する変化が大きい階層は除去(重み0)とし服装に変化があるもののみ抽出(重み1)をしていきます。

階層が17個もあるのでテキストにメモしたりするのは結構大変なのでおススメなのはエクセルやスプレッドシートなどで管理する方式です。
下記に簡単なエクセルのシートを添付していますが、各階層に対して重み0または1の値を記録していってください。
最終的に「lora-name:1,1,1,0,0,0,1,0,0,0,0,1,1,1,0,0,0」のような重みのプリセット文字列を生成することが出来ます。
この文字列はLoraを階層別に重み付けする際にそのまま使用することが可能です。(lora-nameは任意の文字列で問題ありません)

Loraの階層別適用

最後に記録した重みでLoraを適用したいと思います。
再度StableDiffusionWebUIの「LoRA-Block-Weight」の設定欄に戻り、下記画像のようにWeights Settingにプリセット文字列を張り付けてください。
その後「Save Presets」ボタンを押し入力内容を保存します。

次にプロンプトのLora設定個所を以下のようなフォーマットで入力してください。

<lora:lo_dress_classic_style3_v1:0.8:lbw=lo_dress_classic_style3>

「lora:lo_dress_classic_style3_v1:0.8」までは通常のLoraファイル適用と同じで、その後ろに「lbw=lo_dress_classic_style3」という文字列を付けています。
こうすることによってlbw(lora block weight)にプリセットlo_dress_classic_style3の重みを適用するという構文になります。
ちなみにプリセット文字列は入力を簡単にしやすくするためのものであり、直接重みを「lbw=1,0,1,1,0,0,・・・」のように入力してOKです。

今回の検証で抽出した結果は下記になります。

単純にLoraを適用した場合と異なり、背景や人物などの変化が抑えられているのが分かります。
ただし、Loraの階層と画像特徴量は単純な対応をしていないため、完全に元画像の構図や顔を維持することはできていません。
そのため、ある程度の試行錯誤やどのあたりで妥協するのかなどといった判断が必要になるので注意してください。

まとめ

本記事ではLoRA-Block-Weightを使用した重み付けLora適用方法について解説しました。
Loraファイルは特定の特徴量をもった画像を生成するのに強力な追加学習モデルです。
一方で、必要な特量以外の部分にも影響を与える場合があります。
これに対してLora-Block-Weightという拡張機能を使用することで、Loraの階層毎の画像影響を解析することが可能です。
解析した結果を使用することで任意の特徴量を抽出し、不要な画像影響を極力排除してLoraを適用することができます。

本記事ではLoraの基本的な知識を解説するとともに、実際にLoraファイルを解析しながらどのように階層毎の重み付け適用をすることが出来るのか詳細に解説しました。
Loraの階層制御はLoraを適用するケースだけでなく、階層マージなどLoraをより発展させて使用するのに重要な要素のため、是非インストールして使用してみてください。

ABOUT ME
ミスタ
ミスタと申します! このブログは主に日々学んでいる知識についてアウトプットしていくことを目的としたブログです。 その他、趣味や戯言なども時々書いたりもします。 最近は専らAI関連が興味の対象です。 このブログが少しでも誰かの役に立てればと思っています!