chawin.chen
commited on
Commit
·
f881fd0
1
Parent(s):
0cf41ef
init
Browse files- api_routes.py +59 -1
- 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", "
|
| 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相关模型下载路径
|