svjack's picture
Create app.py
00e256c verified
import os
from datasets import load_dataset
import uuid
import numpy as np
import cv2
import gradio as gr
from huggingface_hub import snapshot_download
from insightface.app import FaceAnalysis
from PIL import Image
import json
# 定义保存路径
save_path = "./examples/xiangxiang_man"
# 清空目标路径(如果存在)
if os.path.exists(save_path):
for file_name in os.listdir(save_path):
file_path = os.path.join(save_path, file_name)
if os.path.isfile(file_path):
os.remove(file_path)
print(f"Cleared existing files in {save_path}")
else:
os.makedirs(save_path, exist_ok=True)
print(f"Created directory: {save_path}")
# 加载数据集
dataset = load_dataset("svjack/Prince_Xiang_iclight_v2")
# 遍历数据集并保存图片
for example in dataset["train"]:
# 获取图片数据
image = example["image"]
# 生成唯一的文件名(使用 uuid)
file_name = f"{uuid.uuid4()}.png"
file_path = os.path.join(save_path, file_name)
# 保存图片
image.save(file_path)
print(f"Saved {file_path}")
print("All images have been saved.")
# Download face encoder
snapshot_download(
"fal/AuraFace-v1",
local_dir="models/auraface",
)
# Initialize FaceAnalysis
app = FaceAnalysis(
name="auraface",
providers=["CUDAExecutionProvider", "CPUExecutionProvider"],
root=".",
)
app.prepare(ctx_id=0, det_size=(640, 640))
def get_embedding(image):
"""
Get the embedding of a single image.
Parameters:
- image: PIL Image object.
Returns:
- A numpy array representing the embedding of the face in the image.
"""
# Convert PIL image to OpenCV format
cv2_image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
# Get face information
face_info = app.get(cv2_image)
if len(face_info) > 0:
# Return the embedding of the first detected face
return face_info[0].normed_embedding.tolist() # Convert to list
else:
return None
def display_embedding(image):
"""
Display the embedding of a single image as a JSON object.
Parameters:
- image: PIL Image object.
Returns:
- A JSON object with the embedding (nested list) or an empty list if no face is detected.
"""
embedding = get_embedding(image)
if embedding is not None:
return json.dumps({"embedding": embedding}) # Wrap in a list and convert to JSON
else:
return json.dumps({"embedding": []}) # Return empty list as JSON
# 获取数据集中的图片路径
import pathlib
example_images = list(map(str, pathlib.Path(save_path).rglob("*.png")))
# 创建Gradio界面
iface = gr.Interface(
fn=display_embedding,
inputs=gr.Image(type="pil"),
outputs="json",
title="面部图片嵌入计算",
description="上传一张图片,计算其嵌入向量。",
examples=example_images[:3], # 使用数据集中的前3张图片作为示例
)
# 启动Gradio应用
iface.launch(share=True)