2026-06-05 10:33:07 +08:00

jc-video-web

视频模型检测平台 - 基于YOLO的实时视频检测系统

项目架构

jc-video-web/
├── apps/
│   ├── web/              # 前端应用 (Vue 3 + Vite)
│   └── server/           # 后端服务 (FastAPI)
├── packages/
│   └── shared-types/     # 前后端共享类型定义
├── models/               # AI模型文件
│   ├── fire_detection/   # 火灾检测模型
│   ├── helmet_detection/ # 安全帽检测模型
│   ├── crowd_detection/  # 人群检测模型
│   └── smoking_detection/# 抽烟检测模型
├── scripts/              # 构建/开发脚本
└── docker/               # Docker配置

技术栈

前端

  • 框架: Vue 3 + Composition API
  • 构建工具: Vite 5
  • UI组件库: Element Plus
  • 状态管理: Pinia
  • 路由: Vue Router 4
  • HTTP客户端: Axios

后端

  • 框架: FastAPI
  • 服务器: Uvicorn
  • AI推理: Ultralytics (YOLO)
  • 图像处理: OpenCV, Pillow
  • 实时通信: WebSocket

快速开始

环境要求

  • Node.js >= 18
  • Python >= 3.9
  • pnpm >= 9.0

安装依赖

# 运行初始化脚本
bash scripts/setup.sh

或手动安装:

# 安装根依赖
pnpm install

# 安装前端依赖
cd apps/web
pnpm install
cd ../..

# 创建 Python 虚拟环境并安装依赖
cd apps/server
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cd ../..

开发模式

在项目根目录执行:

# 同时启动前后端(需先激活后端虚拟环境)
pnpm dev

# 只启动前端
pnpm dev:web

# 只启动后端(需先激活虚拟环境)
cd apps/server
source venv/bin/activate  # macOS/Linux
# 或 venv\Scripts\activate  # Windows
pnpm dev:server

访问地址:

功能特性

检测模型

  1. 火灾检测 - 基于YOLOv10的火焰和烟雾检测
  2. 安全帽检测 - 基于YOLOv8的工地安全检测
  3. 人群检测 - 基于YOLOv8的人群聚集检测
  4. 抽烟检测 - 基于YOLOv8的吸烟行为检测

输入方式

  • 图片上传检测
  • 摄像头实时检测

核心功能

  • 可拖拽布局配置
  • 实时WebSocket视频流
  • 检测结果可视化
  • 多模型切换
  • 置信度阈值调整

项目脚本

pnpm dev          # 启动开发服务器
pnpm build        # 构建生产版本
pnpm build:web    # 只构建前端
pnpm test         # 运行测试
pnpm lint         # 代码检查
pnpm clean        # 清理构建产物

模型配置

统一模型管理

所有模型文件统一存放在 models/ 目录下:

models/
├── smoking_detection/           # YOLOv8 抽烟检测
├── smoking_detection_paddle/    # PaddlePaddle PP-YOLOE-s 抽烟检测
├── fire_detection/             # YOLOv10 火灾检测
├── helmet_detection/          # YOLOv8 安全帽检测
├── crowd_detection/           # YOLOv8 人群检测
└── loitering_detection/       # YOLOv8 徘徊检测

模型类型说明

YOLO 模型:

  • 使用 yolov8n.ptyolov10n.pt 格式
  • 通过 detection_service.py 自动加载
  • 支持:抽烟检测、火灾检测、安全帽检测、人群检测、徘徊检测

PaddlePaddle 模型:

  • 使用 model.pdmodel + model.pdiparams 格式
  • 通过 paddle_detection_service.py 加载
  • 支持抽烟检测PP-YOLOE-s

模型文件格式

YOLO 模型:

smoking_detection/
└── yolov8n.pt                 # YOLO 模型文件

PaddlePaddle 模型:

smoking_detection_paddle/
├── model.pdmodel              # 模型结构
├── model.pdiparams            # 模型参数
└── infer_cfg.yml             # 推理配置

PaddlePaddle 环境配置

本地 PaddlePaddle 部署

