本文へ移動
ハック!でAI
連載・極める生成AIの品質を突き詰める#3/ 全3回

画像生成で同じ顔・同じキャラを保つ 参照画像・LoRA・IP-Adapter を比べた

佐々木 航@w_sasakiwith Claude Code読了 約34分
左に題。右に 4 枚の顔。基準の画像の灰色のショートの女性、参照の画像を渡した GPT の、雨の街で赤い傘を持つ灰色の髪の女性、IP-Adapter の灰緑の背景の正面の顔、LoRA のカフェで白いカップを持つ顔

この記事でわかること

  • 参照の画像・LoRA・IP-Adapter で、顔の近さと場面を守れた数
  • IP-Adapter の重みと、LoRA の学習の画像で起きたこと
  • 1 キャラ 100 枚の費用と、ComfyUI のノードの設定

確認した環境: YOBITSUGI AI で各モデルを実行・SDXL base 1.0 と ComfyUI 0.39.0 は RTX 5060 Ti 8GB で実行 / 2026年10月15日に確認

画像生成で同じ顔・同じキャラを保つ方法を、架空の人物とロボットの 8 場面で比べました。今回いちばん安定したのは、基準の画像を 1 枚渡す API の方法です。GPT-Image-2.5 Sunburst は 1 枚 3.9 クレジットで、8 枚とも顔の近さが同じ人の目安を超え、服と持ち物と場面の指示も 8 枚とも守りました。編集部の PC の SDXL では、IP-Adapter は顔を保つかわりに場面をまったく変えられず、LoRA は顔を保って人物の場面を半分守りましたが、学習の画像の向きと服に引っぱられました。

左に題。右に 4 枚の顔。基準の画像の灰色のショートの女性、参照の画像を渡した GPT の、雨の街で赤い傘を持つ灰色の髪の女性、IP-Adapter の灰緑の背景の正面の顔、LoRA のカフェで白いカップを持つ顔
この回の扉作図: 編集部

結果の早見

表。T1 文だけ(SDXL base 1.0)は顔 0.32・7 枚中 3 枚が目安以上、髪・服・持ち物 1 / 8、人物の場面 3 / 8、ロボの目印 0 / 8、ロボの場面 3 / 8、電気代のみ。A1 文だけ(GPT-Image-2.5 Sunburst)は顔 0.27・0 / 8 枚、8 / 8、8 / 8、8 / 8、8 / 8、2.4 クレジット。A2 参照の画像(GPT-Image-2.5 Sunburst)は 0.79・8 / 8 枚、8 / 8、8 / 8、8 / 8、7 / 8、3.9 クレジット。A3 参照の画像(Kling Image 3.0)は 0.84・8 / 8 枚、8 / 8、5 / 8、8 / 8、5 / 8、4.9 クレジット。A4 参照の画像(Nano Banana Pro)は 0.53・8 / 8 枚、8 / 8、8 / 8、ロボットは作っていない、24.3 クレジット。T3 LoRA は 0.56・8 / 8 枚、3 / 8、4 / 8、7 / 8、3 / 8。T4 IP-Adapter(重み 0.7)は 0.67・8 / 8 枚、0 / 8、0 / 8、0 / 8、0 / 8。T5 LoRA + IP-Adapter は 0.54・8 / 8 枚、3 / 8、0 / 8、8 / 8、0 / 8。下に、参照の画像を渡した A2 と A4 は顔・見た目・場面を 8 枚とも守った、A3 も顔は 8 枚とも目安を超えたが、基準の画像の構図に寄り場面は 5 枚、IP-Adapter は場面を 1 つも守らなかった、LoRA は顔を保ち人物の場面は 4 枚、と書いてある
方法ごとの、人物の顔の近さ・見た目と場面を守れた数と、ロボットの目印と場面を守れた数、1 枚の費用撮影・作図: 編集部

比べ方

キャラ 2 人と基準の画像

上に 3 枚。左は人物の基準の画像で、灰色のショートの髪の架空の女性が、深緑の上着と白い T シャツにからし色のマフラーを巻いて正面を向く。中央は同じ絵の顔を広めに切り抜いた 512 画素の画像で、IP-Adapter に渡した物。右はロボットの基準の画像で、白とだいだい色のたまご形の体に、黒い画面の顔と水色の目 2 つ、先が緑の玉のアンテナ。下に 5 つの枠。① 文だけは SDXL と GPT-Image-2.5 Sunburst、② 参照の画像は GPT-Image-2.5 Sunburst・Kling Image 3.0・Nano Banana Pro に基準の画像を 1 枚渡す、③ LoRA は人物が IP-Adapter の絵 19 枚で学習した物、ロボットが第 2 回の LoRA、④ IP-Adapter は人物が plus-face、ロボットが plus で重み 0.7、⑤ は ③ と ④ を同時に使う
キャラ 2 人の基準の画像と、試した 5 つの方法(人物の絵は画像生成 AI の出力、ロボットは編集部の 3D の絵)撮影・作図: 編集部
  • 人物: 架空の 30 代前半の女性です。灰色のベリーショート、深緑の上着と白い T シャツ、からし色のマフラーを文で決めました。基準の画像は、編集部の PC の SDXL base 1.0 で文だけで 24 枚作り、決めた条件(髪・服・マフラーがそろい、顔が見つかり、崩れが無い)を最初に満たした 1 枚です。
  • ロボット: 連載「AI技術大全」のLoRA の作り方 8GB の GPU で画像の LoRA を学習し、枚数と時間を測ったで、編集部が Blender で組んだ hdabot の正面の 1 枚です。LoRA の学習の 20 枚にも入っています。
  • LoRA の学習には、編集部の PC で作った絵だけを使いました。各社の API で作った画像は使っていません。

