【InstantID】マルチバースの人物画像を生成できるAIで有名人をアメリカの高校生にしてみた

マルチバース 画像 生成 AI

WEELメディア事業部LLMリサーチャーの中田です。

1月15日、入力された画像を様々なスタイルに変換できる「InstantID」が公開されました。

この手法を用いることで、1枚の画像を入力するだけで、様々なスタイルに編集できるんです、、、!

参考:https://www.youtube.com/watch?v=EZPhjPnrlPI

InstantIDのGitHubでのスター数は、すでに7000を超えており、注目度の高さがうかがえます。

この記事ではInstantIDの使い方や、有効性の検証まで行います。本記事を熟読することで、InstantIDの凄さを実感し、ただの画像編集AIには戻れなくなるでしょう。

ぜひ、最後までご覧ください。

なお弊社では、生成AIツール開発についての無料相談を承っています。こちらからお気軽にご相談ください。
→無料相談で話を聞いてみる

目次

InstantIDの概要

InstantIDは、1枚の画像を入力するだけで、その画像を様々なスタイルに変換することができるAIツールです。ControlNetと同じような効果を持ちます。

参考:https://instantid.github.io/

上記の様に、左端の入力画像をもとにStyle 1~Style 8まで、幅広くスタイル変換できるのです。

以下の図は、InstantIDのモデル構造です。

参考:https://instantid.github.io/

本モデルにおける以下の3つの重要な要素で、顔やテキストの情報を処理しています。

  • 顔の詳細情報を埋め込むFace Encoder
  • Face EmbeddingとText Embeddingを通す2つのクロスアテンション
  • 目や鼻の位置など顔の特徴(landmarks)を抽出するIdentityNet

上記の3つの要素で「顔」と「テキストプロンプト」の情報を処理し、拡散モデル(UNet)に送り込みます。そして、その情報をもとに、拡散モデルが画像を生成するのです。

また、UNet自体は学習しないので、もともとのText-Imageの生成能力を維持でき、既存の学習済みモデルやControlNetsと互換性があるそうです。さらに、テスト時のチューニングを必要としないので、特定のテキストに対して、微調整のために複数の画像を収集する必要がなく、1つの画像を1回推論するだけで済むそう。

こうすることで、以下のように、1つの画像を様々なスタイルに変換できるのです。

参考:https://instantid.github.io/

なお、ControlNetも利用できるWebUI版のStable Diffusionについて知りたい方はこちらの記事をご覧ください。
【Stable Diffusion WebUI Forge】省エネ・高速・高解像度の画像生成モデルを使ってみた

InstantIDのライセンス

Apache License 2.0の下、誰でも無償で商用利用することが可能です。

利用用途可否
商用利用⭕️
改変⭕️
配布⭕️
特許使用⭕️
私的使用⭕️
参考:https://github.com/InstantID/InstantID/blob/main/LICENSE

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のワークフローを用いて、自分の顔をアニメの絵に合わせて遊んでいる人もいました。

サービス紹介資料

【無料】2023年2月版生成系AIの業務活用なら!

・生成系AIを活用したPoC開発

・生成系AIの業務活用コンサルティング

・システム間API連携

サービス紹介資料

生成系AIの業務活用なら!

・生成系AIを活用したPoC開発

・生成系AIのコンサルティング

・システム間API連携

投稿者

  • 中田

    データサイエンス専攻の大学院生。大学では、生成系AIの拡散モデルを用いた音楽生成について研究。 趣味は作曲、サッカー、コーヒー。

  • URLをコピーしました!
  • URLをコピーしました!
目次