Dmitry1313 commited on
Commit
3d18490
·
verified ·
1 Parent(s): eec700c

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +79 -0
app.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """FaceFusion API для Hugging Face Spaces — использует FaceFusion для замены лиц"""
3
+
4
+ import os
5
+ import tempfile
6
+ import subprocess
7
+ import logging
8
+ from fastapi import FastAPI, File, UploadFile, HTTPException
9
+ from fastapi.responses import Response
10
+ import shutil
11
+ import uuid
12
+
13
+ logging.basicConfig(level=logging.INFO, format='%(levelname)s:%(message)s')
14
+ logger = logging.getLogger(__name__)
15
+
16
+ app = FastAPI(title="FaceFusion API")
17
+
18
+ # Путь, куда будет установлен FaceFusion (внутри контейнера)
19
+ FACEFUSION_DIR = "/facefusion"
20
+ FACEFUSION_SCRIPT = os.path.join(FACEFUSION_DIR, "facefusion.py") # может отличаться
21
+
22
+ @app.get("/health")
23
+ async def health():
24
+ return {"status": "ok"}
25
+
26
+ @app.post("/swap")
27
+ async def swap_face(source: UploadFile = File(...), target: UploadFile = File(...)):
28
+ """
29
+ Принимает два изображения: source (фото с лицом) и target (целевое изображение).
30
+ Возвращает обработанное изображение с заменённым лицом.
31
+ """
32
+ # Создаём временные файлы
33
+ temp_dir = tempfile.mkdtemp()
34
+ source_path = os.path.join(temp_dir, f"source_{uuid.uuid4().hex}.jpg")
35
+ target_path = os.path.join(temp_dir, f"target_{uuid.uuid4().hex}.jpg")
36
+ output_path = os.path.join(temp_dir, f"output_{uuid.uuid4().hex}.jpg")
37
+
38
+ try:
39
+ # Сохраняем загруженные файлы
40
+ with open(source_path, "wb") as f:
41
+ f.write(await source.read())
42
+ with open(target_path, "wb") as f:
43
+ f.write(await target.read())
44
+
45
+ # Запускаем FaceFusion
46
+ # Предполагается, что facefusion.py принимает аргументы:
47
+ # --source SOURCE --target TARGET --output OUTPUT [другие параметры]
48
+ cmd = [
49
+ "python", FACEFUSION_SCRIPT,
50
+ "--source", source_path,
51
+ "--target", target_path,
52
+ "--output", output_path,
53
+ "--headless" # если есть такой флаг
54
+ ]
55
+ logger.info(f"Запуск команды: {' '.join(cmd)}")
56
+ result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
57
+ if result.returncode != 0:
58
+ logger.error(f"FaceFusion ошибка: {result.stderr}")
59
+ raise HTTPException(status_code=500, detail="FaceFusion processing failed")
60
+
61
+ # Проверяем, создался ли выходной файл
62
+ if not os.path.exists(output_path):
63
+ raise HTTPException(status_code=500, detail="Output file not created")
64
+
65
+ # Читаем и возвращаем результат
66
+ with open(output_path, "rb") as f:
67
+ image_data = f.read()
68
+
69
+ return Response(content=image_data, media_type="image/jpeg")
70
+
71
+ except subprocess.TimeoutExpired:
72
+ logger.error("FaceFusion превысил лимит времени")
73
+ raise HTTPException(status_code=504, detail="Processing timeout")
74
+ except Exception as e:
75
+ logger.exception("Ошибка при обработке")
76
+ raise HTTPException(status_code=500, detail=str(e))
77
+ finally:
78
+ # Удаляем временные файлы
79
+ shutil.rmtree(temp_dir, ignore_errors=True)