8 つの場面

場面 人物に頼んだこと ロボットに頼んだこと
S1 正面 上半身・無表情・明るい灰色の無地の背景 全身・立つ・同じ背景
S2 横向き 右を向く・昼の公園 右を向く・昼の公園
S3 振り返り 後ろから見て、肩越しに振り返る・夕方の歩道 後ろから見て、頭をこちらに向ける・夕方の歩道
S4 寄り 顔の寄り・口を開けて笑う・暖かい室内の光 頭と画面の寄り・楽しそうに首をかしげる
S5 カフェ 木の机に座り、驚いた顔で白いカップを持つ 木の机に座り、白いカップを持つ
S6 服を替える いつもの服でなく、黒いスーツと白いシャツ・マフラーなし・オフィス 赤いニットのマフラーを巻く・オフィス
S7 遠景 全身が小さく写る・夕日の浜を歩く 同じ
S8 雨と傘 夜の雨の街で赤い傘を持つ・ネオン 同じ

文はすべて英語で、全部の方法に同じ文を渡しました(全文は記事の最後)。

方法と作った枚数

記号 方法 モデル(記録に残った名前) 人物 ロボット
T1 ① 文だけ SDXL base 1.0(編集部の PC) 8 8
A1 ① 文だけ GPT-Image-2.5 Sunburst(gpt-image-2.5-sunburst) 8 8
A2 ② 参照の画像 GPT-Image-2.5 Sunburst(gpt-image-2.5-sunburst) 8 8
A3 ② 参照の画像 Kling Image 3.0(kling-v3) 8 8
A4 ② 参照の画像 Nano Banana Pro(gemini-3-pro-image) 8 作っていない
T3 ③ LoRA SDXL base 1.0 + LoRA(重み 1.0) 8 8
T4 ④ IP-Adapter SDXL base 1.0 + IP-Adapter(重み 0.7) 8 8
T5 ⑤ LoRA + IP-Adapter T3 と T4 を両方 8 8
  • API は 1 場面 1 枚です。Nano Banana Pro は 1 枚 24.3 クレジットなので、予算(400 クレジット)に収めるため人物だけにしました。Runway Gen-4 Image と Nano Banana 2.1 は、今回は作っていません。
  • LoRA は、元の重みを固定して細い行列だけを学習する方法です(Hu ほか, 2021。仕組みは第 2 回)。IP-Adapter は、Ye ほかが 2023年に発表した、参照の画像を文とは別の注意の層で読ませる部品で、論文では学習する数値が 2,200 万個とされています。
  • 編集部の PC の方法は、比べの主を種 1001 の 8 枚とし、種 1002・1003 の 16 枚は計算の数だけで見ました。IP-Adapter は重み 0.4 と 1.0 も作りました。

数え方

数える物は、絵を作る前に決めました。

  • 人物の顔の近さ: OpenCV の YuNet(MIT ライセンス)で顔を探し、顔を見分ける SFace(Apache-2.0)で基準の顔との近さ(1 に近いほど似ている)を出しました。OpenCV の見本の台本(face_detect.py)は、この近さが 0.363 以上なら同じ人とみなすので、「同じ人の目安」として使います。ただし、超えても同じ人とは言い切れません。生成した絵に向けた値ではなく、今回も文だけの SDXL で、別の人に見える絵が超えました(後の節)。
  • ロボットの近さ: OWLv2(Apache-2.0)でロボットを切り抜き、DINOv2(Apache-2.0)の画像の特徴の近さを出しました。人物の顔でも、DINOv2 の近さを 2 つめの物差しとして出しています。
  • 目で数えた物: 人物は髪・服・持ち物(マフラー・S5 のカップ・S8 の傘)・場面・崩れ。ロボットは第 2 回と同じ目印 3 つ(①白とだいだい色のたまご形 ②黒い画面に水色の丸い目 2 つ ③先が緑の玉のアンテナ)と、持ち物・場面・崩れです。数えたのは編集部(Claude Code を使用)です。

