chawin.chen commited on
Commit
f881fd0
·
1 Parent(s): 0cf41ef
Files changed (2) hide show
  1. api_routes.py +59 -1
  2. config.py +1 -1
api_routes.py CHANGED
@@ -8,6 +8,7 @@ import json
8
  import os
9
  import time
10
  import uuid
 
11
  from concurrent.futures import ThreadPoolExecutor
12
  from datetime import datetime
13
  from typing import Any, Dict, List, Optional
@@ -38,7 +39,7 @@ from config import logger, OUTPUT_DIR, IMAGES_DIR, DEEPFACE_AVAILABLE, \
38
  UPSCALE_SIZE, CLIP_AVAILABLE, REALESRGAN_MODEL, REMBG_AVAILABLE, \
39
  ANIME_STYLE_AVAILABLE, SAVE_QUALITY, \
40
  AUTO_INIT_ANALYZER, AUTO_INIT_GFPGAN, AUTO_INIT_DDCOLOR, \
41
- AUTO_INIT_REALESRGAN, \
42
  AUTO_INIT_REMBG, AUTO_INIT_ANIME_STYLE, RVM_AVAILABLE, AUTO_INIT_RVM, \
43
  FACE_SCORE_MAX_IMAGES, FEMALE_AGE_ADJUSTMENT, \
44
  FEMALE_AGE_ADJUSTMENT_THRESHOLD, CELEBRITY_SOURCE_DIR, \
@@ -3381,6 +3382,63 @@ async def manual_cleanup_images():
3381
  raise HTTPException(status_code=500, detail=f"手动清理任务执行失败: {str(e)}")
3382
 
3383
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3384
  @api_router.post("/celebrity/load", tags=["Face Recognition"])
3385
  @log_api_params
3386
  async def load_celebrity_database():
 
8
  import os
9
  import time
10
  import uuid
11
+ import subprocess
12
  from concurrent.futures import ThreadPoolExecutor
13
  from datetime import datetime
14
  from typing import Any, Dict, List, Optional
 
39
  UPSCALE_SIZE, CLIP_AVAILABLE, REALESRGAN_MODEL, REMBG_AVAILABLE, \
40
  ANIME_STYLE_AVAILABLE, SAVE_QUALITY, \
41
  AUTO_INIT_ANALYZER, AUTO_INIT_GFPGAN, AUTO_INIT_DDCOLOR, \
42
+ AUTO_INIT_REALESRGAN, MODELS_PATH, \
43
  AUTO_INIT_REMBG, AUTO_INIT_ANIME_STYLE, RVM_AVAILABLE, AUTO_INIT_RVM, \
44
  FACE_SCORE_MAX_IMAGES, FEMALE_AGE_ADJUSTMENT, \
45
  FEMALE_AGE_ADJUSTMENT_THRESHOLD, CELEBRITY_SOURCE_DIR, \
 
3382
  raise HTTPException(status_code=500, detail=f"手动清理任务执行失败: {str(e)}")
3383
 
3384
 
3385
+ def _extract_tar_archive(archive_path: str, target_dir: str) -> Dict[str, str]:
3386
+ """在独立线程中执行tar命令,避免阻塞事件循环。"""
3387
+ cmd = ["tar", "-xzf", archive_path, "-C", target_dir]
3388
+ cmd_display = " ".join(cmd)
3389
+ logger.info(f"开始执行解压命令: {cmd_display}")
3390
+ completed = subprocess.run(
3391
+ cmd, capture_output=True, text=True, check=False
3392
+ )
3393
+ if completed.returncode != 0:
3394
+ stderr = (completed.stderr or "").strip()
3395
+ raise RuntimeError(f"tar命令执行失败: {stderr or '未知错误'}")
3396
+ logger.info(f"解压命令执行成功: {cmd_display}")
3397
+ return {
3398
+ "command": cmd_display,
3399
+ "stdout": (completed.stdout or "").strip(),
3400
+ "stderr": (completed.stderr or "").strip(),
3401
+ }
3402
+
3403
+
3404
+ @api_router.post("/datasets/chinese-celeb/extract", tags=["系统管理"])
3405
+ @log_api_params
3406
+ async def extract_chinese_celeb_dataset():
3407
+ """
3408
+ 解压 MODELS_PATH 下的 chinese_celeb_dataset.tar.gz 到 /opt/data/chinese_celeb_dataset。
3409
+ """
3410
+ archive_path = os.path.join(MODELS_PATH, "chinese_celeb_dataset.tar.gz")
3411
+ target_dir = "/opt/data"
3412
+
3413
+ if not os.path.isfile(archive_path):
3414
+ raise HTTPException(status_code=404, detail=f"数据集文件不存在: {archive_path}")
3415
+
3416
+ try:
3417
+ os.makedirs(target_dir, exist_ok=True)
3418
+ except OSError as exc:
3419
+ logger.error(f"创建目标目录失败: {target_dir}, {exc}")
3420
+ raise HTTPException(status_code=500, detail=f"创建目标目录失败: {exc}")
3421
+
3422
+ loop = asyncio.get_event_loop()
3423
+ try:
3424
+ extract_result = await loop.run_in_executor(
3425
+ executor, _extract_tar_archive, archive_path, target_dir
3426
+ )
3427
+ except Exception as exc:
3428
+ logger.error(f"解压 chinese_celeb_dataset 失败: {exc}")
3429
+ raise HTTPException(status_code=500, detail=f"解压失败: {exc}")
3430
+
3431
+ return {
3432
+ "success": True,
3433
+ "message": "chinese_celeb_dataset 解压完成",
3434
+ "archive_path": archive_path,
3435
+ "target_dir": target_dir,
3436
+ "command": extract_result.get("command"),
3437
+ "stdout": extract_result.get("stdout"),
3438
+ "stderr": extract_result.get("stderr"),
3439
+ }
3440
+
3441
+
3442
  @api_router.post("/celebrity/load", tags=["Face Recognition"])
3443
  @log_api_params
3444
  async def load_celebrity_database():
config.py CHANGED
@@ -266,7 +266,7 @@ os.environ.setdefault("MODELSCOPE_CACHE", MODELSCOPE_CACHE_DIR)
266
  os.environ.setdefault("MODELSCOPE_HOME", MODELSCOPE_CACHE_DIR)
267
  os.environ.setdefault("MODELSCOPE_CACHE_HOME", MODELSCOPE_CACHE_DIR)
268
 
269
- DEEPFACE_HOME = os.environ.get("DEEPFACE_HOME", "~/apps/ai")
270
  os.environ["DEEPFACE_HOME"] = DEEPFACE_HOME
271
 
272
  # 设置GFPGAN相关模型下载路径
 
266
  os.environ.setdefault("MODELSCOPE_HOME", MODELSCOPE_CACHE_DIR)
267
  os.environ.setdefault("MODELSCOPE_CACHE_HOME", MODELSCOPE_CACHE_DIR)
268
 
269
+ DEEPFACE_HOME = os.environ.get("DEEPFACE_HOME", "/opt/data/models")
270
  os.environ["DEEPFACE_HOME"] = DEEPFACE_HOME
271
 
272
  # 设置GFPGAN相关模型下载路径