从AI模型到桌面应用:用Electron + FastAPI + YOLO打造开箱即用的智能检测系统(后端文档)

基于 FastAPI 框架开发的目标检测系统后端服务,集成 YOLO 模型进行图像和视频的目标检测,支持大语言模型和多模态模型对话功能。


目录


项目简介

本项目是一个功能完善的目标检测系统后端服务,提供以下核心功能:

  • 🖼️ 图片目标检测:支持图片上传、预览、检测、下载、批量操作

  • 🎬 视频目标检测:支持视频上传、流式播放、逐帧检测、H.264 编码输出

  • 📊 系统监控:实时监控 CPU、内存、磁盘、网络等系统资源

  • 🤖 模型管理:支持 YOLO 模型上传、加载、切换

  • 💬 LLM 对话:集成大语言模型,支持流式输出

  • 👁️ VLLM 多模态:支持图像+文本的多模态对话

  • 📝 日志管理:系统日志记录、预览、下载


技术栈

技术版本说明
Python3.8+编程语言
FastAPI0.104+高性能 Web 框架
Uvicorn0.24+ASGI 服务器
Ultralytics8.0+YOLO 目标检测库
OpenCV4.8+视频处理库
Pillow10.0+图像处理库
psutil5.9+系统监控库
httpx0.25+异步 HTTP 客户端
Pydantic2.0+数据验证库

依赖安装

pip install -r requirements.txt

requirements.txt 内容:

fastapi>=0.104.0
uvicorn[standard]>=0.24.0
python-multipart>=0.0.6
pillow>=10.0.0
psutil>=5.9.0
httpx>=0.25.0
pydantic>=2.0.0
ultralytics>=8.0.0
opencv-python>=4.8.0

项目结构

backend/
├── main.py                 # 🚀 FastAPI 主入口文件
├── schemas.py              # 📦 通用响应模型与工具函数
├── requirements.txt        # 📋 Python 依赖列表
├── yolo11n.pt             # 🎯 默认 YOLO 模型文件 (5.3MB)
├── routers/               # 🔌 API 路由模块目录
│   ├── __init__.py        # 路由模块初始化
│   ├── images.py          # 📷 图片管理 (9个接口)
│   ├── videos.py          # 🎬 视频管理 (12个接口)
│   ├── logs.py            # 📝 日志管理 (5个接口)
│   ├── systems.py         # 💻 系统监控 (1个接口)
│   ├── models.py          # 🤖 模型管理 (8个接口)
│   ├── dashboard.py       # 📊 仪表板 (6个接口)
│   ├── llm.py             # 💬 大语言模型 (2个接口)
│   └── vllm.py            # 👁️ 多模态模型 (2个接口)
├── images/                # 🖼️ 图片存储目录
│   ├── upload/            # 上传的原始图片
│   └── detected/          # 检测结果图片
├── videos/                # 🎥 视频存储目录
│   ├── upload/            # 上传的原始视频
│   └── detected/          # 检测结果视频
├── models/                # 📦 模型文件存储目录
│   └── models_info.json   # 模型元信息
└── logs/                  # 📋 日志文件存储目录
    └── YYYY.MM.DD.log     # 按日期命名的日志文件

快速开始

1. 打开后端

cd backend

2. 创建虚拟环境(推荐)

python -m venv venv
​
# Windows
.\venv\Scripts\activate
​
# Linux/Mac
source venv/bin/activate

3. 安装依赖

pip install -r requirements.txt

4. 启动服务

python main.py

或使用 uvicorn 启动(支持热重载):

uvicorn main:app --host 0.0.0.0 --port 10077 --reload

5. 访问服务


核心模块详解

1. 主入口文件 (main.py)

主入口文件是整个后端服务的核心,负责:

  • 应用初始化:创建 FastAPI 实例

  • 生命周期管理:服务启动/关闭时的初始化和清理

  • 中间件配置:CORS 跨域配置

  • 静态文件挂载:图片、视频静态资源服务

  • 路由注册:注册所有 API 路由模块

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles

# 创建 FastAPI 应用
app = FastAPI(
    title="目标检测系统 API",
    description="支持图片、视频的上传、检测、管理,集成 YOLO 模型和大语言模型",
    version="1.0.0",
    lifespan=lifespan
)