方法ごとの結果

参照の画像を渡す(A2・A3・A4)と、文だけ(A1)

4 段 8 列の人物の絵。A1 文だけ(GPT-Image-2.5 Sunburst)は灰色のショートで深緑の上着とからし色のマフラーの女性が 8 場面を守るが、顔の近さは 0.09〜0.36 で、どれも 0.363 に届かない。A2 参照の画像(GPT-Image-2.5 Sunburst)は基準の画像に近い前髪の長い女性で、顔は 0.56〜0.92、8 枚とも ○。A3 参照の画像(Kling Image 3.0)は顔が 0.52〜0.97 と高いが、S3 は振り返らず正面、S4 は無地の背景、S7 は遠景でなく、場面が 3 枚で ×。A4 参照の画像(Nano Banana Pro)は顔が 0.41〜0.74 で、8 枚とも ○
人物を API のモデルで作った 32 枚。文だけ(A1)と、基準の画像を 1 枚渡した 3 モデル(絵は画像生成 AI の出力)撮影・作図: 編集部
  • A2 GPT-Image-2.5 Sunburst: 顔の近さは 0.56〜0.92(中央値 0.79)で、8 枚とも目安を超え、髪・服・持ち物・場面も 8 枚ともそろいました。S6 は黒いスーツに替わり、マフラーも外れました。
  • A3 Kling Image 3.0: 顔の近さは 0.52〜0.97(中央値 0.84)で、8 枚とも目安を超えました。場面は 8 枚中 5 枚で、S3 は振り返らず、S4 は背景が無地、S7 は遠景になりませんでした。
  • A4 Nano Banana Pro: 顔の近さは 0.41〜0.74(中央値 0.53)で、8 枚とも目安を超えましたが、A2・A3 より低めでした。見た目と場面は 8 枚ともそろいました。前髪が短く眉が太めの絵があり、A2 より基準の人から離れて見えました(編集部の見立て)。
  • A1 文だけ: 見た目と場面は 8 枚ともそろいましたが、顔の近さは 0.09〜0.36 で、8 枚とも目安に届きませんでした。基準の画像を見ていないので、別の人の顔です。一方、8 枚の顔どうしの近さは中央値 0.54 で、28 組中 22 組が目安を超えました(計画の後で足した数)。
3 段 8 列のロボットの絵。A1 文だけは白とだいだい色のロボットが 7 場面を守り、黒い手と足がつく。S8 は背景の看板の字のため載せていない。A2 参照の画像は基準の画像に近い丸い腕と灰色の足で、S3 は後ろからでなく斜め前から歩くので場面が ×。A3 参照の画像は、S2 が左を向き、S3 は顔の画面が横を向き、S4 は寄りでなく全身で、場面が ×。S5 はカップを手に持たず持ち物が ×
ロボットを API のモデルで作った 23 枚(絵は画像生成 AI の出力)撮影・作図: 編集部
  • ロボットは 3 つとも、目印 3 つが 8 枚すべてにそろいました。文で書くだけで伝わる単純な形だったためと見ています。ただし文だけ(A1)は、黒い手やだいだい色の足が付き、目印に入れていない所で別のロボットになりました。
  • 場面は A1 が 8 枚、A2 が 7 枚、A3 が 5 枚でした。A3 は人物と同じく、基準の画像の正面の構図に寄りました。

編集部の PC: 文だけ・LoRA・IP-Adapter(T1・T3・T4・T5)

4 段 8 列の人物の絵。T1 文だけ(SDXL base 1.0)は写真とアニメ調が混じり、S2 は左を向き、S4 は屋外、S6 と S7 は髪が黒、S8 は髪が緑で黄色の傘。顔の近さは 0.01〜0.57 で、0.363 以上は 3 枚、S3 は顔が見つからない。T3 LoRA は灰色のショートの女性が公園・街・カフェ・オフィス・浜・雨の街に立ち、顔は 0.55〜0.60。S1 と S5 が ○ で、ほかは服や場面が ×。T4 IP-Adapter は 8 枚とも正面で灰緑の背景、顔は 0.62〜0.72 で、服と場面が ×。T5 LoRA + IP-Adapter も 8 枚とも正面で灰緑の背景、目が大きく顔がゆがみ、顔は 0.53〜0.58 で、場面と崩れが ×
人物を編集部の PC の SDXL で作った 32 枚(絵は画像生成 AI の出力)撮影・作図: 編集部
  • T1 文だけ(SDXL base 1.0): 8 枚中 5 枚が、頼んでいないアニメ調になりました。髪が黒や緑の絵が 3 枚あり、髪・服・持ち物がそろったのは 1 枚、場面を守れたのは 3 枚です。顔の近さは中央値 0.32 で、目安を超えたのは 3 枚でした。
  • T3 LoRA(W19): 顔の近さは 0.55〜0.60 で、8 枚とも目安を超えました。背景は公園・カフェ・オフィス・雨の街など、文に沿って変わりました。ただし向きはほぼ正面のままで、場面を守れたのは 4 枚、髪・服・持ち物がそろったのは 3 枚です。スーツに替わらず、傘は黄色でした。学習の 19 枚がすべて正面・同じ服だった偏りが出たと見ています(編集部の見立て)。
  • T4 IP-Adapter(重み 0.7): 顔の近さは 0.62〜0.72 で 8 枚とも目安を超えましたが、8 枚とも基準の画像と同じ正面の上半身と灰緑の背景になり、場面は 1 つも守れませんでした。スーツも傘も出ず、上着の下の服は、多くがからし色でした。
  • T5 LoRA + IP-Adapter: 8 枚とも基準の画像と同じ構図になり、場面は 0 枚でした。目が大きく顔の形がゆがみ、8 枚とも崩れに数えました。
