AI画像LoRAでのキャプションの付け方を考える!

AI画像生成をある程度できるようになるとやりたくなるのがLoRAです。画像生成AIにおけるLoRAは追加で新しい概念をAI画像生成で利用できるようするものです。例えば自分の顔をAI画像で再現できるようになったりするんですよ。追加で学習する手法はいろいろありますが、元との差分をファイルにするためサイズが小さくて済むLoRAが現在広く使われています。

私が作成しているLoRAについてはこちらのCivitaiのリンクからどうぞ。
https://civitai.com/user/koi_zoom1

衣装LoRA、画風調整LoRA、キャラクターLoRA等、公開している数は少ないですが、バリエーションは広く作成しています。自称LoRAの魔術師です。誰もそう言ってくれないので自分で言っています。

LoRAの入門記事はすでに世の中に山のようにあるので、この記事ではよりテクニック寄りのこと、さらには誤解されていることが多いものを考え直していきます。今回はフォーカスするのはキャプションの付け方です!

目指せ高品質LoRA !

まずは結論を

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

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

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

この結論の時点でネット上にあるLoRA解説と結構言っていることが違うかもしれません。さて、なぜようなこの結論になるのか?そこを見ていきましょう。

詳細は後述しますが、キャプションに気を付けないとこの画像のように、想定していたのとは違う画像が生成されることも起こりえるのです。

今回の記事ではフォト系モデルであるBRAV5を用いています。現在BRAV7まで出ていますが、BRAV5の画像の方が好みの顔に近いからです!また、Stable Diffusion1.5系列ですが、今回の記事の内容はStable Diffusion XLのモデルでも同じく成り立ちます。最近話題のPonyのLoRA学習についてはまた別途記事を書きます。以降の検証は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にはトリガーワードという対象物を呼び出す単語があり、今回はそれを乙姫(otohime)としていました。しかし、実際はトリガーワード以外もキャプションに書かれたすべての単語がその画像を学習します。

素材の赤いドレスの画像と背景と服装、格好は共通しているけど、年齢がだいぶ違う画像を追加してみましょう。年齢以外に箱を持っているという違いもあります。この画像もAIで生成しました。

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

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

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

セーラー服で箱を持っている画像を作ってみましょう!

何ということでしょうか!セーラー服を着た乙姫ちゃんが髪の毛も真っ白になり肌もだいぶ変わってしまいました。あまりの変化に、まるで手元の箱が浦島太郎の玉手箱を開けたかのように思えてきます。何故浦島太郎にそんなものを渡してるんだって感じですよね。

これが素材画像間の違いをキャプションに書くという理由なのです。若い方の赤いドレスのキャプションと年齢が上がった姿のキャプションの違いは「holding box」のみ。そのため、素材画像の白髪や肌とかが「holding box」に入ってしまったのです。箱が玉手箱になってしまっていたのでした。

今度は若い女性の赤いドレスの生成画像と全く同じプロンプトにして再度学習させてみます。

黒髪と白髪が混在して混ざってますよね。同じプロンプトにすると2つの画像は混ざってしまうのです。

白髪にはなってないけど、箱を持ってないのにちょっと老けた顔が出てきちゃう!

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

まとめるとこうです。

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

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

でも、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」が効くモデルはありますが、イラスト系モデルがマージされているモデルで効くようになっています。

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

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

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

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

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

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

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

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

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

例えば以下のような全画像紫髪で眼鏡をかけた女性の画像を学習させるとき、トリガーワード以外に眼鏡を意味する「glasses」も全キャプションファイルに入っているとどうなるか?

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

紫髪という特徴まで「glasses」に吸収されているのがわかると思います。

まとめ

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

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

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

乙姫ちゃんLoRA

次回は衣装LoRAの作り方について書きます!衣装LoRAは作るのが難しいんですがそれを簡単にできるようにします!

AI画像生成をある程度できるようになるとやりたくなるのがLo…