見出し画像

【SD1.5】最新のローカルAI技術を駆使して、一枚の画像からLoRAを作る話


はじめに

最近の写実系の画像生成AIの場合は、汎用的な手法・AIモデルが公開されているため、ある特定の特徴だけをモデルへ組み込むLoRAのような手法の利点は弱まっていると思います。

現実と同じ物理法則の写実的なものは、多彩な画風やデフォルメのあるアニメ調よりもコントロールが簡単だからだと思います。

しかし、(顔などの特徴を)簡単に、高品質に一貫性を保ちたい場合に、LoRAは依然として非常に有効な手法の一つです。

本記事では、一枚の画像から、FLUX.1 KontextやFramepackをローカルで利用して、一貫性を保ったデータセットを作り、Stable Diffusion 1.5用のLoRAを作るまでの一連の流れを紹介します。

※ 支援者様(メンバーシップ)向けに、附録欄において本記事で利用したオリジナル解像度の画像データセット・動画・各種スクリプトを添付しています。支援いただける場合は、ぜひよろしくお願いいたします。【注意:作成したLoRAモデルはありません】

利用するツール

画像生成は主にKrita-ai-diffusionで行います。FLUX.1 KontextもKrita上で利用します。

動画生成AIとしてFramepack-eichiを利用します。※ eichiを利用すると、動画生成時に、参照する画像を複数設定する事が可能になります。簡単に言うとモーフィングのような処理が可能になります。

(筆者のような用途では、実はタグ品質はあまり重要ではないのですが、最低限の品質を保って自動化できるので)データセットのタグ付けに、ollama + Gemma3(12B)を利用しています。そのタグ付け自動化スクリプト(Python言語)を付録欄に添付しています。 ※ Python以外にollamaとGemma3ダウンロードが必要です

ローカルでLLMを利用する時は、OpenWebUIを利用します。

LoRA作成はkohya-ss氏sd-scriptsを利用します。(環境構築も含めて)少し複雑なのでおすすめはしませんが、附録欄に筆者が利用しているLinux(bash)スクリプトを添付しています。他のLoRA作成実装を利用する場合のパラメータ参考になると思います。

何故Stable Diffusion 1.5なのか?

ローカルで画像生成AIのLoRAを作る場合、SD1.5以外でも実用的なものが作成可能になっていますが、Flux.1ではまだ難しく、SDXLでは非常に時間がかかります。つまり、ハード(処理時間)が大きな理由ですが、実はそれ以上のSD1.5の利点が存在します。

それは、学習元に忠実になるため「高品質」になる事です。※ そのまま出るので、AIというよりコラに近いと言えるでしょう

規模の小さなモデル本体+LoRAだけで、プロンプトコントロールしようとすると非常に困難ですが、そもそも筆者が利用しようとしている目的は、(インペントやimg2img利用での)「人物等の一貫性」です。

この場合、学習元を忠実に再現できる規模の小さなAIの方が圧倒的有利になります。

データセットの作成

学習すべき画像1枚を用意する

AI生成の人物画像ですが、この画像のLoRAを作ります。

ベース画像

この1枚のベース画像を元にして、データセットを作るためのバリエーション作りをします。

横向きの画像を1枚作る

FLUX.1 Kontextを利用します。 ※ Kontextプロンプトは下記事の手法で作れます。

画像を入力できるGemma3を利用すれば、より目的に沿ったプロンプトを生成してくれます。人間が指示するのは画像のコピペと「横向きの画像を生成する」の入力だけです。

Change the image to a side view while maintaining the original composition, lighting, and facial features.

Kontext用プロンプト
FLUX.1 Kontext(Krita-ai-diffusion)

ただし、若干FLUX顔になってしまうため、手動で品質とアイデンティティの復元をします。主に、Krita-ai-diffusionのインペイント(リファイン)機能を利用します。

※ もう少し横顔になってものを生成して、

手動で復元します

笑い顔の画像を1枚作る

同様の手法で、笑った顔を作ります。

Change her facial expression to a wide, genuine laugh, showing her teeth and crinkling her eyes. Maintain her original hairstyle, clothing, and background. Preserve her facial features and identity exactly the same.

Kontext用プロンプト
笑い顔

大きく表情を変えるとFLUX顔が色濃く出るので、これも手動で修復します。

手動でアイデンティティを復元します

Framepack-eichiでアイデンティティを保ったバリエーションを作る

Framepackはローカルでi2v(画像から動画生成)できるAIモデルですが、Framepack-eichiを利用すると始状態と終状態を指定した動画を作成できます。

