print(f"已生成:{name}")
import torch
import cv2
import numpy as np
from diffusers import StableDiffusionXLInstantIDPipeline
from insightface.app import FaceAnalysis
app = FaceAnalysis(name='antelopev2', providers=['CUDAExecutionProvider'])
app.prepare(ctx_id=0)
pipe = StableDiffusionXLInstantIDPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
controlnet="./checkpoints/ControlNetModel",
torch_dtype=torch.float16
).to("cuda")
pipe.load_ip_adapter_instantid("./checkpoints/ip-adapter.bin")
def generate(face_image, prompt, negative_prompt, strength, steps):
# 转换为 cv2 格式
face_cv = cv2.cvtColor(np.array(face_image), cv2.COLOR_RGB2BGR)
# 获取人脸信息
faces = app.get(face_cv)
if len(faces) == 0:
return None, "No face detected!"
face_info = faces[0]
face_emb = face_info.normed_embedding
face_kps = face_info.kps
# 生成
image = pipe(
os.makedirs("./variations", exist_ok=True)
negative_prompt=negative_prompt,
face_emb=face_emb,
face_kps=face_kps,
ip_adapter_scale=strength,
num_inference_steps=steps
).images[0]
return image, "Success!"
demo = gr.Interface(
fn=generate,
inputs=[
gr.Image(type="pil", label="Reference Face"),
gr.Textbox(label="Prompt", value="professional portrait"),
gr.Textbox(label="反向提示", value="丑陋,模糊"),
gr.Slider(0.1, 1.0, value=0.8, label="Identity Strength"),
gr.Slider(10, 50, value=30, step=1, label="步数")
],
outputs=[
gr.Image(label="Generated Image"),
gr.Textbox(label="Status")
],
title="InstantID - Identity Preserving Generation"
)
demo.launch(server_name="0.0.0.0", server_port=7860)