sang1231's picture
Update app.py
891a678 verified
# TÊN TỆP: app.py (Mã đã được dọn dẹp và sử dụng cache)
import gradio as gr
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
import os
import urllib.request
import ssl
# --- SỬA LỖI: CÀI ĐẶT ĐƯỜNG DẪN MÔ HÌNH THỦ CÔNG ---
# Thiết lập ngữ cảnh SSL cho tải xuống
ssl._create_default_https_context = ssl._create_unverified_context
MODEL_NAME = 'inswapper_128.onnx'
# URL đã được xác nhận hoạt động trên Hugging Face
MODEL_URL = 'https://huggingface.co/xingren23/comfyflow-models/resolve/976de8449674de379b02c144d0b3cfa2b61482f2/insightface/inswapper_128.onnx'
# Thư mục cache mặc định của InsightFace
cache_dir = os.path.join(os.path.expanduser('~'), '.insightface', 'models')
os.makedirs(cache_dir, exist_ok=True)
MODEL_PATH = os.path.join(cache_dir, MODEL_NAME)
# Hàm Tải Mô hình Bằng Tay (để đảm bảo tệp tồn tại)
def download_model(url, path):
if not os.path.exists(path):
print(f"Downloading {os.path.basename(path)} from {url} to {path}...")
try:
# Tải tệp vào thư mục cache chính xác
urllib.request.urlretrieve(url, path)
print(f"Successfully downloaded {os.path.basename(path)}.")
except Exception as e:
print(f"FATAL ERROR: Failed to download model {os.path.basename(path)}: {e}")
raise e
return path
# TẢI MÔ HÌNH VÀO THƯ MỤC INSIGHTFACE CHUẨN
local_model_path = download_model(MODEL_URL, MODEL_PATH)
# --- KHỞI TẠO ỨNG DỤNG ---
try:
# Tải mô hình Face Analysis
app = FaceAnalysis(
name='buffalo_l',
providers=['CPUExecutionProvider']
)
app.prepare(ctx_id=0, det_size=(640, 640))
# Tải mô hình Face Swapper bằng đường dẫn cục bộ đã tải
# SỬA LỖI: Chỉ định đường dẫn mô hình (local_model_path)
swapper = insightface.model_zoo.get_model(local_model_path, providers=['CPUExecutionProvider'])
except Exception as e:
print(f"FATAL ERROR during model initialization: {e}")
raise e
# HÀM HOÁN ĐỔI KHUÔN MẶT THỰC TẾ
def face_swap_function(source_path, target_path):
# ... (Giữ nguyên logic hàm)
try:
img_source = cv2.imread(source_path)
img_target = cv2.imread(target_path)
except Exception:
return cv2.cvtColor(np.zeros((200, 200, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
if img_source is None or img_target is None:
return cv2.cvtColor(np.zeros((200, 200, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
faces_source = app.get(img_source)
if not faces_source:
return cv2.cvtColor(img_target, cv2.COLOR_BGR2RGB)
source_face = faces_source[0]
faces_target = app.get(img_target)
if not faces_target:
return cv2.cvtColor(img_target, cv2.COLOR_BGR2RGB)
target_face = faces_target[0]
result_img = swapper.get(img_target, target_face, source_face, paste_back=True)
return cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB)
# TẠO GIAO DIỆN GRADIO
demo = gr.Interface(
fn=face_swap_function,
inputs=[
gr.Image(type="filepath", label="Ảnh Nguồn (Khuôn mặt bạn muốn dùng)"),
gr.Image(type="filepath", label="Ảnh Đích (Khuôn mặt bạn muốn thay thế)")
],
outputs=gr.Image(type="numpy", label="Kết quả Hoán đổi Khuôn mặt (Face Swap)"),
title="Ứng dụng Hoán đổi Khuôn mặt INSIGHTFACE Hoàn chỉnh"
)
# Chạy ứng dụng
demo.launch()