项目使用本地 PaddlePaddle 进行抽烟检测推理(不使用 Docker以获得更好的性能。

整合架构说明

PaddlePaddle 模型整合在现有的视频检测平台中,提供补充的检测能力。

系统架构层级

  1. 前端层

    • 通过 Web 界面接收用户输入
    • 调用后端 API 进行图像检测
    • 展示检测结果和实时视频流
  2. 后端服务层

    • FastAPI 提供 REST API 接口
    • WebSocket 支持实时视频流传输
    • 路由不同检测请求到对应的模型服务
  3. 检测服务层

    • YOLO 检测服务:处理火灾、安全帽、人群、徘徊等检测任务
    • PaddlePaddle 检测服务:专门处理抽烟检测任务
    • 统一的检测结果格式输出
  4. 推理引擎层

    • YOLO 推理引擎:基于 Ultralytics 库
    • PaddlePaddle 推理引擎:基于 PaddleDetection 库
    • 各自独立的模型加载和推理逻辑

调用流程

前端发起检测请求 → 后端 API 接收 → 路由到对应检测服务 → 推理引擎处理 → 返回检测结果 → 前端展示

模型选择策略

  • 系统根据检测类型自动选择合适的推理引擎
  • 抽烟检测优先使用 PaddlePaddle 模型(精度更高)
  • 其他检测使用 YOLO 模型(速度更快)
  • 支持配置切换模型类型

依赖关系说明

PaddlePaddle 整合依赖于多个组件的协同工作。

核心依赖组件

  1. PaddlePaddle 框架

    • 版本要求3.0.0
    • 提供深度学习推理基础能力
    • 支持 CPU 推理(本地部署环境)
  2. PaddleDetection 库

    • 来源GitHub PaddlePaddle/PaddleDetection release-2.9
    • 提供目标检测专用功能
    • 包含预处理、推理、后处理和可视化模块
  3. FastAPI 服务

    • 主后端框架,提供 Web 服务
    • 整合 PaddlePaddle 检测服务
    • 处理 HTTP 请求和 WebSocket 连接
  4. 虚拟环境

    • 统一使用 apps/server/venv
    • 包含所有必需的 Python 依赖
    • 隔离运行环境,避免版本冲突

依赖链路

用户请求 → FastAPI → PaddleDetection 服务 → PaddlePaddle 框架 → 模型推理 → 结果返回

环境变量依赖

  • FLAGS_enable_pir_api=0:禁用新版 PIR API确保与旧模型兼容
  • Python 路径配置:确保正确加载 PaddleDetection 模块

系统资源依赖

  • CPU支持多线程推理
  • 内存:最小要求 2GB推荐 4GB 以上
  • 磁盘空间:模型文件约 30MB推理代码约 50MB

与其他组件的关系

  • 与 YOLO 检测服务并列运行,互不干扰
  • 共享 FastAPI 的路由和中间件
  • 使用相同的日志系统和错误处理机制
  • 统一的模型管理目录结构

环境设置

  1. 运行环境设置脚本验证/安装 PaddlePaddle
bash scripts/setup-paddlepaddle.sh
  1. 如果是首次设置,按照脚本提示完成以下步骤:
    • 下载 PaddleDetection release-2.9 到 PaddlePaddle/PaddleDetection-release-2.9/
    • 安装 PaddlePaddle 和依赖到服务器虚拟环境
    • 将模型文件复制到 models/smoking_detection_paddle/

目录结构

third-party/paddle-inference/       # PaddleDetection 推理代码
├── infer.py                      # 推理引擎
├── preprocess.py                 # 图像预处理
├── utils.py                      # 工具函数
└── visualize.py                  # 结果可视化

models/smoking_detection_paddle/      # PaddlePaddle 模型文件
├── model.pdmodel                # 模型结构
├── model.pdiparams              # 模型参数
└── infer_cfg.yml                 # 推理配置

性能优化

本地部署相比 Docker 性能提升:

  • 推理时间3-4秒 → 0.123秒(提升 ~30 倍)
  • 内存占用:~3GB → ~0.5GB(减少 83%
  • 启动时间:~10秒 → 即时
  • CPU 利用率:提升 50%

PaddlePaddle 详细操作指南

首次设置完整流程

  1. 下载 PaddleDetection 代码

    # 进入项目根目录
    cd jc-video-recognize
    
    # 下载 PaddleDetection release-2.9
    git clone -b release/2.9 https://github.com/PaddlePaddle/PaddleDetection.git /tmp/PaddleDetection-release-2.9
    
    # 或手动下载并解压
    # 从 https://github.com/PaddlePaddle/PaddleDetection/releases/tag/release%2F2.9
    
  2. 复制推理代码

    # 复制必要的推理文件到项目中
    cp -r /tmp/PaddleDetection-release-2.9/deploy/python/* third-party/paddle-inference/
    
    # 删除临时文件
    rm -rf /tmp/PaddleDetection-release-2.9
    
  3. 安装 PaddlePaddle 依赖

    # 进入服务器目录
    cd apps/server
    
    # 激活虚拟环境
    source venv/bin/activate
    
    # 安装 PaddlePaddle 和相关依赖
    pip install paddlepaddle==3.0.0
    pip install 'numpy==1.26.4' 'opencv-python==4.7.0.72'
    pip install imgaug==0.4.0
    
  4. 放置模型文件

    # 确保模型文件在正确位置
    ls -la models/smoking_detection_paddle/
    # 应该包含model.pdmodel, model.pdiparams, infer_cfg.yml
    
  5. 验证安装

    # 运行验证脚本
    bash scripts/setup-paddlepaddle.sh
    

日常维护操作

更新 PaddlePaddle 推理代码

# 下载新版推理代码
cd /tmp
git clone -b release/2.9 https://github.com/PaddlePaddle/PaddleDetection.git PaddleDetection-release-2.9

# 备份现有代码
cd ../jc-video-recognize
cp -r third-party/paddle-inference third-party/paddle-inference.backup

# 更新推理代码
cp -r /tmp/PaddleDetection-release-2.9/deploy/python/* third-party/paddle-inference/

# 测试新代码
pnpm dev:server

# 如果测试失败,恢复备份
# rm -rf third-party/paddle-inference
# mv third-party/paddle-inference.backup third-party/paddle-inference

更新模型文件

# 停止服务器
pkill -f "python.*main.py"

# 备份现有模型
cp -r models/smoking_detection_paddle models/smoking_detection_paddle.backup

# 放置新模型
cp /path/to/new/model.pdmodel models/smoking_detection_paddle/
cp /path/to/new/model.pdiparams models/smoking_detection_paddle/
cp /path/to/new/infer_cfg.yml models/smoking_detection_paddle/

# 重启服务器验证
cd apps/server && ./start_server_with_env.sh

更新依赖版本

# 进入服务器虚拟环境
cd apps/server
source venv/bin/activate

# 升级 PaddlePaddle
pip install --upgrade paddlepaddle==3.0.0

# 升级其他依赖
pip install --upgrade 'numpy==1.26.4' 'opencv-python==4.7.0.72'
pip install --upgrade imgaug==0.4.0

# 测试新版本
python -c "import paddle; print(paddle.__version__)"

故障排查指南

问题 1模型加载失败

# 检查模型文件完整性
ls -la models/smoking_detection_paddle/

# 检查必要文件
model.pdmodel    # 模型结构
model.pdiparams  # 模型参数  
infer_cfg.yml   # 推理配置

# 验证文件大小(应该 > 30MB
du -sh models/smoking_detection_paddle/

问题 2PaddlePaddle 导入失败

# 检查 PaddlePaddle 安装
source apps/server/venv/bin/activate
pip list | grep paddle

# 重新安装 PaddlePaddle
pip install paddlepaddle==3.0.0 --force-reinstall

# 检查环境变量
echo $FLAGS_enable_pir_api
# 应该是 0

问题 3推理速度慢

# 检查 CPU 使用情况
top -p $(pgrep -f python)

# 检查内存使用情况
free -h

# 优化建议:
# 1. 减少批处理大小
# 2. 使用更小的模型(如果精度允许)
# 3. 启用 GPU 加速(如果有 NVIDIA GPU

性能监控

实时监控推理时间

# 查看服务器日志中的推理时间
tail -f apps/server/logs/*.log | grep "推理时间"

性能基准测试

# 使用测试图像进行基准测试
curl -X POST "http://localhost:8000/api/detect" \
  -F "image=@test_image.jpg" \
  -F "model=smoking_detection_paddle"

系统资源监控

# CPU 使用率
mpstat 1

# 内存使用情况  
free -m -s 1

# 磁盘 I/O
iostat -x 1

Git 管理

排除文件

# .gitignore 中已配置以下排除
models/*/                  # 模型文件
third-party/paddle-inference/ # 第三方代码
apps/server/venv/         # 虚拟环境

版本控制策略

  • 只版本控制代码文件
  • 不版本控制模型文件(太大)
  • 不版本控制第三方库
  • 使用 Git LFS 如果必须版本控制大文件

协作建议

团队协作流程

  1. 每个成员独立运行 setup-paddlepaddle.sh
  2. 在 README 中记录使用的 PaddlePaddle 版本
  3. 定期同步模型文件和配置更新
  4. 使用统一的环境变量配置

许可证

MIT

Description
No description provided
Readme 438 MiB
Languages
Python 75.9%
Vue 20.6%
Shell 2.4%
JavaScript 0.7%
TypeScript 0.3%