Deep_Fake_Lote / app.py
YepoHz's picture
Create app.py
5cc95c0
import os
import shutil
import zipfile
from PIL import Image
import gradio as gr
import uuid
import subprocess
# Directorios
INPUT_DIR = "batch_images"
OUTPUT_DIR = "batch_results"
RESULTS_DIR = "comparaciones"
os.makedirs(INPUT_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(RESULTS_DIR, exist_ok=True)
def face_swap_batch(rb_img, lote_imgs):
# Limpiar directorios
shutil.rmtree(INPUT_DIR, ignore_errors=True)
shutil.rmtree(OUTPUT_DIR, ignore_errors=True)
shutil.rmtree(RESULTS_DIR, ignore_errors=True)
os.makedirs(INPUT_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(RESULTS_DIR, exist_ok=True)
# Guardar imagen de rostro base
rb_path = os.path.join(INPUT_DIR, "RB.jpg")
rb_img.save(rb_path)
# Guardar imágenes por lote
img_paths = []
for i, img in enumerate(lote_imgs):
name = f"img_{i}.jpg"
path = os.path.join(INPUT_DIR, name)
img.save(path)
img_paths.append(path)
# Procesar imágenes con Roop
for path in img_paths:
filename = os.path.basename(path)
output_img = os.path.join(OUTPUT_DIR, f"swapped_{filename}")
subprocess.run([
"python", "run.py",
"-s", rb_path,
"-t", path,
"-o", output_img,
"--execution-provider", "cpu",
"--frame-processor", "face_swapper", "face_enhancer"
])
# Crear comparaciones lado a lado
resultados = []
for path in img_paths:
filename = os.path.basename(path)
original = Image.open(path).resize((256, 256))
generado_path = os.path.join(OUTPUT_DIR, f"swapped_{filename}")
if not os.path.exists(generado_path):
continue
generado = Image.open(generado_path).resize((256, 256))
combinado = Image.new("RGB", (512, 256))
combinado.paste(original, (0, 0))
combinado.paste(generado, (256, 0))
out_path = os.path.join(RESULTS_DIR, f"comparado_{filename}")
combinado.save(out_path)
resultados.append(out_path)
# Descarga
if len(resultados) == 1:
return resultados[0]
else:
zip_path = f"resultados_{uuid.uuid4().hex[:6]}.zip"
with zipfile.ZipFile(zip_path, 'w') as zipf:
for file in resultados:
zipf.write(file, os.path.basename(file))
return zip_path
# Interfaz Gradio
gr.Interface(
fn=face_swap_batch,
inputs=[
gr.Image(label="🧠 Rostro base", type="pil"),
gr.File(label="🖼️ Imágenes por lote", file_types=["image"], file_count="multiple")
],
outputs=gr.File(label="📦 Descargar ZIP o imagen"),
title="Deep Fake Lote - Yepo Hz",
description="Sube una imagen de rostro base y varias imágenes objetivo. El sistema aplicará el cambio de rostro en lote. Resultado visual lado a lado."
).launch()