wall_docker/app/routes/analyze_result.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

87 lines
2.7 KiB
Python

import json
import os
from fastapi import APIRouter, Response
from app.schemas.analyze_result import AnalyzeResult, AnalyzeResultData, ImageInfo, MaskInfo, ResultItem
from app.services.model import TaskStatus
router = APIRouter()
@router.get("/analyze/result/{task_id}")
async def get_task_result(task_id: str, response: Response):
from app.main import UPLOAD_DIR, WORKER
task = WORKER.task_store.get(task_id)
if not task:
response.status_code = 404
return AnalyzeResult(
success=False,
data=AnalyzeResultData(
taskId=task_id,
status=TaskStatus.NOT_FOUND.name,
completedAt=None,
results=None
)
)
if task.status == TaskStatus.COMPLETED.name:
# 构建完成状态的结果数据
result_items = []
# 输入和输出目录路径
input_dir = os.path.join(UPLOAD_DIR, task_id, "inputs")
output_dir = os.path.join(UPLOAD_DIR, task_id, "outputs")
for idx, result_data in enumerate(task.result):
# 解析坐标数据
coords_data = json.loads(result_data.get("coords", "[]"))
# 构建图片信息
input_img_path = result_data.get("input_img_path", "")
output_img_path = result_data.get("output_img_path", "")
# 构建URL路径
input_filename = os.path.basename(input_img_path)
output_filename = os.path.basename(output_img_path)
image_info = ImageInfo(
origin=f"/uploads/{task_id}/inputs/{input_filename}",
image=f"/uploads/{task_id}/outputs/{output_filename}" if output_img_path is not "" else "",
)
# 构建mask信息
masks = [
MaskInfo(name=mask["name"], coords=mask["coords"])
for mask in coords_data
]
result_item = ResultItem(
id=str(idx),
images=image_info,
masks=masks
)
result_items.append(result_item)
response.status_code = 200
return AnalyzeResult(
success=True,
data=AnalyzeResultData(
taskId=task_id,
status=task.status,
completedAt=task.completedAt.isoformat() if task.completedAt else "",
results=result_items
)
)
else:
# 其他状态(处理中、失败等)
return AnalyzeResult(
success=True,
data=AnalyzeResultData(
taskId=task_id,
status=task.status,
completedAt=None,
results=None
)
)