wall_docker/app/routes/analyze.py
Boen_Shi 6a2e046884 feat(api): 添加图像分析功能和相关路由接口
- 新增 analyze、analyze_result、analyze_status 和 health 路由
- 实现图像上传和任务提交功能
- 添加任务状态查询和结果获取接口
- 集成 segformer 和 yolo 模型进行图像检测
- 实现 SAM3 预处理功能用于图像预处理判断
- 添加模型选择配置支持 segformer 和 yolo
- 实现任务队列管理和异步处理机制
- 添加 Dockerfile 用于容器化部署
- 配置环境变量和 gitignore 规则
- 创建数据模型定义 API 响应结构
2026-01-27 11:59:45 +08:00

55 lines
1.6 KiB
Python

import os
import time
import uuid
from typing import Optional, List
from fastapi import APIRouter, UploadFile, File, Response
from app.schemas.analyze import Analyze, AnalyzeData
from app.services.model import TaskStatus, TaskStore
router = APIRouter()
@router.post("/analyze")
async def submit_analyze(response: Response, images: Optional[List[UploadFile]] = File(default=[])):
from app.main import UPLOAD_DIR, WORKER
if not images:
response.status_code = 400
return Analyze(
success=False,
data=AnalyzeData(
taskId="",
status=TaskStatus.FAILED.name,
message="请上传图片",
estimatedTime="",
filesReceived=0
)
)
task_id = f"task_{int(time.time() * 1000)}_{uuid.uuid4().hex[:10]}"
task_dir = os.path.join(UPLOAD_DIR, task_id, "inputs")
os.makedirs(task_dir, exist_ok=True)
saved_paths = []
if images:
for idx, img in enumerate(images):
ext = os.path.splitext(img.filename)[1]
file_path = os.path.join(task_dir, f"{idx}{ext}")
with open(file_path, "wb") as f:
f.write(await img.read())
saved_paths.append(file_path)
WORKER.task_store[task_id] = TaskStore(images=saved_paths)
WORKER.task_queue.put(task_id)
return Analyze(
success=True,
data=AnalyzeData(
taskId=task_id,
status=TaskStatus.QUEUED.name,
message=f"已提交 {len(saved_paths)} 张图片,正在分析",
estimatedTime="",
filesReceived=len(saved_paths)
)
)