メインコンテンツまでスキップ

試験にでないLoRA作成講座(2) LoRAのキャプションで遊んでみよう!

· 約24分
小泉勝志郎 - Koizumi Katsushiro
株式会社テセラクト代表取締役 - シニアプログラミングネットワーク代表

AICU media読者の皆様、自称LoRAの魔術師の小泉勝志郎です。LoRAの魔術師と自分では思っているけど、誰もそう言ってくれないので自分で言うようにしています。

前回は漫画家うめ先生の画風LoRAを作成してみるという、第1回にしては基本的ではなく応用的な内容でした。今回は前回よりももっと基本の部分です。LoRAのキャプションを工夫して遊んでみようという内容です。結構面白い使い方ができるんですよ!

そして、今回の内容はこの連載のベースとなる内容です。前回そして以降での連載の内容を利用したテクニックになっています。以前別のメディアで書いたものをよりブラッシュアップしたものです。

まずは結論を

結論を最初に書いておきます。

  • キャプション=生成プロンプト
  • 素材画像間の違いを書く

LoRAを作成するときにはその画像を説明するキャプションというファイルを作成します。前回の記事ではWD Taggerという画像の説明を作成してくれるツールの紹介も行いました。

キャプションは画像の説明ではあるのですが、より正確に書くとその画像をどういうプロンプトで生成したいのかを書きます。そして、あまり触れられないのですが画像間のキャプションの違いも重要なんですよ!

この結論の時点でネット上にあるLoRA解説と結構言っていることが違うかもしれません。さて、なぜこのような結論になるのか?そこを見ていきましょう。
詳細は後述しますが、キャプションに気を付けないとこの画像のように、想定していたのとは違う画像が生成されることも起こりえるのです。

このセーラー服姿のおばあさんは一体?キャプションを工夫することでトリック的な使い方もできるんですよ!

今回の記事ではフォト系モデルであるBRAV5を用いています。現在BRAV7まで出ていますが、BRAV5の画像の方が好みの顔に近いからです!

また、現在はPony系やillustrious系等のSDXL系にStable Diffusionの主流が移ってきていますが、今回はStable Diffusion1.5系列であるBRAV5であえてやります。今回の記事のトリック(?)はSD1.5系の方がきれいに結果が出るんですよ。ただ、今回の記事の内容はStable Diffusion1.5系列ほどではないにせよ、SDXLのモデルでも同じく成り立ちます。

以降の検証は kohya_ss gui を用いたものです。設定はキャプションだけ .txt へ変更して、それ以外は kohya_ss gui のデフォルト値のままで使用しています。

キャプション=生成プロンプト

LoRAで画像を学習させる際に重要になるのが、その画像がどういうものなのかを説明しているのがキャプションファイルです。各画像に対応するように同じファイル名で拡張子を.txtにしたテキストファイルを作るというのがよく用いられる方法です。

その画像がどういうものなのかを説明しているのであれば、当然生成するプロンプトを書くべきとなるのは当然ですよね。

まずは実際にやってみます。黒髪ロングで笑顔がすてきな乙姫ちゃんというキャラを作ってみます。以下が学習に利用した画像です。この画像自体もAIで生成したものです。


顔の雰囲気が似ているものを選びました。すべて黒髪ロングです。

各画像にキャプションを付けていきます。乙姫ちゃんを呼び出す単語(トリガーワード)は「otohime」とします。キャプションはすべてトリガーワードの「otohime」が先頭です。細かい説明は後でするとしてまずは一つずつ見ていきましょう。

1枚目のTシャツ&デニムの画像のキャプション。
otohime, white t-shirt, denim pants, navel, standing, arm support, table, window, indoors, sunlight, leaning back

2枚目のセーラー服のキャプション。
otohime, school sailor uniform, blue neckerchief, blue sailor collar, blue pleated skirt, day, from side, from above, looking at viewer, road, short sleeves, tree, white shirt

3枚目の黒い着物姿のキャプション。
otohime, black kimono, blurry background, day, looking at viewer, from side, outdoors, upper body

4枚目の赤いドレス姿のキャプション。
otohime, closed eyes, open mouth, red dress, grey belt, black background, upper body

基本的にどんな場所でどんな格好をしてどんな表情なのかを、この画像を生成するにはどういうプロンプトを入力すれば良いのかを考えて記述しています。
さて、これでLoRAを作成してみます。今回はotohime_bra_v1という名前にしてみました。

キャプションのプロンプトで元画像を再現

1枚目のキャプションに書いたのと同じプロンプトにLoRAを呼び出す<lora:otohime_bra_v1:1>を追加して実行してみます。

あれ?元画像とほぼ一緒では?比較してみましょう。

そうなのです。多少違いはありますが、ほぼ一緒と言って良いくらいです!

単に再現するだけではなく衣装の変更もできます。


この衣装を変更したプロンプトはこちら。