4 段 8 列のロボットの絵。T1 文だけは緑の大きな目が 1 つで、体に水色の帯が入ったロボットになり、8 枚とも目印 ①②③ が ×。T3 LoRA は白とだいだい色のたまご形のロボットが、公園・街・カフェ・オフィス・浜・雨の街に立ち、S3 だけ体に水色の帯。マフラー・カップ・傘は出ない。T4 IP-Adapter は 8 枚とも基準の画像と同じ部屋と構図で、アンテナの玉が 2 つ重なり ③ が ×。T5 LoRA + IP-Adapter も 8 枚とも基準の画像と同じ構図で、目印はそろうが場面が ×
ロボットを編集部の PC の SDXL で作った 32 枚(絵は画像生成 AI の出力)撮影・作図: 編集部
  • T1 と T4: T1 は緑の大きな目が 1 つのロボットなどになり、目印がそろったのは 0 枚でした。T4 は 8 枚とも基準の画像とほぼ同じ構図と部屋で、アンテナの玉が 2 つ重なって目印③が外れました。
  • T3 LoRA(B20): 目印は 8 枚中 7 枚でそろいましたが、場面は 3 枚で、マフラー・カップ・傘は 1 つも出ませんでした。学習の 20 枚に、持ち物の絵は入っていません。
  • T5 LoRA + IP-Adapter: 目印は 8 枚ともそろいましたが、基準の画像と同じ構図で、場面は 0 枚でした。

IP-Adapter の重みを変えると

3 段 6 列。重み 0.4 は、人物の背景に木や雨の街が出て、S8 は黄色の傘を持つが、顔はほぼ正面のまま。ロボットは基準の画像と同じ部屋で、アンテナが 2〜3 本になる。重み 0.7 と 1.0 は、人物もロボットも基準の画像とほぼ同じ構図。人物の顔の近さの中央値は 0.67・0.67・0.65、場面を守れたのは人物が 1・0・0、ロボットが 0・0・0、ロボットの目印は 0・0・4
IP-Adapter の重みを 0.4・0.7・1.0 に変えた人物とロボットの絵(絵は画像生成 AI の出力)撮影・作図: 編集部
  • 重み 0.4 では、人物の背景に木や雨の街が出始めましたが、向きは 8 枚ともほぼ正面で、場面を守れたのは 1 枚でした。顔の近さは 0.7 と同じ 0.67 です。
  • ロボット(plus)は 0.4 でも基準の画像と同じ部屋と構図で、アンテナが 2〜3 本に崩れました。1.0 では目印 3 つが 4 枚でそろいましたが、場面は 0 枚です。
  • 公式の実装の説明と Diffusers のドキュメントは、文と一緒に使うなら重み 0.5 を目安にしています。今回の 0.7 はそれより強い設定です。plus-face と plus では、0.4 でも構図が残りました。

似ている度合いの数

点の図が上下に 2 つ。上は人物の顔の SFace の近さで、0.363 に緑の線。T1 文だけは中央値 0.32 で、種を変えた白抜きの点は 0.2〜0.53 に散る。A1 文だけは 0.27 で、8 点とも線より左。A2 は 0.79、A3 は 0.84、A4 は 0.53 で、どれも線より右。T3 LoRA は 0.56、T4 IP-Adapter は 0.67、T5 は 0.54 で、白抜きの点も含めて線より右。下はロボットの DINOv2 の近さで、T1 0.70、A1 0.64、A2 0.73、A3 0.78、T3 0.89、T4 0.90、T5 0.95
方法ごとの、人物の顔の SFace の近さとロボットの DINOv2 の近さ。編集部の PC の方法は、種を変えた 16 枚も白抜きで重ねた撮影・作図: 編集部
  • 編集部の PC の方法は、種を変えた 16 枚を足した 24 枚でも、中央値は T1 0.40・T3 0.57・T4 0.67・T5 0.55 でした。
  • ただし、文だけの T1 も 23 枚中 14 枚が目安を超えました。髪が黒い別の人の絵も含みます。基準の画像も SDXL で作ったため、SDXL の顔どうしは超えやすいと見ています。SDXL の方法どうしは中央値で比べてください。
  • ロボットの DINOv2 の近さは、基準の画像の構図を写した T5(0.95)と T4(0.90)が高く、目印のそろわない T1(0.70)が、そろった A1(0.64)より高く出ました。ロボットは目印の数を主に見てください。
  • A3 と A2 の中央値の差(0.05)は、8 枚の中の幅より小さく、順位は付けていません。顔の近さが高い A3 と T4 は、どちらも基準の画像の構図に寄った絵でした。近さの数だけで選ぶと、場面を変えられない方法を選ぶことがあります。