# CORS 配置 - 允许所有来源跨域访问
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 静态文件挂载
app.mount("/static/images/upload", StaticFiles(directory=IMAGES_UPLOAD_DIR))
app.mount("/static/images/detected", StaticFiles(directory=IMAGES_DETECTED_DIR))
app.mount("/static/videos/upload", StaticFiles(directory=VIDEOS_UPLOAD_DIR))
app.mount("/static/videos/detected", StaticFiles(directory=VIDEOS_DETECTED_DIR))

# 路由注册
app.include_router(images.router, prefix="/api/images", tags=["图片管理"])
app.include_router(videos.router, prefix="/api/videos", tags=["视频管理"])
app.include_router(logs.router, prefix="/api/logs", tags=["日志管理"])
app.include_router(systems.router, prefix="/api/systems", tags=["系统监控"])
app.include_router(models.router, prefix="/api/models", tags=["模型管理"])
app.include_router(llm.router, prefix="/api/llm", tags=["大语言模型"])
app.include_router(vllm.router, prefix="/api/vllm", tags=["多模态模型"])

日志配置:

系统使用 Python 标准 logging 模块,日志按日期存储:

log_filename = datetime.now().strftime("%Y.%m.%d.log")
log_filepath = os.path.join(LOGS_DIR, log_filename)

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler(log_filepath, encoding="utf-8"),
        logging.StreamHandler()  # 同时输出到控制台
    ]
)


2. 通用响应模型 (schemas.py)

定义统一的 API 响应格式,确保所有接口返回一致的 JSON 结构。

from typing import Any, Optional
from pydantic import BaseModel

class APIResponse(BaseModel):
    """统一 API 响应格式"""
    code: int = 200
    message: str = "成功"
    data: Optional[Any] = None

def success_response(data: Any = None, message: str = "成功") -> dict:
    """成功响应"""
    return {"code": 200, "message": message, "data": data}

def error_response(message: str = "操作失败", code: int = 400) -> dict:
    """错误响应"""
    return {"code": code, "message": message, "data": None}

统一响应格式示例:

// 成功响应
{
  "code": 200,
  "message": "操作成功",
  "data": { ... }
}

// 错误响应
{
  "detail": "错误信息描述"
}

3. 图片管理模块 (routers/images.py)

功能概述: 提供完整的图片生命周期管理,包括上传、预览、检测、下载、删除等功能。

核心特性:

  • 支持 PNG、JPG、JPEG、GIF、BMP 格式

  • 单文件最大 10MB 限制

  • 延迟加载 YOLO 模型(节省内存)

  • 检测结果自动保存并带边界框标注

图片接口列表(9个):

方法路径功能说明
POST/upload/{filename}上传图片支持重命名,自动添加时间戳
GET/list获取图片列表返回所有上传图片信息
GET/view/{filename}查看图片支持 width/height 参数缩放
GET/download/{filename}下载图片返回原始文件
POST/download/batch批量下载打包成 ZIP 文件
DELETE/delete/{filename}删除图片同时删除检测结果
DELETE/delete/batch批量删除批量删除多个图片
GET/detectedlist检测结果列表获取所有检测结果图片
POST/detect/{filename}图片检测执行 YOLO 目标检测

4. 视频管理模块 (routers/videos.py)

功能概述: 提供视频的完整管理功能,支持视频上传、流式播放、逐帧目标检测。

核心特性:

  • 支持 MP4、AVI、MOV、WMV、FLV、MKV 格式

  • 单文件最大 500MB 限制

  • 逐帧 YOLO 检测

  • 自动转码为 H.264 格式(需要 FFmpeg)

  • 输出分辨率限制为 720p(内存优化)

视频接口列表(12个):

方法路径功能
POST/upload/{filename}上传视频
GET/list获取视频列表
GET/view/{filename}流式播放视频
GET/download/{filename}下载视频
POST/download/batch批量下载视频
DELETE/delete/{filename}删除视频
POST/delete/batch批量删除视频
GET/detected/list检测结果列表
GET/detected/view/{filename}播放检测结果
GET/detected/download/{filename}下载检测结果
POST/detected/download/batch批量下载检测结果
DELETE/detected/delete/{filename}删除检测结果
POST/detected/delete/batch批量删除检测结果
POST/detect视频目标检测

