前回までの記事では h94/IP-Adapter というリポジトリの 顔モデル (ip-adapter-full-face_sd15) を使用していました。
本日は Hugging Face のドキュメント を少し進め、
h94/IP-Adapter-FaceID というリポジトリの ip-adapter-faceid_sd15 を使おうとしましたがエラーになってしまいました。
よって、本日の記事では、トラブルシューティング的な感じで進めていきます。
追記:
今回実行したかったコード
今回実行したかったコードは IP-Adapter FaceID モデル を使用したコードです。
To use IP-Adapter FaceID models, first extract face embeddings with insightface. Then pass the list of tensors to the pipeline as ip_adapter_image_embeds.
ということで、 IP-Adapter FaceID は insightface を使って顔を抽出し、 ip_adapter_image_embedes() を使う流れのようです。
なお以下のような記載がありましたので、非商用でしか使えないようです。
InsightFace の事前トレーニング済みモデルは非営利の研究目的で利用できるため、IP アダプター - FaceID モデルは研究目的のみにリリースされており、商業利用を目的としていません。
以下は、ドキュメントのスクリプトを未整形のままペタッとしたものです。
import torch from diffusers import StableDiffusionPipeline, DDIMScheduler from diffusers.utils import load_image from insightface.app import FaceAnalysis pipeline = StableDiffusionPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, ).to("cuda") pipeline.scheduler = DDIMScheduler.from_config(pipeline.scheduler.config) pipeline.load_ip_adapter("h94/IP-Adapter-FaceID", subfolder=None, weight_name="ip-adapter-faceid_sd15.bin", image_encoder_folder=None) pipeline.set_ip_adapter_scale(0.6) image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_mask_girl1.png") ref_images_embeds = [] app = FaceAnalysis(name="buffalo_l", providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) app.prepare(ctx_id=0, det_size=(640, 640)) image = cv2.cvtColor(np.asarray(image), cv2.COLOR_BGR2RGB) faces = app.get(image) image = torch.from_numpy(faces[0].normed_embedding) ref_images_embeds.append(image.unsqueeze(0)) ref_images_embeds = torch.stack(ref_images_embeds, dim=0).unsqueeze(0) neg_ref_images_embeds = torch.zeros_like(ref_images_embeds) id_embeds = torch.cat([neg_ref_images_embeds, ref_images_embeds]).to(dtype=torch.float16, device="cuda") generator = torch.Generator(device="cpu").manual_seed(42) images = pipeline( prompt="A photo of a girl", ip_adapter_image_embeds=[id_embeds], negative_prompt="monochrome, lowres, bad anatomy, worst quality, low quality", num_inference_steps=20, num_images_per_prompt=1, generator=generator ).images
エラー1
insightface
というモジュールが必要っぽい
対処法
pip install に insightface を追加する
- !pip install -U diffusers["torch"] transformers accelerate peft controlnet_aux + !pip install -U diffusers["torch"] transformers accelerate peft controlnet_aux insightface
エラー2
insightface
の中でonnxruntime
が怒られたっぽい
どうやら insightface の依存モジュールとして onnxruntime が必要のようです。
対処法
pip install に onnxruntime を追加する
- !pip install -U diffusers["torch"] transformers accelerate peft controlnet_aux insightface + !pip install -U diffusers["torch"] transformers accelerate peft controlnet_aux onnxruntime insightface
エラー3
/usr/local/lib/python3.10/dist-packages/diffusers/loaders/unet.py in _convert_ip_adapter_attn_to_diffusers(self, state_dicts, low_cpu_mem_usage) 854 else: 855 # IP-Adapter Plus --> 856 num_image_text_embeds += [state_dict["image_proj"]["latents"].shape[1]] 857 858 with init_context():
確かに IP-Adapter Plus のロード方法は別セクションで学べ。と記載されていた気がします。
Learn how to load an IP-Adapter in the Load adapters guide, and make sure you check out the IP-Adapter Plus section which requires manually loading the image encoder.
「アダプターのロード」ガイドで IP アダプターをロードする方法を学び、イメージ エンコーダーを手動でロードする必要がある IP アダプター プラスのセクションを必ず確認してください。
そのリンク先がこちら↓
とりあえず最小構成にしてやってみたが。。。
import torch from diffusers import StableDiffusionPipeline from transformers import CLIPVisionModelWithProjection image_encoder = CLIPVisionModelWithProjection.from_pretrained( "laion/CLIP-ViT-H-14-laion2B-s32B-b79K", torch_dtype=torch.float16, ) pipeline = StableDiffusionPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, image_encoder=image_encoder, ).to("cuda") pipeline.load_ip_adapter( "h94/IP-Adapter-FaceID", subfolder=None, weight_name="ip-adapter-faceid_sd15.bin", image_encoder_folder=None )
なんならドキュメント通り IP-Adapter FaceID Plus にしてもエラー
import torch from diffusers import StableDiffusionPipeline from transformers import CLIPVisionModelWithProjection image_encoder = CLIPVisionModelWithProjection.from_pretrained( "laion/CLIP-ViT-H-14-laion2B-s32B-b79K", torch_dtype=torch.float16, ) pipeline = StableDiffusionPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16, image_encoder=image_encoder, ).to("cuda") pipeline.load_ip_adapter( "h94/IP-Adapter-FaceID", subfolder=None, weight_name="ip-adapter-faceid-plus_sd15.bin" # ここを変えました。 )
まとめ
以下のような Issue を見つけたので次回もう少し追ってみます。
なお、自分が試している環境の diffusers は v0.27.2 でした。
$ pip list | grep diffusers diffusers 0.27.2