|
|
| import os |
| import cv2 |
| from insightface.app import FaceAnalysis |
| from insightface.model_zoo import get_model |
| from gfpgan import GFPGANer |
|
|
| app = None |
| swapper = None |
| enhancer = None |
|
|
| def setup_models(execution_provider="cpu"): |
| global app, swapper, enhancer |
|
|
| if app is None: |
| app = FaceAnalysis(name="buffalo_l", providers=[execution_provider]) |
| app.prepare(ctx_id=0, det_size=(640, 640)) |
|
|
| if swapper is None: |
| model_path = "models/inswapper_128.onnx" |
| swapper = get_model(model_path, providers=[execution_provider]) |
|
|
| if enhancer is None: |
| enhancer = GFPGANer( |
| model_path="gfpgan/weights/GFPGANv1.4.pth", |
| upscale=1, |
| arch="clean", |
| channel_multiplier=2, |
| bg_upsampler=None, |
| device="cuda" if execution_provider == "cuda" else "cpu" |
| ) |
|
|
| def run_swap(target_path, source_path, output_path, execution_provider="cpu", frame_processors=["face_swapper"]): |
| setup_models(execution_provider) |
|
|
| target_img = cv2.imread(target_path) |
| source_img = cv2.imread(source_path) |
|
|
| if target_img is None or source_img is None: |
| print("❌ No se pudieron cargar las imágenes.") |
| return False |
|
|
| target_faces = app.get(target_img) |
| source_faces = app.get(source_img) |
|
|
| if len(target_faces) == 0 or len(source_faces) == 0: |
| print("⚠️ No se detectaron rostros.") |
| return False |
|
|
| source_face = source_faces[0] |
|
|
| for face in target_faces: |
| target_img = swapper.get(target_img, face, source_face, paste_back=True) |
|
|
| if "face_enhancer" in frame_processors: |
| h, w = target_img.shape[:2] |
| _, _, enhanced_img = enhancer.enhance( |
| target_img, |
| has_aligned=False, |
| only_center_face=False |
| ) |
| |
| target_img = cv2.resize(enhanced_img, (w, h), interpolation=cv2.INTER_CUBIC) |
|
|
| cv2.imwrite(output_path, target_img) |
| return True |
|
|