つまり、AIがアイデンティティを保ったモーフィングのような複数の中間フレームを生成するので、これらをRoLA用データセットとして利用するという戦略です。

生成する時間も1秒(約30枚)で問題ありません。それでもローカルなので数分必要ですが。

始状態(ベース画像)、終状態(横向き画像)を設定します。プロンプトは「She is posing to the camera」としています。
横向く動画

同様に笑い顔動画も作ります。

1秒の動画を作る事で、(アイデンティティを高品質で保った)合計60枚の画像が用意出来た事になります。しかし、基本的にほとんど同じ画像なので、適当に間引きます。

間引いて24枚にしたもの

Ollama+Gemma3を利用して自動でタグをつける

本用途では、タグはよりシンプルで少ない方が良いのですが、LLMを利用する利点は自動化できる事と、タグが多彩化するので、似たような画像の学習をする場合は、過学習劣化を防ぐ効果もあります。

※ ただしあまり詳細なタグになると、汎用性は上がりますが、利用時にそれらを指定しなければならなくなります

簡単なOllama利用のスクリプトを(AIで作って)利用します。※ 付録欄に添付しています

generate-tags-01.py 
使用方法: python your_script_name.py <画像ファイルパス1> [<画像ファイルパス2> ...]
モデルはこのあたりで調整できます

仕様は、画像ファイルを引数に指定すれば、その画像ファイルの拡張子をtxtに変更して、下記プロンプトでタグファイルを生成します。

まずは、画像の状況を詳細に調査し、その後、画像を学習するためのStable Diffusion 1.5(CLIP ViT-L) LoRA学習用のタグを以下の注意点を良く考慮して、英語で作成してください。

## 注意点
- 出力結果を実際のLoRA学習のタグファイルとして利用するため、結果のみを改行を加えずにシンプルなテキストで出力してください。
- Stable Diffusion 1.5のプロンプトの上限は75 tokenが上限である事を考慮してください。
- masterpiceやbest quality等の品質プロンプトは含めないでください。

タグ生成用のプロンプト

AIが生成したコードは複数の画像を引数に持つので、一回で出来るかもしれませんが、筆者は動作確認していません。一枚ずつ処理する下記手法で利用しています。(Linuxシェル)

for file in *.png
do
  python generate-tags-01.py "$file"
done
Gemma3(Visionモデル)による自動タグ付け
生成されたタグ例:long hair, black hair, portrait, indoors, looking at viewer, young woman, detailed face, smooth skin, soft lighting, natural lighting, realistic, photorealistic, simple background, neutral expression, 19 years old, asian, japanese, japanese woman

sd-scriptでLoRAを作成する

画像とタグが対になった画像フォルダさえあれば、そのディレクトリを指定するだけでLoRAを作成するスクリプト「make-lora-bcwoman.sh」を利用します。※ 付録欄に添付しています

※ ただし、sd-scriptをLinuxやWSLで直接利用すると、解決しなければならない面倒な問題がいくつか発生するので、(Linuxに詳しい方でなければ)あまりおすすめはしません。パラメータ等の参考にしていただければと思います。

環境やデータセット用のパラメータを設定すると
データセットtomlファイルを作成し、
学習を行う

簡単なスクリプトです。

作成したLoRAの動作確認

単純な生成確認

タグに指定したものをプロンプトに利用すれば、当然ですが、ほとんどそのままで出てきます

インペイント利用確認

キャラクターの一貫性を高品質に保つための用途には、最も有効な手法です。

欧米系しか生成できないモデルで生成した後、(顔スワップモデルよりも)高品質にアイデンティティを保てます

まとめ

ローカルのFlux.1 Kontext、Framepack-eichi等を利用する事で、一枚の画像からアイデンティティを保った複数の画像を生成し、LoRAを作成する事ができます。

Kontextもその一つですが、ControlNet等を利用すれば、LoRAに近い処理は簡単にできます。しかし品質を考えた時は、丁寧なLoRA利用が最も良くなります。

付録

本記事で利用・作成したオリジナルサイズの画像・データセット・動画・スクリプトを支援者様(メンバーシップ)向けに添付しています。参考程度にご利用ください。

ここから先は

64字 / 3画像 / 3ファイル

メンバーシップ ¥ 1,000 /月

3Dモデルや写実的なAI画像の実戦テクニックやノウハウをアップしていきます。

ベーシックプラン

¥1,000 / 月
1ヶ月無料

この記事が気に入ったらチップで応援してみませんか?