5. 日志管理模块 (routers/logs.py)

功能概述: 管理系统运行日志,支持查看、预览、下载。

日志接口列表(5个):

方法路径功能
GET/list获取日志文件列表
GET/preview/{filename}预览日志内容
GET/download/{filename}下载日志文件
POST/download/batch批量下载日志
DELETE/{filename}删除日志文件

6. 系统监控模块 (routers/systems.py)

功能概述: 实时获取系统资源使用情况。

响应数据结构:

{
  "code": 200,
  "message": "获取成功",
  "data": {
    "cpu": { "percent": 45.5, "count": 8 },
    "memory": { "total": 17179869184, "used": 10300000000, "percent": 60.0 },
    "disk": { "total": 512000000000, "used": 204000000000, "percent": 40.0 },
    "network": { "bytes_sent": 1234567890, "bytes_recv": 9876543210 },
    "uptime": { "boot_time": "2026-01-30 08:00:00", "days": 1, "hours": 3, "minutes": 47, "seconds": 44 },
    "system": { "system": "Windows", "release": "11" }
  }
}


7. 模型管理模块 (routers/models.py)

功能概述: YOLO 模型的完整生命周期管理,支持上传、加载、切换。

模型接口列表(8个):

方法路径功能
GET/list获取模型列表
POST/upload上传模型(带元数据)
GET/info/{filename}获取模型详情
PUT/put/{filename}更新模型信息
GET/download/{filename}下载模型
POST/download/batch批量下载模型
DELETE/delete/{filename}删除模型
POST/load/{filename}加载模型

8. 大语言模型模块 (routers/llm.py)

功能概述: 集成第三方大语言模型 API,支持流式和非流式响应。

支持的模型列表:

模型ID名称说明
Qwen/Qwen2.5-Coder-32B-InstructQwen 2.5 Coder (32B)通义千问编程模型
Qwen/Qwen2.5-72B-InstructQwen 2.5 (72B)通义千问大模型
Qwen/Qwen2.5-32B-InstructQwen 2.5 (32B)通义千问大模型
deepseek-ai/DeepSeek-V3DeepSeek V3DeepSeek 大模型
deepseek-ai/DeepSeek-R1DeepSeek R1DeepSeek 推理模型

请求参数模型:

class ChatRequest(BaseModel):
    model: str = "Qwen/Qwen2.5-Coder-32B-Instruct"
    messages: List[Message]
    temperature: float = 0.7
    max_tokens: int = 4096
    stream: bool = False
    top_p: float = 0.95
    frequency_penalty: float = 0.0
    presence_penalty: float = 0.0

流式响应实现:

@router.post("/chat/completions")
async def chat_completions(request: ChatRequest):
    if request.stream:
        async def generate():
            async with httpx.AsyncClient(timeout=60.0) as client:
                async with client.stream("POST", url, headers=headers, json=payload) as response:
                    async for chunk in response.aiter_text():
                        yield chunk
        
        return StreamingResponse(generate(), media_type="text/event-stream")

9. 多模态模型模块 (routers/vllm.py)

功能概述: 支持图像+文本的多模态对话。

支持的多模态模型:

模型ID名称说明
Qwen/Qwen2-VL-72B-InstructQwen2-VL 72B通义千问视觉语言模型
Qwen/Qwen2-VL-7B-InstructQwen2-VL 7B通义千问视觉语言模型
internlm/internlm-xcomposer2d5-7bInternLM-XComposer2.5书生浦语多模态模型
OpenGVLab/InternVL2-26BInternVL2 26B书生万象多模态模型

多模态消息格式:

class ContentItem(BaseModel):
    type: str  # "text" 或 "image_url"
    text: Optional[str] = None
    image_url: Optional[ImageUrl] = None

class MultimodalMessage(BaseModel):
    role: str
    content: Union[str, List[ContentItem]]  # 支持纯文本或混合内容

请求示例:

{
  "model": "Qwen/Qwen2-VL-72B-Instruct",
  "messages": [
    {
      "role": "user",
      "content": [
        {"type": "text", "text": "请描述这张图片"},
        {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}
      ]
    }
  ],
  "stream": true
}

