ReFaceX-API / app.py
kiddobellamy's picture
Upload 4 files
8e133a3 verified
raw
history blame
2.78 kB
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")
@app.post("/swap_faces")
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)