Spaces:
Sleeping
Sleeping
from fastapi import FastAPI, File, UploadFile, HTTPException | |
from fastapi.responses import JSONResponse | |
import cv2 | |
import numpy as np | |
import insightface | |
from insightface.app import FaceAnalysis | |
import uvicorn | |
import logging | |
import base64 | |
# Configurar logging | |
logging.basicConfig(level=logging.INFO) | |
app = FastAPI() | |
face_app = FaceAnalysis(name='buffalo_l') | |
face_app.prepare(ctx_id=0, det_size=(640, 640)) | |
# Carga el modelo desde la carpeta 'models' | |
swapper = insightface.model_zoo.get_model('models/inswapper_128.onnx', download=False, download_zip=False) | |
def process_images(image1_bytes: bytes, image2_bytes: bytes): | |
# Convertir bytes a imágenes con OpenCV | |
nparr1 = np.frombuffer(image1_bytes, np.uint8) | |
img1 = cv2.imdecode(nparr1, cv2.IMREAD_COLOR) | |
nparr2 = np.frombuffer(image2_bytes, np.uint8) | |
img2 = cv2.imdecode(nparr2, cv2.IMREAD_COLOR) | |
if img1 is None or img2 is None: | |
raise ValueError("Error al decodificar una de las imágenes.") | |
# Detección de rostros | |
faces1 = face_app.get(img1) | |
faces2 = face_app.get(img2) | |
if not faces1 or not faces2: | |
raise ValueError("No se detectó ningún rostro en una o ambas imágenes.") | |
# Usar el primer rostro detectado en cada imagen | |
face1 = faces1[0] | |
face2 = faces2[0] | |
# Realizar el intercambio de rostros | |
img1_swap = swapper.get(img1, face1, face2, paste_back=True) | |
img2_swap = swapper.get(img2, face2, face1, paste_back=True) | |
return img1_swap, img2_swap | |
def image_to_base64(image) -> str: | |
# Codificar la imagen a JPEG y luego a base64 | |
success, buffer = cv2.imencode(".jpg", image) | |
if not success: | |
raise ValueError("No se pudo codificar la imagen.") | |
return base64.b64encode(buffer).decode("utf-8") | |
async def swap_faces(image1: UploadFile = File(...), image2: UploadFile = File(...)): | |
""" | |
Endpoint que recibe dos imágenes por POST y devuelve un JSON con las imágenes | |
con los rostros intercambiados codificadas en base64. | |
""" | |
try: | |
# Leer los archivos | |
image1_bytes = await image1.read() | |
image2_bytes = await image2.read() | |
# Procesar las imágenes | |
img1_swap, img2_swap = process_images(image1_bytes, image2_bytes) | |
# Convertir imágenes a base64 | |
result = { | |
"image1": image_to_base64(img1_swap), | |
"image2": image_to_base64(img2_swap) | |
} | |
return JSONResponse(content=result) | |
except Exception as e: | |
logging.exception("Error al procesar las imágenes") | |
raise HTTPException(status_code=500, detail=str(e)) | |
if __name__ == "__main__": | |
uvicorn.run(app, host="0.0.0.0", port=7860) | |