設定: 参照の画像の渡し方と ComfyUI のノード

API に参照の画像を渡す

YOBITSUGI AI の画像の道具は、images に渡した画像を、各社の API に次の形で渡します。

モデル 渡し方 公式の説明(2026年10月15日に確認)
GPT-Image-2.5 Sunburst 画像を直す口(images/edits)に image[] として 1 枚 1 枚以上の画像を参照にして新しい画像を作れる
Kling Image 3.0 画像の生成の image に 1 枚 参照の画像は 10 枚まで
Nano Banana Pro 文と同じ依頼に、画像を 1 枚添える キャラの画像は 5 枚まで、全体で 14 枚まで

今回はどれも 1 枚だけ渡しました。向きの違う画像を何枚か渡す使い方は試していません。OpenAI のガイドは、繰り返し出てくるキャラの見た目をそろえるのが苦手なことがある、と注意しています。

ComfyUI に IP-Adapter を足す

ComfyUI 0.39.0 の本体には IP-Adapter のノードが無いので、追加のノード ComfyUI_IPAdapter_plus(GPL-3.0)を足しました。作者は 2025年4月14日から「保守だけ」の状態にしています。

  • 既存の ComfyUI のフォルダは触らず、別のフォルダに置いて、extra_model_paths.yaml で読ませました。
  • モデルは、h94/IP-Adapter(Apache-2.0)の IP-Adapter 2 つと、画像を読む部品 OpenCLIP ViT-H-14 の 3 つで、約 4.2GB です(置き場所は下の枠)。
YAML
# extra_model_paths.yaml(編集部の設定。C:\lora_work は作業用のフォルダ)
lora_work:
    base_path: C:/lora_work/
    checkpoints: models/
    loras: |
        out/
        scc/out/
scc:
    base_path: C:/lora_work/scc/
    custom_nodes: custom_nodes/
    ipadapter: models/ipadapter/
    clip_vision: models/clip_vision/
テキスト
# C:/lora_work/scc/ の下に置いたファイル(ComfyUI_IPAdapter_plus はコミット a0f451a)
models/ipadapter/ip-adapter-plus-face_sdxl_vit-h.safetensors    人物(h94/IP-Adapter の sdxl_models)
models/ipadapter/ip-adapter-plus_sdxl_vit-h.safetensors         ロボット(同上)
models/clip_vision/CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors  h94/IP-Adapter の models/image_encoder/model.safetensors をこの名前で置いた

使ったノードと設定は次のとおりです。T5 は全部を、T3 は IP-Adapter の 4 つを除いて、T4 は LoRA を除いて使いました。

ノード 設定
CheckpointLoaderSimple sd_xl_base_1.0.safetensors
LoraLoaderModelOnly 人物 W19・ロボット B20、strength_model 1.0
IPAdapterModelLoader 人物 plus-face・ロボット plus
CLIPVisionLoader CLIP-ViT-H-14-laion2B-s32B-b79K
LoadImage 人物は顔の切り抜き(YuNet の顔の枠を 2 倍に広げた正方形を 512×512 に縮めた物)、ロボットは基準の画像の全体
IPAdapterAdvanced weight 0.7・weight_type linear・combine_embeds concat・start_at 0・end_at 1・embeds_scaling V only
KSampler 30 ステップ・CFG 7・euler_ancestral・normal・1024×1024
T5(LoRA + IP-Adapter)の API 形式のワークフロー

文の欄は省いています。全文は記事の最後です。

