Dmitry1313 commited on
Commit
f9ead66
·
verified ·
1 Parent(s): 7992388

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +29 -15
app.py CHANGED
@@ -1,23 +1,34 @@
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():
@@ -27,9 +38,8 @@ async def health():
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")
@@ -42,27 +52,32 @@ async def swap_face(source: UploadFile = File(...), target: UploadFile = File(..
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
 
@@ -75,5 +90,4 @@ async def swap_face(source: UploadFile = File(...), target: UploadFile = File(..
75
  logger.exception("Ошибка при обработке")
76
  raise HTTPException(status_code=500, detail=str(e))
77
  finally:
78
- # Удаляем временные файлы
79
  shutil.rmtree(temp_dir, ignore_errors=True)
 
1
  #!/usr/bin/env python3
2
+ """FaceFusion API для Hugging Face Spaces — МАКСИМАЛЬНАЯ КОНФИГУРАЦИЯ"""
3
 
4
  import os
5
  import tempfile
6
  import subprocess
7
  import logging
 
 
8
  import shutil
9
  import uuid
10
+ from fastapi import FastAPI, File, UploadFile, HTTPException
11
+ from fastapi.responses import Response
12
 
13
  logging.basicConfig(level=logging.INFO, format='%(levelname)s:%(message)s')
14
  logger = logging.getLogger(__name__)
15
 
16
+ app = FastAPI(title="FaceFusion API - Maximum Quality")
17
 
18
+ # Путь к FaceFusion
19
  FACEFUSION_DIR = "/facefusion"
20
+ FACEFUSION_SCRIPT = os.path.join(FACEFUSION_DIR, "facefusion.py")
21
+
22
+ # Определяем доступные провайдеры выполнения (GPU, если есть)
23
+ EXECUTION_PROVIDERS = ["CUDAExecutionProvider", "CPUExecutionProvider"] # ZeroGPU даст CUDA
24
+
25
+ # Максимальная конфигурация
26
+ FACE_SWAPPER_MODEL = "ghost_3_256" # лучшая замена лица
27
+ FACE_ENHANCER_MODEL = "codeformer" # улучшение лица с сохранением черт
28
+ FACE_ENHANCER_BLEND = 80 # вес улучшения (0-100)
29
+ FACE_MASK_TYPES = ["box", "occlusion", "region"] # все доступные маски
30
+ FACE_MASK_BLUR = 0.7 # размытие границ маски
31
+ OUTPUT_IMAGE_RESOLUTION = 1024 # выходное разрешение
32
 
33
  @app.get("/health")
34
  async def health():
 
38
  async def swap_face(source: UploadFile = File(...), target: UploadFile = File(...)):
39
  """
40
  Принимает два изображения: source (фото с лицом) и target (целевое изображение).
41
+ Возвращает обработанное изображение с максимальным качеством.
42
  """
 
43
  temp_dir = tempfile.mkdtemp()
44
  source_path = os.path.join(temp_dir, f"source_{uuid.uuid4().hex}.jpg")
45
  target_path = os.path.join(temp_dir, f"target_{uuid.uuid4().hex}.jpg")
 
52
  with open(target_path, "wb") as f:
53
  f.write(await target.read())
54
 
55
+ # Формируем команду с максимальными параметрами
 
 
56
  cmd = [
57
  "python", FACEFUSION_SCRIPT,
58
  "--source", source_path,
59
  "--target", target_path,
60
  "--output", output_path,
61
+ "--face-swapper-model", FACE_SWAPPER_MODEL,
62
+ "--face-enhancer-model", FACE_ENHANCER_MODEL,
63
+ "--face-enhancer-blend", str(FACE_ENHANCER_BLEND),
64
+ "--face-mask-types", *FACE_MASK_TYPES,
65
+ "--face-mask-blur", str(FACE_MASK_BLUR),
66
+ "--output-image-resolution", str(OUTPUT_IMAGE_RESOLUTION),
67
+ "--execution-providers", *EXECUTION_PROVIDERS,
68
+ "--headless"
69
  ]
70
+
71
  logger.info(f"Запуск команды: {' '.join(cmd)}")
72
  result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
73
+
74
  if result.returncode != 0:
75
  logger.error(f"FaceFusion ошибка: {result.stderr}")
76
  raise HTTPException(status_code=500, detail="FaceFusion processing failed")
77
 
 
78
  if not os.path.exists(output_path):
79
  raise HTTPException(status_code=500, detail="Output file not created")
80
 
 
81
  with open(output_path, "rb") as f:
82
  image_data = f.read()
83
 
 
90
  logger.exception("Ошибка при обработке")
91
  raise HTTPException(status_code=500, detail=str(e))
92
  finally:
 
93
  shutil.rmtree(temp_dir, ignore_errors=True)