<lora:otohime_bra_v1:1> otohime, plaid apron dress, standing, arm support, table, window, indoors, sunlight, leaning back, masterpiece, best quality

t-shirt, denim」を「plaid apron dress」に変更しました。元の構図やポーズの影響が大きくはありますが、その点についてはまた別途記事を書きます。

このキャプションをプロンプトにして再現できるというのを私は重視しています。
実はLoRAの精度を落としてしまう画像もあるのです。それを見つけるのに役立つのですね。次はそこを詳しく見ていきましょう。

素材画像間のキャプションの違いを使ってLoRAに裏技を仕込む

LoRAにはトリガーワードという対象物を呼び出す単語があり、今回はそれを乙姫(otohime)としていました。しかし、実際はトリガーワード以外もキャプションに書かれたすべての単語がその画像を学習します

素材の赤いドレスの画像と背景と服装、格好は共通しているけど、年齢が3倍くらいになった画像を追加してみましょう。そして、年齢以外に箱を持っているという違いもあります。この違いをのあとで利用します。

ところで、この画像もAIで生成しました。そして、実は先ほどの素材に入れた赤いドレスの画像はこの画像をinpaint sketchで加工して箱を削除&若い姿に変更したものなのですよ。年齢と箱と煙以外はまったく同じにしているんです。


この画像のキャプションを次のようにします。

otohime, holding box, closed eyes, open mouth, red dress, grey belt, black background, upper body

年齢の違いは一切キャプションに書かず、箱を持っている(holding box)という点のみを赤いドレスの画像のキャプションに追加しました。若い方の赤いドレスの画像&キャプションも残しておきます。

この状態でLoRAを作成します。では、新たに作成したLoRAでセーラー服で箱を持っている画像を作ってみましょう!すると……。


ギャーーーーーーーーーー!

何ということでしょうか!セーラー服を着た乙姫ちゃんが、髪の毛も真っ白になり肌の水気も飛んじゃいました!まあ、これがやりたいから乙姫ちゃんという名前にしていたんですけどね。玉手箱みたいな老化ウェポンを何故浦島太郎にそんなものを渡してるんだって!浦島太郎の気持ちを思い知ってほしいものです。

それはさておき、これが素材画像間の違いをキャプションに書くという理由なのです。若い方の赤いドレスのキャプションと年齢が上がった姿のキャプションの違いは「holding box」のみ。そのため、素材画像の白髪や肌とかが「holding box」に入ってしまったのです。箱が玉手箱になってしまっていたのでした。ただ、煙までは再現されていないので、完全吸収とまでは行かないんですけどね。

まあ、これを利用すると特定の行動をさせるとおじさんになるLoRAも作れます。LoRAに裏技を仕込めちゃうのです。

画像が違ってキャプションが同じだと特徴が混ざる

今度は若い女性の赤いドレスの生成画像と全く同じプロンプトにして再度学習させてみます。若い姿と老けた姿を全く同じキャプションにしたLoRAで作成し、そのキャプションで再現した赤いドレスの乙姫ちゃんはこんな感じになります。

黒髪と白髪が混在していますね。顔立ちも若いとはいいがたいものに。違う画像でキャプションを同じプロンプトにすると2つの画像は混ざってしまうのです。

赤いドレスのプロンプト以外でも試してみましょう。「otohime, street」で作成してみます。

白髪にはなってないけど、箱を持ってないのにちょっと地球の重力に影響を受けてしまったやや老け顔が出てきちゃう!赤いドレスの画像以外にも影響が出てしまっています。

先ほどの例は「holding box」以外はほぼ同じ画像&キャプションがあることで「holding box」に白髪頭の情報が集中して学習されていました。しかし、「holding box」を削除することで、otohimeにも画像素材の人生経験を重ねた雰囲気が学習されてしまっているからです。

そして、老けた乙姫ちゃんと若い乙姫ちゃんと両方出せるようにするには、老けた乙姫ちゃんのキャプションでは若い画像では「girl」のところを「old woman」にすると良いです。もともと「old woman」で高齢女性が学習されているため、画像間の老けているという違いも「old woman」が吸収してくれます。

まとめるとこうです。

  • 画像間の共通点はキャプション中の共通するタグに学習される
  • 画像間の差異はキャプションが異なるところタグに学習される
  • 画像に差異があるのにキャプションが同じところは混ざる形で学習される

前回のうめ先生の画風LoRAでキャプションを付ける際に注意することとして書いたものですね。


共通するところが学習されるというのは意識している人も多いと思いますが、画像間の差異がキャプション中の違っているタグに学習されるというのは意識している人は少ないのではないかと。

でも、AI画像生成で水着にしたら画像の背景が海になっちゃったという経験のある人も多いと思います。それと同じようなものです。ここを気を付けないと、髪型を変えると太ったりが発生したりするわけです。

具体的なタグ付けについて