API 接口文档

接口总览

模块前缀接口数说明
图片管理/api/images9图片上传、检测、管理
视频管理/api/videos14视频上传、检测、管理
日志管理/api/logs5系统日志管理
系统监控/api/systems1系统资源监控
模型管理/api/models8YOLO 模型管理
仪表板/api/dashboard6数据可视化(已废弃)
LLM/api/llm2大语言模型对话
VLLM/api/vllm2多模态模型对话

文件限制

类型最大大小支持格式
图片10 MB.png, .jpg, .jpeg, .gif, .bmp
视频500 MB.mp4, .avi, .mov, .wmv, .flv, .mkv
模型500 MB.pt (PyTorch)

数据模型

图片信息

interface ImageInfo {
  filename: string;      // 文件名
  url: string;          // 访问 URL
  size: number;         // 文件大小(字节)
  create_time: string;  // 创建时间
  modify_time: string;  // 修改时间
}

检测结果

interface Detection {
  class_id: number;     // 类别 ID
  class_name: string;   // 类别名称
  confidence: number;   // 置信度 (0-1)
  box: {
    x1: number;        // 左上角 X
    y1: number;        // 左上角 Y
    x2: number;        // 右下角 X
    y2: number;        // 右下角 Y
  };
}

模型信息

interface ModelInfo {
  filename: string;     // 模型文件名
  name: string;         // 模型名称
  dataset: string;      // 训练数据集
  base_model: string;   // 基础模型类型
  upload_time: string;  // 上传时间
  description: string;  // 描述
  version: string;      // 版本号
  accuracy: number;     // 精度 (0-100)
}

系统状态

interface SystemStatus {
  cpu: {
    percent: number;    // CPU 使用率
    count: number;      // CPU 核心数
  };
  memory: {
    total: number;      // 总内存(字节)
    used: number;       // 已用内存
    percent: number;    // 使用百分比
  };
  disk: {
    total: number;      // 总磁盘(字节)
    used: number;       // 已用磁盘
    percent: number;    // 使用百分比
  };
  network: {
    bytes_sent: number; // 发送字节
    bytes_recv: number; // 接收字节
  };
  uptime: {
    boot_time: string;  // 启动时间
    days: number;       // 运行天数
    hours: number;      // 小时
    minutes: number;    // 分钟
    seconds: number;    // 秒
  };
  system: {
    system: string;     // 操作系统
    release: string;    // 版本
  };
}

配置说明

环境变量

变量名默认值说明
LLM_API_KEY-LLM/VLLM API 密钥
LLM_BASE_URLhttps://api.siliconflow.cn/v1LLM API 基础 URL

CORS 配置

生产环境建议限制允许的来源:

app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:3000", "https://your-domain.com"],
    allow_credentials=True,
    allow_methods=["GET", "POST", "PUT", "DELETE"],
    allow_headers=["*"],
)

部署指南

开发环境

uvicorn main:app --host 0.0.0.0 --port 10077 --reload

生产环境

使用 Gunicorn + Uvicorn Workers:

pip install gunicorn

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:10077

使用 Docker:

FROM python:3.10-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 10077
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "10077"]

常见问题

1. 模型加载失败

问题:启动时提示 YOLO 模型加载失败

解决方案:

  • 确保 yolo11n.pt 文件存在于 backend 目录

  • 检查是否安装了 ultralytics 库

  • 尝试手动下载模型:from ultralytics import YOLO; YOLO('yolo11n.pt')

2. 视频检测后无法播放

问题:浏览器无法播放检测后的视频

解决方案:

  • 安装 FFmpeg,系统会自动转码为 H.264 格式

  • 如未安装 FFmpeg,下载视频后使用本地播放器观看

3. LLM 接口请求超时

问题:调用 /api/llm/chat/completions 超时

解决方案:

  • 检查 LLM_API_KEY 环境变量是否正确设置

  • 检查网络连接是否正常

  • 尝试增加 timeout 时间(默认 60 秒)

4. 内存占用过高

问题:处理大视频时内存占用过高

解决方案:

  • 系统已自动限制输出分辨率为 720p

  • 系统每 50 帧自动释放内存

  • 可进一步降低处理分辨率

联系方式

  • 微信公众号:DetectionHub

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