2023年11月10日金曜日

画像生成AIで自分のアイコンを作りたい 風船あたまを作る

僕がTwitterとかのアイコンにしている写真みたいなキャラクターをLoraで作成するための過程を記載します。

これはTwitterのアイコン(実写)



stable diffusionで人物を生成するにはLoraでの学習がメジャーな方法です。

とりあえず、Lora学習が可能なことを前提とします。


GPUは「NVIDIA GeForce RTX4060Ti の 16GB」を使用しています。

SD1.5であれば、NVIDIA GeForce RTX4060Ti 8GB でも十分でした。

SDXLでは処理速度が断然違うので16GBがオススメです


今回は大量に画像生成が必要なのでSD1.5でLora学習しています。

良いものができれば、そのデータからSDXLも作るかもね


1.目標

作りたいLoraはこんなイメージ

  • トリガーは「tanakapirori」
  • 顔が風船の人物
  • 服装やポーズは自由に変えたい
  • できれば風船をカボチャとかにも置き換えたい

どこまで出来るかわかんないけど、人間の顔じゃないものをウマイコト認識してもらうのがポイントになるみたいです。


2.教師画像の作成

まず、stable diffusionで学習用の画像を生成します。

①プロンプトから作成する

プロンプトに「人物、風船、顔の前に風船・・・」などを入力します

それだけだと、風船の横からオッサンがヒョッコリ顔を出しがちなので、

ネガティブプロンプトに「顔、頭、髪、目、口」あたりを入力しておきます。


ついでに、風船は「balloon」ですが、英語では気球は「hot air balloon」ともいうそうなので、ネガティブプロンプトに入れておく気球の生成がされなくなりました。


②Inpaintで生成する

プロンプトからイチから生成しようとすると、頭が映り込んでしまって、ヒット率が低いんですよね。。。

なので適当な人間を生成して、Inpaintで頭だけ「Balloon」に変更します。

生成時には顔を残したくないので、Denoising strength を1に近い値に辺越します。


元の画像の顔だけを風船に書き換えました


3.Lora学習

それなりの枚数ができたのでLora学習しました。

タグを作成すると、確実に「balloon」は出てきますが、これはLoraに含めたい・・・

でも、最終的には「tanakapirori + balloon」で顔を風船にして「tanakapirori + pumpkin」でカボチャ頭に書き換えたいので、タグには残したままにしています。

でも、学習を繰り返すつもりなので、消した方が良かったかも。。。


4.作成したLoraから画像生成

作成したLoraを作ってさらに画像を増やします。

Loraを使うので「tanakapirori + balloon」でそれなりに正しい画像が作られるはず!

・・・なのですが、あまり精度があがってない(泣

前半の学習で「スーツ」画像を使っていたから、スーツ以外での生成があまりできません

こんな感じで、スーツは結構良い感じに出力されています


そのあと色々試してみたら「tanakapirori AND human」にするとイイカンジに認識されることがわかりました

このプロンプトでさらに画像を増やします

「これ風船?」って感じもするけど、イメージ的には間違ってないと思う。


5.再度、Lora学習→画像生成

画像が増えたので、再度Lora学習します。

学習の際はすべてのタグに「tanakapirori」と「balloon」を指定しています。

画像の中には「これ風船?」ってものもあるけど、あまり気にしていません・

この時点で除外(Exclude tag)したのは以下

  • holding ・・・ 風船をつかんでいるわけではない
  • holding balloon  ・・・ 風船をつかんでいるわけではない
  • from behind ・・・ 風船の後ろに顔があるわけではない
  • no humans ・・・ こいつは人間なんです
  • 1other ・・・ 1boyと認識してほしい
  • hood ・・・ たぶん風船をフードと認識したのかな




最初に比べると、服装の制約が少なくなってきた気がします。

Lora学習を繰り返すことで、教師画像が増えていくので、精度が上がる

→ バリエーションを増やせる


って感じで学習を繰り返します。

ちなみに、背景が白くなるように「white background, simple background」を追加しています。

これは学習用に、不要な情報を入れたくないからです。

そんなに出来上がりに違いは無いですが、プロンプトが少しシンプルなものでも大丈夫になりました。


融通が利くようになったので、多少他の情報を付加しても画像生成できます♪


今後の課題

顔に風船が表示されるLoraについては、ある程度作成できてきている気がします。
ただし、Hires.fixで高画質化すると風船の隙間から顔が出てくることが多かったです。

ただ、僕はカメラマンなので、カメラを持たせたいのですよ。現時点で、カメラをプロンプトに追加してもイマイチ・・・

また、風船を他の言葉にすることで、顔を挿げ替えたいと思っていますが、現時点ではこれも機能しません

試しに風船の代わりにバケツを指定した場合

誰やねんwな画像になります。
あたまにバケツが合成されているのは良いんだけど、なぜか顔は残ってしまうようです。