基于 Electron + FastAPI 的目标检测系统
1. 项目愿景与定位
本项目旨在打造一个一站式 AI 桌面工作站。它不仅是一个目标检测工具,更是一个集成了资源管理、硬件监控、大模型交互和算法管理的综合性平台。通过本系统,开发者和用户可以极低成本地部署并运行 YOLO 视觉算法,同时享受到大模型驱动的语义理解能力,全程无需复杂的环境配置。
2. 深度技术架构
2.1 前端:Electron + Vue 3 + Element Plus
- 跨平台容器: 使用 Electron 封装,确保在 Windows、macOS 和 Linux 上的一致性体验。
- 动态展示: 利用 Vue 3 的组合式 API (Composition API) 处理复杂的异步状态映射,如上传进度、实时监控曲线等。
- 交互设计: 引入 Element Plus 并深度定制 CSS 样式,严格遵循 Material Design 的层级与动效规范。
2.2 后端:FastAPI + Python 3.10+
- 异步高性能: FastAPI 的高性能异步特性确保了在处理高吞吐量图片上传和长视频检测时,主进程不会阻塞。
- 算法引擎: 集成 ultralytics 库,支持从 YOLOv8 到 YOLOv11 的无缝切换。
- 多媒体处理: 采用 OpenCV 进行逐帧推理,并结合 FFmpeg 自动进行硬件加速编码(H.264),确保视频结果在所有浏览器和 Electron 容器中均能实现流式顺畅播放。
3. 核心功能模块详解
3.1 工业级图像目标检测
- 实现逻辑: 后端通过 PIL 预处理图片,调用 model.predict() 进行推理,获取 Bounding Box 坐标、类别 ID 和置信度。
- 批量处理: 支持同时选择多张图片进行并行上传,系统会自动排队处理。
- 可视化反馈: 检测完成后,系统不仅返回带框的结果图,还会返回结构化 JSON 数据(包含每个目标的详细坐标和类别),方便前端在数据可视化模块中进行二次利用。

3.2 动态视频流分析
针对视频处理,系统实现了复杂的处理管道 (Pipeline):
- 文件分片上传: 确保大容量视频(最高支持 500MB)稳定传输。
- 逐帧推理循环: 利用 cv2.VideoCapture 逐帧提取画面,YOLO 实时标记。
- 结果再编码: 针对视频编码兼容性问题,系统会自动检测环境下是否安装 FFmpeg。如果存在,则自动执行 libx264 编码转换,并将 movflags 设置为 +faststart,使视频支持“边下边看”预览。
3.3 数据可视化大屏
- 实时数据湖: 汇聚所有检测任务的结果,自动计算 Top 10 出现频率的目标类别。
- 趋势分析: 通过时间序列图表,展示系统处理任务的吞吐量。
- 统计图表: 使用 Canvas/SVG 混合渲染,生成高颜值的饼图和柱状图,直观展现数据分布。
3.4 实时系统监控
- 底层监控: 利用 Python 的 psutil 库实时探测系统硬件状态。
- 动态曲线: 前端利用定时器(Polling)每秒获取一次 CPU 使用率、剩余内存及网络带宽,通过 ECharts 或类似方案绘制平滑过渡的动态波形图。
3.5 智能对话(LLM & VLLM)
- 多模型支持: 后端路由(llm.py 与 vllm.py)对接了主流的大模型接口(支持流式输出),实现了 DeepSeek、Qwen 等多种顶级模型的统一调用。
- 多模态增强: 在 VLLM 界面中,用户可以上传一张图片,并询问:“这张图中发生了什么?”或者“图中检测到的物体有什么安全隐患?”模型将结合图像特征与文本提示词给出深度的语义回复。
4. 关键实现代码
4.1 多模态接口:VLLM 消息格式转换
多模态模型要求特定的消息结构(包含 text 和 image_url),我们通过 Python 的 Pydantic 模型进行了标准化封装:
# backend/vllm.py def convert_messages(messages: List[VLLMMessage]) -> List[dict]: """将前端简单消息对象转换为主流 API 支持的多模态复合格式""" result = [] for msg in messages: if isinstance(msg.content, str): result.append({"role": msg.role, "content": msg.content}) else: content = [] for part in msg.content: if part.type == "text": content.append({"type": "text", "text": part.text}) elif part.type == "image_url": # 支持 base64 或 静态资源 URL content.append({"type": "image_url", "image_url": {"url": part.image_url.url}}) result.append({"role": msg.role, "content": content}) return result4.2 视频处理与 FFmpeg 兼容性转换
# backend/videos.py 核心逻辑片段import subprocessasync def process_video(input_path, output_path): # 第一阶段:YOLO 推理并使用 OpenCV 保存临时视频 # ... 推理逻辑 ... # 第二阶段:为了确保浏览器兼容性,调用 FFmpeg 强制重编码为 H.264 cmd = [ 'ffmpeg', '-y', '-i', temp_path, '-c:v', 'libx264', '-preset', 'fast', '-crf', '23', '-movflags', '+faststart', output_path ] subprocess.run(cmd, capture_output=True, timeout=300)4.3 前端实时监控状态同步
前端采用 ref 响应式状态管理,每隔 2 秒自动同步底层硬件负载,并实时更新数据大屏:
// renderer.jsconst PageManager = { // ... async fetchSystemStatus() { try { const response = await fetch(`${API_BASE}/api/systems/status`); const { data } = await response.json(); // 更新响应式 UI (基于 Vue 3 或 纯 JS 操作 DOM) document.querySelector('#cpu-usage').textContent = `${data.cpu.percent}%`; document.querySelector('#mem-usage').textContent = `${data.memory.percent}%`; // 同步到 ECharts 实例 updateStatsChart(data.cpu.percent, data.memory.percent); } catch (e) { console.error("同步失败", e); } }}setInterval(() => PageManager.fetchSystemStatus(), 2000);5. 设计美学:Material Design 指南
本项目的 UI 并非简单的控件堆砌,而是构建了一个完整的设计系统:
- Elevation 层级: 背景(0dp)、资源卡片(2dp)、悬浮操作按钮(6dp)、对话框(24dp)。通过不同的阴影扩散程度定义空间感。
- 色彩心理学: 主色调采用深邃紫(Indigo)搭配明亮的青色(Cyan)作为强调色,营造科技感的同时不失稳重。
- 响应式布局: 侧边栏可收缩,资源网格会根据窗口宽度自动调整列数,完美适配 1080P 及 4K 屏幕。
6. 如何开始使用
6.1 后端环境配置
cd backend# 创建虚拟环境并安装依赖python -m venv venvsource venv/bin/activate # Windows: venv\Scripts\activatepip install -r requirements.txt# 启动 FastAPI 服务 (默认 10077 端口)python app.py6.2 前端启动
# 安装依赖npm install# 开发模式运行 (启动 Electron)npm run dev7. 结语
这是一个使用Electron(前端框架)和FastAPI(后端服务)实现 的目标检测系统。
联系方式
- 微信公众号:DetectionHub
文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有