JSON
{
 "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "sd_xl_base_1.0.safetensors"}},
 "2": {"class_type": "LoraLoaderModelOnly", "inputs": {"model": ["1", 0], "lora_name": "W19\\W19.safetensors", "strength_model": 1.0}},
 "10": {"class_type": "IPAdapterModelLoader", "inputs": {"ipadapter_file": "ip-adapter-plus-face_sdxl_vit-h.safetensors"}},
 "11": {"class_type": "CLIPVisionLoader", "inputs": {"clip_name": "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors"}},
 "12": {"class_type": "LoadImage", "inputs": {"image": "p_face.png"}},
 "13": {"class_type": "IPAdapterAdvanced", "inputs": {"model": ["2", 0], "ipadapter": ["10", 0], "image": ["12", 0], "clip_vision": ["11", 0], "weight": 0.7, "weight_type": "linear", "combine_embeds": "concat", "start_at": 0.0, "end_at": 1.0, "embeds_scaling": "V only"}},
 "3": {"class_type": "CLIPTextEncode", "inputs": {"text": "hdawoman, Photo of a fictional ...", "clip": ["1", 1]}},
 "4": {"class_type": "CLIPTextEncode", "inputs": {"text": "lowres, blurry, text, watermark, signature", "clip": ["1", 1]}},
 "5": {"class_type": "EmptyLatentImage", "inputs": {"width": 1024, "height": 1024, "batch_size": 1}},
 "6": {"class_type": "KSampler", "inputs": {"model": ["13", 0], "seed": 1001, "steps": 30, "cfg": 7.0, "sampler_name": "euler_ancestral", "scheduler": "normal", "positive": ["3", 0], "negative": ["4", 0], "latent_image": ["5", 0], "denoise": 1.0}},
 "7": {"class_type": "VAEDecode", "inputs": {"samples": ["6", 0], "vae": ["1", 2]}},
 "8": {"class_type": "SaveImage", "inputs": {"images": ["7", 0], "filename_prefix": "scc"}}
}

人物の LoRA の学習の画像を、IP-Adapter で作る

人物は基準の画像が 1 枚しかないので、IP-Adapter で同じ人の絵を増やしてから、LoRA を学習しました。LoRA が覚えたのは、基準の画像そのものでなく、IP-Adapter が描いた顔と服です。各社の API の絵は使っていません。

10 列 4 段に 40 枚の顔の絵。どれも灰色のショートの女性が正面を向き、背景は灰緑の無地。○ の 19 枚は深緑の上着とからし色のマフラー。× の 21 枚は、上着がからし色(10 枚)、上着が無くセーターかベスト(9 枚)、袖がからし色(1 枚)、人が 2 人(1 枚)。下の黒い帯に、頼んだ向き(横・斜め 32 枚)と背景(灰色・ベージュ)はほとんど出ず、40 枚ともほぼ正面で、背景は基準の画像と同じ灰緑になった、と書いてある
人物の LoRA の学習の画像。IP-Adapter で作った候補 40 枚と、決まりで残した 19 枚(絵は画像生成 AI の出力)撮影・作図: 編集部
  • 候補 40 枚: SDXL + IP-Adapter(T4 と同じ設定)で、向き 5 通り × 表情と寄り 4 通り × 背景 2 色を頼みました。評価の 8 場面の背景は入れていません。
  • 選び方: 先に決めた決まりで、髪・深緑の上着・マフラーがそろわない物と崩れた物を外し、残りを番号の順に 20 枚まで使う予定でした。残ったのは 19 枚です。
  • 頼んだ向きと背景は出なかった: 横向きを頼んだ 16 枚も含め、40 枚ともほぼ正面で、背景は基準の画像と同じ灰緑でした。
  • 説明の文: 絵に合わせて書き直しました(全文は下の補足)。

学習の設定は第 2 回のロボット(B20)と同じです(全文は下の補足)。学習は読み込みとキャッシュを含めて 26.5 分(1 ステップ 1.26 秒)、PyTorch が確保した VRAM は最大 6,798MiB、GPU の電力量は 46.0Wh でした。LoRA のファイルは 85.4MB です。

基準の画像と学習の候補に渡した文・学習の説明の文と設定(全文)

基準の画像(SDXL base 1.0・文だけ・種 2001〜2024)には、人物の説明と S1 の場面の文を渡しました(記事の最後の文と同じ)。

学習の候補(SDXL + IP-Adapter・種 3001〜3040)の文は、人物の説明の後ろに、次の形の 1 文を足しました。c01〜c40 の順に、〈向き〉は 1 枚ごと、〈表情と寄り〉は 5 枚ごと、〈背景〉は 20 枚ごとに替えました(c01 は Front view・neutral expression, upper body・Plain light gray background)。

テキスト
<Front view | Three-quarter view from the left | Three-quarter view from the right | Side view facing left | Side view facing right>, <neutral expression, upper body | gentle smile, upper body | serious expression, close-up of the face | gentle smile, waist-up>. <Plain light gray background | Plain beige background>, soft studio light.

学習の説明の文(19 枚。c14 と c37 の 2 枚だけ、front view を slightly turned to the side にした)

テキスト
hdawoman, front view, neutral expression, upper body, plain sage green background, photo

学習の設定(sd-scripts。ファイルの置き場所の行は省いた)

