Spaces:
Sleeping
Sleeping
File size: 2,995 Bytes
00e256c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
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) |