西川和久の不定期コラム
Stable Diffusionで写真1枚から顔を似せるには?いろいろなFaceコントロールを試してみる
2024年1月23日 06:13
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枚。ただ西洋系なのと、思いっきりテイストも変わっており、似てるかどうかの判別は付けにくい。
そこで今度は筆者が撮影した写真を使用。元画像は1枚と4枚。Seedやそのほかの設定は全く同じだ。この時、サイトの情報によると“アジア系の人の場合はasian”とプロンプトへ加えた方が良いとあったためそうしている。
写真1枚と4枚とで仕上がりに大差はなく、ちょっと拍子抜け。以降2つは、StyleをDisney CharactorとLine Artへ変更している。これは以前ご紹介したFooocusもそうなのだが、入力したプロンプトに指定のStyle(のプロンプト)を挟み込む形で、プロンプトを拡張している。
なおDisney Charactorは、いきなりそれらしいキャラクターに変身するわけではなく、あくまでも雰囲気……といった感じとなる。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枚での実行結果となる。
ちょうどこの原稿を書いている最中に、もう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よりも似ない(笑)。こちらでうまく行けば、日頃生成している画像の顔だけ入れ替えも可能なのだが、世の中そんなに甘くない……と言ったところだろう。
以上、1枚の写真から顔の似た画像を生成する方法として、PhotoMaker、そしてIPAdapterの各モデルなどをご紹介した。結局PhotoMakerがまだ似ているものの、それにしてもと言う感じだろうか。
最後に口直しとして(笑)、写真を15枚/3,000ステップで学習した顔LoRAを、モデル: Cherry Picker XLに、重み0.8で当てた結果がこれだ。今回の記事中、彼女の写真は、もともとLoRA学習用に用意したものの一部となっている。
写真1枚でLoRA並みに似る仕掛けはできるのだろうか? 今後に期待と言ったところだ。