my3 / app.py
AkashKumarave's picture
Update app.py
24da2db verified
raw
history blame
3.46 kB
import cv2
import torch
import numpy as np
import gradio as gr
from diffusers import StableDiffusionXLPipeline
from insightface.app import FaceAnalysis
from accelerate import init_empty_weights, load_checkpoint_and_dispatch
import os
import urllib.request
# Force offline mode for Hugging Face Hub (but allow InsightFace download)
os.environ["HF_HUB_OFFLINE"] = "1"
# Set device to CPU
device = "cpu"
dtype = torch.float32
# Set up InsightFace model directory
insightface_model_dir = "/home/user/.insightface/models/buffalo_l"
os.makedirs(insightface_model_dir, exist_ok=True)
buffalo_l_zip = "./buffalo_l.zip"
# Download buffalo_l.zip if not present
if not os.path.exists(buffalo_l_zip):
try:
print("Downloading buffalo_l.zip for InsightFace...")
urllib.request.urlretrieve(
"https://github.com/deepinsight/insightface/releases/download/v0.7/buffalo_l.zip",
buffalo_l_zip
)
print("Download completed.")
except Exception as e:
print(f"Failed to download buffalo_l.zip: {e}")
raise RuntimeError("Cannot download buffalo_l.zip. Please ensure network access.")
# Extract buffalo_l.zip
if os.path.exists(buffalo_l_zip):
import zipfile
with zipfile.ZipFile(buffalo_l_zip, "r") as zip_ref:
zip_ref.extractall(insightface_model_dir)
print("Extracted buffalo_l.zip.")
# Load face encoder
face_app = FaceAnalysis(providers=["CPUExecutionProvider"], root="/home/user/.insightface/models")
face_app.prepare(ctx_id=0, det_size=(480, 480))
# Define paths for preloaded weights
model_path = "./unet/" # Adjusted for preloaded Kolors weights
ip_adapter_path = "./"
# Check if Kolors weights exist, download if missing
kolors_weights = model_path + "diffusion_pytorch_model.safetensors"
if not os.path.exists(model_path):
os.makedirs(model_path, exist_ok=True)
if not os.path.exists(kolors_weights):
try:
print("Downloading Kolors model weights...")
urllib.request.urlretrieve(
"https://huggingface.co/Kwai-Kolors/Kolors-diffusers/resolve/main/unet/diffusion_pytorch_model.safetensors",
kolors_weights
)
print("Kolors weights downloaded.")
except Exception as e:
print(f"Failed to download Kolors weights: {e}")
raise RuntimeError("Cannot download Kolors weights. Please ensure network access.")
# Check if IP-Adapter weights exist
if not os.path.exists(ip_adapter_path + "ip-adapter.bin"):
raise FileNotFoundError(f"IP-Adapter weights not found at {ip_adapter_path}")
# Initialize model with empty weights
with init_empty_weights():
pipe = StableDiffusionXLPipeline.from_pretrained(
"Kwai-Kolors/Kolors-diffusers",
torch_dtype=dtype,
safety_checker=None,
)
# Load and dispatch model with accelerate
pipe = load_checkpoint_and_dispatch(pipe, model_path, device_map="cpu", offload_folder=None)
pipe.load_ip_adapter("h94/IP-Adapter-FaceID-Plus-SDXL", subfolder=None, weight_name="ip-adapter.bin")
def generate_image(uploaded_image, prompt):
img = cv2.cvtColor(np.array(uploaded_image), cv2.COLOR_RGB2BGR)
faces = face_app.get(img)
if not faces:
return "No face detected!", None
face_info = faces[-1]
face_emb = face_info["embedding"]
try:
image = pipe(
prompt=prompt,
image_embeds=face_emb,
num_inference_steps=20,
guidance_scale=7.5,
height=512,