TOML
network_module = "networks.lora"
network_dim = 16
network_alpha = 8
network_train_unet_only = true
cache_text_encoder_outputs = true
cache_latents = true
gradient_checkpointing = true
mixed_precision = "bf16"
optimizer_type = "AdamW8bit"
learning_rate = 0.0001
lr_scheduler = "constant"
max_train_steps = 1200
save_precision = "fp16"
seed = 42
sdpa = true
# データ: resolution 1024・batch_size 1・num_repeats 1・enable_bucket(640〜1536)・説明の文は .txt

1 キャラを 100 枚作るときの費用

表。A1 文だけ(GPT-Image-2.5 Sunburst)は 100 枚 238 クレジット・1 枚 13〜21 秒・準備なし。A2 参照の画像(GPT-Image-2.5 Sunburst)は 386 クレジット・16〜24 秒・基準の画像 1 枚。A3(Kling Image 3.0)は 490 クレジット・20〜35 秒。A4(Nano Banana Pro)は 2,433 クレジット・18〜21 秒。編集部の PC の T1・T4 は電気代 約 1.7 円(1 枚 0.56Wh)・12〜15 秒・IP-Adapter の導入 約 4.2GB。T3・T5 の LoRA は電気代 約 1.7 円 + 準備 約 2.5 円(人物の準備は 82Wh)、人物は画像作りと学習で 約 43 分、ロボットは第 2 回の 3D の絵と学習
1 キャラを 100 枚作るときの費用・1 枚の時間・先に要る物撮影・作図: 編集部
  • 参照の画像を渡すと、GPT-Image-2.5 Sunburst は文だけより 1 枚 1.5 クレジット多くかかりました(2.4 → 3.9)。Nano Banana Pro はその約 6 倍ですが、今回の 8 枚では見た目と場面の数は同じで、顔の近さは GPT-Image-2.5 Sunburst の方が高く出ました。
  • 編集部の PC は、人物の LoRA の準備に約 43 分かかりました。選ぶ手間と PC の購入費は入っていません。ComfyUI を起動した最初の 1 枚だけ、モデルの読み込みで約 31 秒かかりました。

使い分け

こんなとき 向く方法(今回の結果から)
同じ人を、場面や服を変えて少しずつ作る 参照の画像を渡す API(GPT-Image-2.5 Sunburst・Nano Banana Pro)
正面に近い構図のまま、顔を基準の画像に寄せたい Kling Image 3.0 の参照の画像も候補。顔は 8 枚とも目安を超えたが、場面は基準の画像の構図に寄りやすい
単純な形のキャラで、目印だけそろえばよい 文だけでも、GPT-Image-2.5 Sunburst は目印を 8 / 8 そろえた
自分の PC で、同じ人を大量に作る LoRA。学習の画像に、向き・服・持ち物の違う絵を入れる
IP-Adapter を使う 重みを下げて試す。今回の plus と plus-face は 0.4 でも構図が残った

参照の画像を渡すときの手順

  1. 基準の画像を 1 枚決める

    顔がはっきり見える正面の上半身で、髪・服・持ち物も写る絵にします。

  2. 文に、キャラの説明と場面の両方を書く

    見た目(髪・服・持ち物)を書き、そのあとに場面と、変えたい所(服・向き・背景)を書きます。

  3. 参照の画像の扱いを 1 段落で書く

    「顔と髪と体の形は参照に合わせ、ポーズ・表情・服・持ち物・背景は文に従う」と分けて書きました(全文は記事の最後)。

  4. 数えて確かめる

    顔の近さだけでなく、服と場面も目で確かめます。顔が近いのに場面が基準の画像のまま、という絵がありました。

気をつけること

  • 比べ方に偏りがあります。 人物の基準の画像は SDXL で作り、人物の LoRA は IP-Adapter の絵で学習しました。ロボットの基準の画像は LoRA の学習の画像に入っています。SDXL base 1.0 は 2023 年のモデルで、画質は比べていません。
  • SFace の 0.363 は目安です。 OpenCV の見本の台本の境で、生成した絵に向けた値ではありません。SDXL の文だけでも 23 枚中 14 枚が超えたので、超えても同じ人とは言い切れません。
  • IP-Adapter は 2 つの部品と 3 つの重みだけです。 重み 0.5 や、一部の層だけに効かせる使い方は試していません。
  • 人の写真を参照の画像に渡すときは、 本人の許可と各社の利用の決まりを確かめてください。今回は架空の人物の絵だけです。
  • ライセンス: SDXL base 1.0(CreativeML Open RAIL++-M)には使い方の制限があります。ComfyUI_IPAdapter_plus は GPL-3.0、IP-Adapter のモデルは Apache-2.0 です。画像を読む部品 OpenCLIP ViT-H-14 は MIT ライセンスですが、配布のページは研究向けの成果とし、製品などに組み込む使い方を今は対象の外としています。

まとめ

  • 今回の 8 場面では、基準の画像を 1 枚渡す API の方法が、顔と見た目と場面をいちばん安定して保ちました。
  • SDXL の IP-Adapter(重み 0.7)は、基準の画像の構図から離れませんでした。LoRA は背景を変えられましたが、学習の画像に無い向き・服・持ち物は出にくくなりました。