そもそも先ほど記述したキャプションをどのように作っているのかについて、ここからは説明していきます。基本的にはTaggerというツールを用いています。
https://huggingface.co/spaces/SmilingWolf/wd-tagger

リンクを飛ぶとこのような画面になります。


ここで画像をドラッグするとタグを解析してくれます。

「General Tags Threshold」は画像から解析されたタグを出す際の閾値(しきいち)です。0~1の間で設定します。

こう書くと難しそうですが、1に近いと確実に当てはまるようなタグだけになり、0に近いと男のキャラにも1girlと出てしまうような当てはまっているかどうかわからないものも出てくるようになります。私はとりあえずタグ候補をたくさん見たいので0.1~0.15にしています。

「Character Tags Threshold」は既存キャラクターのタグを出力する閾値(しきいち)です。既存キャラは出てこなくてよいので1にします。

ここでSUBMITボタンを押すとこのようにタグが出てきます。

Taggerを信用しすぎない

さて、このTaggerによる解析結果ですが、あまり信用しすぎてはダメです。

というのも、これはイラスト用作画モデルでのタグが出てきているんですよ。フォト系では使えないものが混ざっているということです。

例えば、「cowboy shot」。馬に乗ったカウボーイのイメージで頭から腿までの構図にするタグですが、基本的にはイラスト系モデルでしか使えないのです。BRAV5で試してみましょう。

カウボーイの格好をしたお姉さんになってしまい、頭から腿までという構図になっていません!BRAV5では「cowboy shot」は効かないんですよ。フォト系でも「cowboy shot」が効くモデルはありますが、イラスト系モデルがマージされているモデルで効くようになっています。実はこれは「booru tag」と呼ばれるDanbooruというサイトで使われるタグなのですよ。SDXLではPony系フォトモデルのように「cowboy shot」等の「booru tag」が効くフォト系モデルもあります。

ちなみに「cowboy shot」的に頭から腿までの画像を出力したい場合は「face, thigh」と表示する部位を入れると良いです。

ちなみにBRAV5の場合、512×768で生成すると、特に指定しなくても「cowboy shot」的構図になることが多いので、先に出した1枚目は「cowboy shot」的構図ですが特に指定を書いていません。

さて、「どれがフォト系で効いてどれが効かないのかわからんよ!」という方も多いと思います。これは簡単で出力されたキャプションをプロンプトにして生成してみれば良いんですよ。前回のうめ先生の画風LoRAのときにもやりましたね。

そして、重要なのがこれ。LoRAのベースとなるモデルで効果がある単語を書くとある程度その特徴となるところを吸収してくれます。しかし、そのモデルで効果がないタグをに書いた場合は新規の単語として学習されるのと同じなのです。

「それの何が悪いの?」と思うかもしれませんが、トリガーワードと特徴が分散しちゃうのです。トリガーワードの効果が弱まるんですね。なので、ベースモデルで効果のないタグは書かないようにしましょう。

全画像に共通するタグはトリガーワードのみにする

キャラクターLoRAを作る解説記事では「キャラクターの特徴はキャプションに入れないようにする」ということがよく書かれています。これは画像の共通部分がキャプションの共通部分に学習されるため、キャラクターの特徴が他のタグに吸収されてしまうからなのです。

先ほどタグの共通箇所に画像の共通箇所が学習されると書きましたが、この共通というのは当然2枚の間だけではなく、学習画像全体に対してのもの。

結構やりがちなのが、トリガーワード以外に全キャプションファイルに同じタグを書いてしまうというもの。Taggerを付けるとやりがちです。全画像に「smile」と入っているのに気づかないとか。

例えば以下のような全画像が紫髪で眼鏡をかけた女性の画像を学習させるとします。

今回トリガーワードは「abare」にしました、トリガーワード以外に眼鏡を意味する「glasses」も全キャプションファイルに入っているとどうなるか?全画像のキャプションを「abare, glasses」にしてみます。

この画像を学習させたLoRAを用いて、トリガーワードなしの「glasses」だけで生成してみると……。

なんと髪の毛が紫色になってしまいました!紫髪という特徴まで「glasses」に吸収されているのがわかると思います。

まとめ

今回の内容をまとめると以下の通りです

  • キャプションファイルにはその画像をどういうプロンプトで出すのかを書く
  • 画像の共通箇所はキャプションの共通タグに学習される
  • 画像間の違いはキャプションの違いの箇所に学習される
  • 画像間に違いがあってキャプションが同じだと特徴が混ざって学習される
  • ベースとなるモデルで利用できないタグは書いても学習精度が落ちるだけ
  • 全キャプションファイルに共通して書くのはトリガーワードだけにする

そして今回作成した乙姫ちゃんのLoRAも公開しました。箱を持つと老けるのを楽しんでください!白髪にするには「black hair」をネガティブに書くと良いです。
乙姫ちゃんLoRA

次回はLoRAの中でも特に人気のキャラクターLoRAを精度高く作る方法を紹介します。