西川和久の不定期コラム

Stable Diffusionで写真1枚から顔を似せるには?いろいろなFaceコントロールを試してみる

 Stable Diffusionはモデル(Model)とプロンプト(Prompt)の組み合わせで、写真やイラストなどを自由に生成できるのはご存知の通り。用途にもよるだろうが、「顔を似せたい」ケースもあるだろう。今回は写真1枚で似た画像を生成できる技術をいくつかご紹介したい。

PhotoMaker

 Stable Diffusionで顔を似せたい時、手堅い方法としては、対象となる顔を学習し、LoRAを作ること(個人的に顔LoRAと呼んでいる)。

 経験上、学習元になる写真は10〜15枚あればいいが(SD 1.5なら512×512、SDXLなら1,024×1,024)、GeForce RTX 4090でも15枚3,000ステップで約40分と、結構重い処理となり、皆が皆、気楽に作れる状況ではない。逆にその分、フェイクなどの抑止になっているという話もある。

 もっと簡単に作る方法は? と言うことで、2024年1月15日にリリースされたばかりのPhotoMakerをまず試してみたい。これは写真1枚(複数も可)から、同系統の顔を生成する技術だ。デモUIがあるので、これで試すことも可能。

 ただ遅いうえに、エラーになったりと使いにくく、コードがあるので、ローカル環境で動かすことにした。以下、インストール方法となる。githubに書かれていることそのままだと動かなかったので一部修正。試した環境はUbuntu 22.04.3 + GeForce RTX 4090となる。

git clone https://github.com/TencentARC/PhotoMaker
cd PhotoMaker
※ PhotoMakerをローカルへコピー

conda create -n photomaker python=3.10
conda activate photomaker
※ pythonの環境構築

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
※ cuda関連(cu121は使わない)

nano requirements.txt
# pytorch-cuda==11.8
※この行をコメントアウト

pip install -r requirements.txt
※ 依存ライブラリインストール

nano gradio_demo/app.py
import sys
sys.path.append('/home/xxxx/PhotoMaker')
※ コードの頭に追加する。2行目はgit cloneしたpath

demo.launch(share=True)
※ ほかのマシンからも使いたい時にshare=Trueを追記する

python gradio_demo/app.py
※ 実行
初回実行時、モデルなどいろいろダウンロードするので少し時間がかかる

 まず、サンプルが2つ入っているので(下のExamples)それぞれ試した結果が以下の通り。どちらも元となる顔写真は4枚。ただ西洋系なのと、思いっきりテイストも変わっており、似てるかどうかの判別は付けにくい。

ローカル環境で作動したPhotoMaker(1/4)。プロンプト: instagram photo, portrait photo of a woman img, colorful, perfect face, natural skin, hard shadows, film grain
ローカル環境で作動したPhotoMaker(2/4)。プロンプト: sci-fi, closeup portrait photo of a man img wearing the sunglasses in Iron man suit, face, slim body, high quality, film grain

 そこで今度は筆者が撮影した写真を使用。元画像は1枚と4枚。Seedやそのほかの設定は全く同じだ。この時、サイトの情報によると“アジア系の人の場合はasian”とプロンプトへ加えた方が良いとあったためそうしている。

ローカル環境で作動したPhotoMaker(3/4)。写真1枚から。プロンプト: portrait photo of a asian woman img, perfect face, natural skin, film grain
ローカル環境で作動したPhotoMaker(4/4)。写真4枚から。プロンプトとSeedは同じ

 写真1枚と4枚とで仕上がりに大差はなく、ちょっと拍子抜け。以降2つは、StyleをDisney CharactorとLine Artへ変更している。これは以前ご紹介したFooocusもそうなのだが、入力したプロンプトに指定のStyle(のプロンプト)を挟み込む形で、プロンプトを拡張している。

 なおDisney Charactorは、いきなりそれらしいキャラクターに変身するわけではなく、あくまでも雰囲気……といった感じとなる。Line Artはほとんどモノクロ。個人的にはこのテイストは好きかも知れない。

Style: Disney Charactor
Style: Line Art

 Advanced Optionsには、Negative Prompt、ステップ数(デフォルト50)、Style strenght(Styleの効き目。デフォルト20)、出力画像数(デフォルト2)、Guidance scale(デフォルト5)、Seedと言った見慣れた項目が並んでいる。ステップ数の50は大きいので30で十分だと思う。

 いかがだろうか。今回のケースだと写真1枚も4枚も結果はあまり変わらなかったが、特徴をある程度掴んでいる。とは言え、どちらかと言えば似てない……と思うのだが。

PhotoMaker / ComfyUI版

 先のPhotoMakerは専用のUIを使ったものだが、既にComfyUIのカスタムNodeが出ており、簡単に試すことができる。インストールは、/ComfyUI/custom_nodes/へ以下をgit cloneするだけだ。

https://github.com/StartHua/Comfyui-Mine-PhotoMaker

 インストール後、Add Node→CXHにCXH_PhotoMakerとCXH_PhotoMaker_Batchがあるので用途に応じて選ぶ。前者は写真1枚、後者はフォルダ内に複数の写真を置き使う……という感じだ。今回はCXH_PhotoMakerを使い、写真1枚での実行結果となる。

ComfyUI / CXH_PhotoMakerを動かしたところ
ComfyUI / ZHO-ZHO-ZHO ComfyUI-PhotoMakerを動かしたところ

 ちょうどこの原稿を書いている最中に、もう1つのComfyUI版PhotoMakerカスタムNodeが出た。

https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker

 Styleや縦横比なども変更できるため、以降、こちらを使った方がいいだろう。

 先の専用UIより少し似た感じがしないでもない。いずれにしても、使用しているモデルはPhotoMaker専用、普段生成している画像の顔だけ入れ替えるのも難しく、用途としては、自分のソーシャルアカウントのアイコン画像を作る程度だろうか。

その他もいろいろ試してみたが……

 このほか、写真1枚で似せる方法として、「IPAdapter plus-face」、「full-face」、「faceid(-plusv2)」……これらはSD 1.5、そしてSDXL用の「IPAdapter ip-adapter-faceid_sdxl」などがある。FaceID関連のファイルはここ揃っている。

 以下、ComfyUIで実際試した結果となるが、正直、先のPhotoMakerよりも似ない(笑)。こちらでうまく行けば、日頃生成している画像の顔だけ入れ替えも可能なのだが、世の中そんなに甘くない……と言ったところだろう。

上段左から順に、オリジナル、plus-face, full-face。下段左からfaceid-plusv2、faceid-plusv2 + plus-face、faceid-plusv2 + full-face
IPAdapter ip-adapter-faceid_sdxl

 以上、1枚の写真から顔の似た画像を生成する方法として、PhotoMaker、そしてIPAdapterの各モデルなどをご紹介した。結局PhotoMakerがまだ似ているものの、それにしてもと言う感じだろうか。

 最後に口直しとして(笑)、写真を15枚/3,000ステップで学習した顔LoRAを、モデル: Cherry Picker XLに、重み0.8で当てた結果がこれだ。今回の記事中、彼女の写真は、もともとLoRA学習用に用意したものの一部となっている。

Cherry Picker XLに学習した顔LoRAを当てた結果。ほぼ本人! モデル:小彩 楓

 写真1枚でLoRA並みに似る仕掛けはできるのだろうか? 今後に期待と言ったところだ。