【InstantID】マルチバースの人物画像を生成できるAIで有名人をアメリカの高校生にしてみた
WEELメディア事業部LLMリサーチャーの中田です。
1月15日、入力された画像を様々なスタイルに変換できる「InstantID」が公開されました。
この手法を用いることで、1枚の画像を入力するだけで、様々なスタイルに編集できるんです、、、!
InstantIDのGitHubでのスター数は、すでに7000を超えており、注目度の高さがうかがえます。
この記事ではInstantIDの使い方や、有効性の検証まで行います。本記事を熟読することで、InstantIDの凄さを実感し、ただの画像編集AIには戻れなくなるでしょう。
ぜひ、最後までご覧ください。
InstantIDの概要
InstantIDは、1枚の画像を入力するだけで、その画像を様々なスタイルに変換することができるAIツールです。ControlNetと同じような効果を持ちます。
上記の様に、左端の入力画像をもとにStyle 1~Style 8まで、幅広くスタイル変換できるのです。
以下の図は、InstantIDのモデル構造です。
本モデルにおける以下の3つの重要な要素で、顔やテキストの情報を処理しています。
- 顔の詳細情報を埋め込むFace Encoder
- Face EmbeddingとText Embeddingを通す2つのクロスアテンション
- 目や鼻の位置など顔の特徴(landmarks)を抽出するIdentityNet
上記の3つの要素で「顔」と「テキストプロンプト」の情報を処理し、拡散モデル(UNet)に送り込みます。そして、その情報をもとに、拡散モデルが画像を生成するのです。
また、UNet自体は学習しないので、もともとのText-Imageの生成能力を維持でき、既存の学習済みモデルやControlNetsと互換性があるそうです。さらに、テスト時のチューニングを必要としないので、特定のテキストに対して、微調整のために複数の画像を収集する必要がなく、1つの画像を1回推論するだけで済むそう。
こうすることで、以下のように、1つの画像を様々なスタイルに変換できるのです。
なお、ControlNetも利用できるWebUI版のStable Diffusionについて知りたい方はこちらの記事をご覧ください。
→【Stable Diffusion WebUI Forge】省エネ・高速・高解像度の画像生成モデルを使ってみた
InstantIDのライセンス
Apache License 2.0の下、誰でも無償で商用利用することが可能です。
利用用途 | 可否 |
---|---|
商用利用 | ⭕️ |
改変 | ⭕️ |
配布 | ⭕️ |
特許使用 | ⭕️ |
私的使用 | ⭕️ |
\画像生成AIを商用利用する際はライセンスを確認しましょう/
InstantIDの使い方
ここでは、GitHubに載っている方法を参考にして、Google ColabのT4を用いて、実行していきます。
まずは、以下のコードを実行して、必要なライブラリをインストールしましょう。
!git clone https://github.com/InstantID/InstantID.git
%cd InstantID/gradio_demo/
!pip install -r requirements.txt
ここで、ランタイムの再起動。
%cd InstantID
from huggingface_hub import hf_hub_download
hf_hub_download(repo_id="InstantX/InstantID", filename="ControlNetModel/config.json", local_dir="./checkpoints")
hf_hub_download(repo_id="InstantX/InstantID", filename="ControlNetModel/diffusion_pytorch_model.safetensors", local_dir="./checkpoints")
hf_hub_download(repo_id="InstantX/InstantID", filename="ip-adapter.bin", local_dir="./checkpoints")
次に、以下のURLから、「antelopev2」をダウンロードし、中身のファイルをすべて「InstantID/antelopev2」のフォルダ内に置きましょう。
参考記事:https://drive.google.com/file/d/18wEUfMNohBJ4K3Ly5wpTejPfDzp-8fI8/view
一部ですが、最終的に、以下のようなフォルダ構成になっています。
.
├── models
├── checkpoints
├── ip_adapter
├── pipeline_stable_diffusion_xl_instantid.py
└── README.md
次に、以下のコードを実行して、モデルのロードをしましょう。
import diffusers
from diffusers.utils import load_image
from diffusers.models import ControlNetModel
import cv2
import torch
import numpy as np
from PIL import Image
from insightface.app import FaceAnalysis
from pipeline_stable_diffusion_xl_instantid import StableDiffusionXLInstantIDPipeline, draw_kps
# prepare 'antelopev2' under ./models
app = FaceAnalysis(name='antelopev2', root='./', providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
# prepare models under ./checkpoints
face_adapter = f'./checkpoints/ip-adapter.bin'
controlnet_path = f'./checkpoints/ControlNetModel/'
# load IdentityNet
controlnet = ControlNetModel.from_pretrained(controlnet_path, torch_dtype=torch.float16, device_map="auto")
pipe = StableDiffusionXLInstantIDPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", controlnet=controlnet, torch_dtype=torch.float16, device_map="auto")
#pipe.cuda()
# load adapter
pipe.load_ip_adapter_instantid(face_adapter)
最後に、以下のコードを実行して、実際に動かしてみましょう。
# load an image
image = load_image("your-example.jpg")
# prepare face emb
face_info = app.get(cv2.cvtColor(np.array(face_image), cv2.COLOR_RGB2BGR))
face_info = sorted(face_info, key=lambda x:(x['bbox'][2]-x['bbox'][0])*x['bbox'][3]-x['bbox'][1])[-1] # only use the maximum face
face_emb = face_info['embedding']
face_kps = draw_kps(face_image, face_info['kps'])
pipe.set_ip_adapter_scale(0.8)
prompt = "analog film photo of a man. faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage, masterpiece, best quality"
negative_prompt = "(lowres, low quality, worst quality:1.2), (text:1.2), watermark, painting, drawing, illustration, glitch, deformed, mutated, cross-eyed, ugly, disfigured (lowres, low quality, worst quality:1.2), (text:1.2), watermark, painting, drawing, illustration, glitch,deformed, mutated, cross-eyed, ugly, disfigured"
# generate image
image = pipe(
prompt, image_embeds=face_emb, image=face_kps, controlnet_conditioning_scale=0.8).images[0]
ここでは、以下の画像を用いて、モデルを動かしてみます。
プロンプトは以下の通りです。
analog film photo of a man. faded film, desaturated, 35mm photo, grainy, vignette, vintage, Kodachrome, Lomography, stained, highly detailed, found footage, masterpiece, best quality
和訳:
色あせたフィルム, 彩度落ち, 35mm 写真, 粒状, ビネット, ヴィンテージ, コダクローム, ロモグラフィー, ステイン, 高精細, ファウンド・フッテージ, 傑作, 最高品質.
結果は以下の通りです。
お次はメガネを外してもらいましょう。結果は以下の通りです。
メガネが外れていないですね、、、
InstantIDを動かすのに必要なPCのスペック
■Pythonのバージョン
Python 3.8以上
■使用ディスク量
3.16GB
■RAMの使用量
2.8GB
なお、簡単に画像内の人物に着せ替えできるAIについて詳しく知りたい方は、下記の記事を合わせてご確認ください。
→【PhotoMaker】LoRA不要、わずか数秒、顔を保持したまま画像を自由に着せ替えできるAIを使ってみた
InstantIDで著名人をアメリカの高校生にしてみた
ここでは、「サムアルトマン」と「イーロンマスク」に、以下の9人のアメリカの高校生に生まれ変わってもらいましょう。
- ラグビー部
- ギーク
- パンクバンドオタク
- チア
- カントリー系女子
- 優等生
- 卒業アルバム
- ドラマの主人公
- 不良
まずはサムアルトマン。
続いて、イーロンマスク。
今回は「American high school student ~」というプロンプトを設定しているだけなので、もう少しプロンプト設計すれば、より高度なスタイル変換が可能になるでしょう。
なお、1枚の画像を3Dに変換できるAIについて知りたい方はこちらの記事をご覧ください。
→【DreamGaussian】必要なのは1枚の画像、1分で3D画像を作る画像生成AIの使い方やインストール方法
まとめ
InstantIDは、1枚の画像を入力するだけで、その画像を様々なスタイルに変換することができるAIツールです。本ツールを用いることで、入力画像を、好みの画像に編集することができます。
より精巧なプロンプト設計で、より高度なスタイル変換が可能になるでしょう。
数年後には、過去の写真に写った自分の服装や表情を、自由に編集できるようになっているのかもしれないですね。
将来的には、このような技術と動画生成・3D技術を組み合わせることで、より高度なコンテンツ作成が可能になるでしょう。また、本格的にディープフェイクのリスクも、高まってくると思います。
Xでは、ComfyUIでInstantIDのワークフローを用いて、自分の顔をアニメの絵に合わせて遊んでいる人もいました。
生成系AIの業務活用なら!
・生成系AIを活用したPoC開発
・生成系AIのコンサルティング
・システム間API連携