渡した文(全文)

1 枚の文は「キャラの説明 + 空白 + 場面の文」で、全部の方法で同じです。方法ごとに足した物は、この節の終わりに書きます。

  • API: YOBITSUGI AI の画像の道具に、大きさ 1024×1024 で渡しました。A1・A2 は GPT-Image-2.5 Sunburst(provider openai・best)、A3 は Kling Image 3.0(provider kling)、A4 は Nano Banana Pro(provider gemini・best)です。A2〜A4 は images に基準の画像を 1 枚渡しました(人物もロボットも基準の画像の全体)。ほかの設定は既定のままで、記録では GPT-Image-2.5 Sunburst の画質は medium でした。
  • SDXL: ComfyUI のノードの設定(上の表)のとおりで、種は 1001(比べの主)と 1002・1003 です。

キャラの説明

人物の説明

テキスト
Photo of a fictional Japanese woman in her early 30s with an ash-gray pixie cut (very short hair that shows her ears) and thick straight dark eyebrows, wearing a forest-green work jacket over a white crew-neck T-shirt and a mustard-yellow knit scarf.

ロボットの説明

テキスト
A small fictional robot with an egg-shaped body, white on the upper half and orange on the lower half, a black screen face with two round cyan eyes, short arms and legs, and one antenna with a green ball on the top of its head.

場面の文(8 つ)

人物とロボットに分けて載せます。S7 は 2 人とも同じ文です。

8 場面の文(人物とロボット)

S1 正面(人物)

テキスト
Front view, upper body, neutral expression, looking at the camera. Plain light gray background, soft studio light.

S1 正面(ロボット)

テキスト
Front view, whole body, standing and facing the camera. Plain light gray background, soft studio light.

S2 横向き(人物)

テキスト
Side view, facing right, upper body. Standing in a green park with trees, daytime.

S2 横向き(ロボット)

テキスト
Side view, facing right, whole body. Standing in a green park with trees, daytime.

S3 振り返り(人物)

テキスト
Seen from behind, looking back over her shoulder at the camera. On a city sidewalk in the evening.

S3 振り返り(ロボット)

テキスト
Seen from behind, turning its head back toward the camera. On a city sidewalk in the evening.

S4 寄り・表情(人物)

テキスト
Close-up of her face, laughing happily with her mouth open. Warm indoor light.

S4 寄り・表情(ロボット)

テキスト
Close-up of its head and face screen, tilting its head happily. Warm indoor light.

S5 カフェ・驚き・カップ(人物)

テキスト
Sitting at a wooden table in a cafe, looking surprised with wide eyes and an open mouth, holding a white coffee cup.

S5 カフェ・驚き・カップ(ロボット)

テキスト
Sitting at a wooden table in a cafe, holding a white coffee cup, looking surprised.

S6 服を替える(人物)

テキスト
Instead of the usual clothes, she wears a black business suit with a white shirt and no scarf. Standing in a modern office, upper body.

S6 服を替える(ロボット)

テキスト
Wearing a red knitted scarf around its neck. Standing in a modern office.

S7 遠景(人物)

テキスト
Wide shot, full body, small in the frame, walking on a beach at sunset.

S7 遠景(ロボット): 人物と同じ文です。

S8 夜の雨・傘(人物)

テキスト
Holding a red umbrella on a rainy city street at night, upper body, neon lights reflecting on the wet road.

S8 夜の雨・傘(ロボット)

テキスト
Holding a red umbrella on a rainy city street at night, neon lights reflecting on the wet road.

方法ごとに足した物

参照の画像の 3 モデル(A2・A3・A4)には、文の後ろに空行を 1 つはさんで、この段落を足しました。人物とロボットで同じ段落です。

テキスト
The attached image is the reference for this character. Keep the same character design (face, hair, colors and body shape) as in the reference. Follow the text above for the pose, expression, clothes, items and background.

LoRA を使う方法(T3・T5)は、文の先頭に合図の語を足しました。人物は hdawoman, 、ロボットは hdabot robot, です。SDXL の否定の文(出してほしくない物)は、全部の SDXL の絵で同じです。

テキスト
lowres, blurry, text, watermark, signature

参考にした公式の情報

連載・極める 生成AIの品質を突き詰める

連載はここまでです

最後まで読んでいただき、ありがとうございました。気になった回は、何度でも読み返せます。

XFacebookはてブLINE

執筆者

佐々木 航@w_sasaki

with Claude Code

プロフィール

株式会社Game 代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。

この記事は、Claude Code を使って執筆しました。画面の画像は、検証環境で実際に操作して撮影したものです(引用の画像は出典を記載しています)。内容の誤りはお問い合わせからお知らせください。

あわせて読みたい