ストーリーテリングのための画像生成AIを使ったキャラクタービジュアル統一手法の検討と実践
はじめに~この記事の概説
自分の描いた小説のキャラクターに絵をつけたいとは思ったことがある人は多いと思います。少なくとも私はあります。
そのような願望やのぞみとはまた別に、現在は文字情報のみとしての伝達は難しく、物語を提供するにしても、文字情報だけではどのようなキャラクターが出るものなのかわからない状態になり、結果として物語を読んでもらえない、そのようなことも多々発生していると思われます。
このことから、小説という文字情報に対して、画像情報を付与することによって、人の目を引ける可能性が高まると考えました。
このような課題について、画像生成AIの適用が有効であるのですが、画像生成AIでの作成はキャラクターの一貫性が出にくいことが知られています。
この問題は、物語の紹介のときにも目につくことになり、キャラクターを一枚絵で表現するしかありません。
この記事では上記の問題を解決するために、一枚の絵だけで、LoRAの学習を行い、顔や体系の構造をなるたけ保持した出力をするのに参考になった記事や、実践してみたりしたことをまとめます。
大きく手順は3つあります。
Phase1:ベースとなるキャラクターの全身像を作成する
Phase2:LoRAを作成する
Phase3:LoRAを使って出力する
なお、本記事の対象読者は、ある程度プログラムを理解でき、
自走して画像生成ができる方を想定しております。
また、環境としては Google colab の Pro+のプランを利用しています。
そもそものきっかけ
そもそも一枚の絵でLoRAが作れるのかというのは疑問でしたが、akiraU様の記事を読みその可能性に言及しておられていたことから挑戦することに決めました。
Phase1:ベースとなるキャラクターの全身像を作成する
全身を描くために必要なもの
画像生成AI用のアプリケーションやその周辺ライブラリ群を集めます。
主に使ったツール郡は以下になります。
ComfyUI
model>animagine-xl-3.0
Controlnet, Preprocessor
Impact-Pack>FaceDetailer
ComfyUI
画像生成AIを使いやすくするツールの代表格かと思います。
特に、Phase3の話になりますが、連続して画像の生成と加工を繰り返すといったときに重宝します。
model>animagine-xl-3.0
SDXL モデルで任意だと思いますが、akiraU様の紹介とアニメ調の画像で作りたかったので、animagine-xl-3.0 を使いました。
Controlnet, Preprocessor
BAKU様の記事が参考になりました。
上記記事は、AnimateDiff とアニメーションの生成を主題にしていますが、ComfyUIでControlNetやPreprocessor を使う上での、ほしい情報がまとまっておりました。
Impact-Pack>FaceDetailer
全身画像を作成すると、顔の崩れが発生しやすいです。特に目元が、崩れやすいことがわかっています。
このことから、ComfyUIで、Impact-Pack の FaceDetailer を使うことで、生成した全身画像の顔部分を検知し、修正を施すことができ、試行の成功率を格段にあげることができました。
上記ツール郡を利用して、キャラクターの全身画像を生成し、最後に透過処理を実施します。今回はCanva の機能を使いました。背景除去ができます。
https://www.canva.com/ja_jp/learn/background-transparent/
Windows の標準のものでもいいかもしれませんが、Canvaのほうが性能がいい感じがしています。
上記のようなツールを使い生成した画像を、透過処理をおこなったキャラクターの全身画像を、Phase2のために
バストアップショットの画像、顔をクローズアップした画像と用意します。
これで、Phase1の作業は終了です。
Phase2:LoRAを作成する
LoRAを作るにあたって準備したもの
kohya-ss で提供されているものを使用しました。
google colab でも使えるよう、
kohya-ss における設定について
学習のベースとしたい model を選択していきます。
animagine-xl-3.0 の model は標準のリストボックスにはありませんので、custom にして選択します。
kohya-ss では、パラメータを設定する必要があります。ここで preset によっていくつかの設定を飛ばせるのですが、今回は sdxl-24GB-lokr_v1 を使うことにします。
この選択の理由は実はあまりなく、いいのが出たのでこれにした程度のものです。
パラメータは、 以下だけ調整しています。
エポック数:100(これぐらい回すといい感じになる気がしたので)
バッチ数:16(時間の短縮のため)
用意する画像とフォルダの指定方法(難所)
用意しなければいけないものは、画像と画像ファイルと同一の名前を持ち、その画像を説明するテキストファイルになります。
私の場合は、全身画像及び、その全身画像の縮尺をいじることで、バストアップショットと、顔のクローズアップ画像の3枚を用意しました。
テキストについては使用したプロンプトを全身の画像に貼り付け、バストアップショット、顔のクローズアップ画像については全身を意味するプロンプトの箇所をいじるだけにとどめました。
ディレクトリの構成設定や内容物については結構しっかりしなければならないらしく、以下のようなフォルダ構成が必要です。
【kohya-ss で指定するフォルダ】
|-【[数値]_[名詞]
|-画像ファイルA
|-画像ファイルAと同じ名前を持つテキストファイル
最後に train ボタンを押して、所定の時間を待ちます。(約 3時間)
そして、できた .safetensors を保存すればPhase2の作業は完了です。
Phase3:LoRAを使って出力する
手順としては、
最初にもととなる画像を出力
→その絵に対してLoRAを適応し、人物の入れ替えを行う
→UpscaleでLoRA適応時のブレを修正
→顔をさらにLoRAで矯正
というふうに行います。
元となる画像を出力[SDXL only]
まずは所望の一人だけが写っている人物画像を生成します。この人物の服装や格好が、今後LoRAで作成したキャラクターの服装・格好になります。
画像に対して、人物特定箇所のみLoRAをかける[SDXL+LoRA]
Phase1で使用した Impact-Pack には、FaceDetailer 以外にも、人物を検出して、人物のセグメント領域のみを再調整することができる機能が盛り込まれています。
こうして抽出された領域に対して、LoRAのモデルを適応します。LoRAのパラメータは以下にしています。
理由は特にありませんが、何回か試してこれぐらいがちょうどいい感じ、だったからです。
strength_model:0.5
strength_clip:1.5
こうすることで、人物の入れ替えができる、、、ようにみえるのですが難点があり、全体にくすみがでてしまいます。
これを修正するために次のステップがあります
UpscaleでLoRA適応時のブレを修正[SDXL only]
またもや Impact-Pack の話しになりますが、Impact-Pack には特定のSegの Upscale、つまり高解像度化機能が備わっています。先ほど取った人物のセグメント領域を使い、今度は Upscale をかけます。
そして最後に、
Facedetailerによる顔へのLoRA適応[SDXL+LoRA]
Phase1で使った FaceDetailer を使い、上の絵の顔部分だけLoRAを使いながら修正します。
パラメータは以下に再調整し、表情への適応可能性をあげます。(パラメータの根拠は特にありません……)
strength_model:0.2
strength_clip:1.8
すると
これで全工程終了です。
もしかしたら、顔だけLoRAを適応するだけでもいいかもしれませんが、スタイルのようなキャラクターのニュアンスも適応されることに期待して、このような形をとっています。
実際の成果物
キャラクターA
制作A.1
制作A.2
キャラクターB
制作B.1
制作B.2
所感
LoRAに適応するための基絵は一枚ということもあり、画像生成で出した気になったキャラクターを、そのまま使えるというのが手軽でいいなと思いました。
もちろん髪型が合わなかったり、ポーズが不自然であるためうまくいかない絵も出てきて、いわゆるガチャの要素は高いですが、それでも試行の回数はかなり減るのではと思います。
また表情の適応能力も自分の想像以上に高く、生成AIを使ったキャラクターを通した物語制作の新しい可能性を感じました。
以上。
この記事が気に入ったらサポートをしてみませんか?