Files
rtsp-video-analysis-system/COMPLETE-SUMMARY.md
2025-09-30 14:23:33 +08:00

15 KiB
Raw Permalink Blame History

🎉 RTSP视频分析系统 - 完整更新总结

📋 项目概述

本文档总结了RTSP视频分析系统的所有Docker部署和巡检任务记录功能的实现。

完成的工作

一、Docker部署方案

1.1 核心配置文件

  • .env - 环境变量配置前端端口10080
  • docker-compose.yml - 5个服务编排无MinIO使用外部
  • .dockerignore - Docker构建优化

1.2 Dockerfile文件

  • ruoyi-admin/Dockerfile - Java后端多阶段构建
  • rtsp-vue/Dockerfile - Vue前端多阶段构建
  • rtsp-vue/nginx.conf - Nginx配置容器名代理
  • python-inference-service/Dockerfile - Python服务CPU模式

1.3 YOLOv8支持

  • python-inference-service/requirements.txt - ultralytics>=8.0.0
  • python-inference-service/models/yolov8_model.py - YOLOv8包装类
  • python-inference-service/models/models.json - yolov8_detector配置

1.4 部署脚本

  • deploy.bat - Windows一键部署
  • deploy.sh - Linux/Mac一键部署

1.5 部署文档

  • README-DOCKER.md - 完整部署文档
  • DOCKER-QUICK-START.md - 快速开始指南
  • YOLOV8-SETUP.md - YOLOv8配置指南
  • DEPLOYMENT-NOTES.md - 部署配置说明
  • FINAL-SUMMARY.md - 最终配置总结

二、巡检任务记录功能

2.1 新增Service层

  • IInspectionTaskRecordService.java - 服务接口
  • IInspectionTaskRecordServiceImpl.java - 服务实现

2.2 修改核心服务

  • InspectionTaskServiceImpl.java

    • 添加依赖注入InspectionTaskRecordMapper等
    • 修改executeInspectionTask() - 创建记录
    • 新增performVideoAnalysisWithRecord() - 录制+分析
    • 新增analyzeVideoAndUpdateRecord() - 调用分析
    • 新增updateRecordFailed() - 失败处理
  • VideoAnalysisService.java

    • 更新Python服务URL为容器名
    • 更新模型名称为yolov8_detector
    • 新增analyzeVideoWithRecord() - 带记录的分析
    • 新增processVideoWithRecord() - 处理并记录
    • 新增createAlarmRecordForRecord() - 去重告警
    • 新增uploadProcessedVideoForRecord() - 上传视频

2.3 功能文档

  • INSPECTION-WORKFLOW.md - 详细工作流程
  • INSPECTION-FEATURE-SUMMARY.md - 功能总结

🎯 关键特性

Docker部署特性

特性 说明
YOLOv8 CPU模式无需GPU/CUDA
MinIO 使用外部服务49.232.154.205:10900
端口 只暴露前端10080端口
网络 容器间使用容器名通信
服务 MySQL, Redis, Python(CPU), Backend, Frontend

巡检任务特性

特性 说明
自动记录 每次执行自动创建InspectionTaskRecord
视频保存 自动录制并上传到MinIO
AI识别 调用Python服务(YOLOv8)识别
结果更新 自动更新record.accessory和result
告警去重 相同对象只创建一次告警

🔄 完整工作流程

用户启动巡检任务
  ↓
创建InspectionTaskRecord
  ├── recordId: [auto]
  ├── taskId: 1001
  ├── executeTime: now
  └── status: 1 (执行中)
  ↓
录制RTSP视频流
  ├── 抓取视频流
  ├── 录制30秒
  └── 保存临时文件
  ↓
上传原始视频
  ├── 上传到MinIO
  ├── 获取URL
  └── 更新record.accessory = "video1.mp4"
  ↓
AI识别处理
  ├── 逐帧分析
  ├── 每10帧调用Python API (YOLOv8)
  ├── 检测结果去重
  └── 创建AlarmRecord
      ├── 提取检测区域图片
      ├── 上传告警图片
      └── 保存告警记录
  ↓
生成处理后视频
  ├── 绘制检测框
  ├── 上传到MinIO
  └── 更新record.accessory += ";video2.mp4"
  ↓
更新记录
  ├── record.result = "检测结果摘要"
  ├── record.duration = 32秒
  └── record.status = 0 (成功)

📊 数据表关系

InspectionTask (1)
  ↓
InspectionTaskRecord (N)
  ├── accessory: 原始视频URL;处理后视频URL
  ├── result: 共检测到X个问题详情...
  └── status: 0=成功, 1=失败, 2=部分成功
  ↓
AlarmRecord (N)
  ├── 告警类型、内容、置信度
  ├── 告警图片URL
  ├── 视频帧位置
  └── 自动去重(相同对象只记录一次)

🚀 快速开始

1. Docker部署

# 1. 准备YOLOv8模型
# 将best.pt放到: python-inference-service/models/best.pt

# 2. 一键部署
deploy.bat  # Windows

# 3. 访问系统
# http://localhost:10080

2. 创建巡检任务

// 创建任务
InspectionTask task = new InspectionTask();
task.setDeviceId(deviceId);
task.setDuration(30); // 录制30秒
task.setStatus(0);    // 待执行
inspectionTaskService.insertInspectionTask(task);

// 启动任务
inspectionTaskService.executeInspectionTask(task.getTaskId());

3. 查看结果

-- 查看执行记录
SELECT * FROM v_inspection_task_record 
WHERE task_id = ? 
ORDER BY execute_time DESC;

-- 查看告警
SELECT * FROM v_alarm_record 
WHERE task_id = ? 
ORDER BY create_time DESC;

📦 文件清单

Docker部署文件15个

.env                                    # 环境变量
docker-compose.yml                      # 服务编排
.dockerignore                           # 构建优化
ruoyi-admin/Dockerfile                  # 后端镜像
rtsp-vue/Dockerfile                     # 前端镜像
rtsp-vue/nginx.conf                     # Nginx配置
rtsp-vue/.dockerignore                  # 前端构建优化
python-inference-service/Dockerfile     # Python镜像
python-inference-service/.dockerignore  # Python构建优化
deploy.bat                              # Windows部署脚本
deploy.sh                               # Linux部署脚本
README-DOCKER.md                        # 完整文档
DOCKER-QUICK-START.md                   # 快速开始
DEPLOYMENT-NOTES.md                     # 配置说明
FINAL-SUMMARY.md                        # 配置总结

YOLOv8文件4个

python-inference-service/requirements.txt         # ultralytics依赖
python-inference-service/models/yolov8_model.py   # YOLOv8包装类
python-inference-service/models/models.json       # 模型配置
YOLOV8-SETUP.md                                   # 配置指南

巡检任务文件5个

ruoyi-video/src/main/java/com/ruoyi/video/service/
├── IInspectionTaskRecordService.java              # 记录服务接口
└── impl/
    └── IInspectionTaskRecordServiceImpl.java      # 记录服务实现

ruoyi-video/src/main/java/com/ruoyi/video/service/impl/
├── InspectionTaskServiceImpl.java (修改)          # 添加记录创建
└── VideoAnalysisService.java (修改)               # 添加记录更新

INSPECTION-WORKFLOW.md                            # 工作流程文档
INSPECTION-FEATURE-SUMMARY.md                     # 功能总结

后端配置修改2个

ruoyi-admin/pom.xml                              # 添加actuator依赖
ruoyi-admin/src/main/resources/application.yml   # 添加actuator配置

🎯 配置要点

1. 环境变量(.env

FRONTEND_PORT=10080                    # 前端对外端口
MYSQL_HOST=rtsp-mysql                  # 数据库容器名
REDIS_HOST=rtsp-redis                  # Redis容器名
BACKEND_HOST=rtsp-backend              # 后端容器名
PYTHON_SERVICE_HOST=rtsp-python-service # Python服务容器名

# MinIO配置在application.yml中

2. MinIO配置application.yml

minio:
  endpoint: http://49.232.154.205:10900
  access-key: 4EsLD9g9OM09DT0HaBKj
  secret-key: 05SFC5fleqTnaLRYBrxHiphMFYbGX5nYicj0WCHA
  bucket: rtsp

3. Python服务URL

// VideoAnalysisService.java
private static final String PYTHON_API_URL = "http://rtsp-python-service:8000/api/detect/file";
private static final String MODEL_NAME = "yolov8_detector";

📖 文档导航

快速开始

  1. FINAL-SUMMARY.md - Docker配置总结
  2. DOCKER-QUICK-START.md - 快速启动指南

部署相关

  1. README-DOCKER.md - 完整部署文档
  2. DEPLOYMENT-NOTES.md - 详细配置说明
  3. YOLOV8-SETUP.md - YOLOv8模型配置

功能相关

  1. INSPECTION-FEATURE-SUMMARY.md - 巡检功能总结
  2. INSPECTION-WORKFLOW.md - 详细工作流程

更新记录

  1. UPDATE-SUMMARY.md - 更新变更记录
  2. DEPLOYMENT-FILES.md - 文件清单
  3. COMPLETE-SUMMARY.md - 本文档

🔍 验证清单

Docker部署验证

  • 所有容器运行正常

    docker-compose ps
    
  • 前端可访问

    http://localhost:10080
    
  • Python服务健康

    docker-compose logs python-service | grep "YOLOv8模型加载完成"
    
  • 后端连接正常

    docker-compose logs backend | grep "Started RuoYiApplication"
    

巡检功能验证

  • 创建测试任务

  • 执行任务

  • 检查Record创建

    SELECT * FROM v_inspection_task_record ORDER BY create_time DESC LIMIT 1;
    
  • 检查视频保存

    SELECT accessory FROM v_inspection_task_record WHERE record_id = ?;
    
  • 检查识别结果

    SELECT result FROM v_inspection_task_record WHERE record_id = ?;
    
  • 检查告警创建

    SELECT * FROM v_alarm_record WHERE task_id = ? ORDER BY create_time DESC;
    

⚙️ 系统架构

┌──────────────┐
│   浏览器     │
└──────┬───────┘
       │ :10080 ← 唯一对外端口
┌──────▼───────┐
│  Frontend    │
│  (Nginx)     │
└──────┬───────┘
       │
   ┌───┴──────────────┐
   │                  │
┌──▼────┐      ┌──────▼──────┐
│Backend│      │  Python     │
│ :8080 │──────│  Service    │
│       │      │  :8000(CPU) │
└─┬──┬──┘      └─────────────┘
  │  │
  │  │  ┌──────────────┐
  │  └──│ MinIO(外部)  │
  │     │ 49.232...    │
  │     └──────────────┘
  │
┌─▼────────┐
│  MySQL   │
│  Redis   │
└──────────┘

🎯 工作流程

巡检任务执行流程

1. 启动任务
   └── 创建InspectionTaskRecord (status=1执行中)

2. 录制视频
   ├── 从RTSP流录制30秒
   ├── 上传到MinIO
   └── 更新record.accessory = "原始视频URL"

3. AI识别
   ├── 逐帧分析视频
   ├── 调用Python服务(YOLOv8)
   ├── 检测结果去重
   └── 创建AlarmRecord不重复

4. 保存结果
   ├── 绘制检测框
   ├── 上传处理后视频
   ├── 更新record.accessory += ";处理后URL"
   └── 更新record.result = "检测结果摘要"

5. 完成
   ├── record.status = 0 (成功)
   ├── record.duration = 实际时长
   └── task.status = 2 (已完成)

📝 配置摘要

Docker服务配置

服务 容器名 端口 暴露
MySQL rtsp-mysql 3306
Redis rtsp-redis 6379
Python rtsp-python-service 8000
Backend rtsp-backend 8080
Frontend rtsp-frontend 80→10080
MinIO 外部服务 10900 -

巡检任务配置

配置项 位置
Python服务URL http://rtsp-python-service:8000 VideoAnalysisService.java
模型名称 yolov8_detector VideoAnalysisService.java
检测频率 每10帧 processVideoWithRecord()
去重容差 10像素 generateDetectionKey()
去重时间窗口 60秒 processVideoWithRecord()

💡 使用建议

性能优化CPU模式

  1. 使用最小模型

    • yolov8n.pt推荐
    • 而不是yolov8l.pt或yolov8x.pt
  2. 降低检测频率

    if (frameCount % 30 == 0) { // 从10改为30
    
  3. 缩短录制时长

    task.setDuration(15); // 从30秒改为15秒
    

MinIO Bucket准备

需要在外部MinIO服务中创建以下bucket

  • inspection-videos - 巡检视频
  • alarm-images - 告警图片

数据库表确认

确保以下表存在:

  • v_inspection_task - 巡检任务
  • v_inspection_task_record - 巡检记录
  • v_alarm_record - 告警记录
  • v_minio_object - MinIO对象
  • v_device - 设备信息

🐛 常见问题

Q1: 视频未保存

检查

docker-compose logs backend | grep "MinIO"
curl http://49.232.154.205:10900/minio/health/live

Q2: Python识别失败

检查

docker-compose logs python-service
docker exec -it rtsp-python-service ls -lh /app/models/best.pt

Q3: 告警重复

调整

// generateDetectionKey中增大容差
int x = rect.x() / 20 * 20;  // 从10改为20

Q4: 执行时间过长

优化

  • 降低检测频率每30帧而不是10帧
  • 缩短录制时长
  • 使用更小的YOLOv8模型

📞 获取帮助

查看日志

# 所有服务
docker-compose logs -f

# 后端
docker-compose logs -f backend

# Python服务
docker-compose logs -f python-service

查看数据

-- 最新的执行记录
SELECT * FROM v_inspection_task_record ORDER BY create_time DESC LIMIT 10;

-- 最新的告警
SELECT * FROM v_alarm_record ORDER BY create_time DESC LIMIT 10;

-- 统计信息
SELECT 
    t.task_id,
    COUNT(DISTINCT r.record_id) as execution_count,
    COUNT(DISTINCT a.alarm_id) as alarm_count
FROM v_inspection_task t
LEFT JOIN v_inspection_task_record r ON t.task_id = r.task_id
LEFT JOIN v_alarm_record a ON t.task_id = a.task_id
GROUP BY t.task_id;

🎓 学习资源

总结

部署方面

完整的Docker部署方案 YOLOv8 CPU模式支持
外部MinIO集成 容器间使用容器名通信 只暴露前端端口10080 完整的健康检查和依赖管理

功能方面

自动创建巡检记录 自动录制和保存视频 调用Python服务(YOLOv8)识别 自动更新识别结果 创建不重复的告警记录 完整的异常处理和日志记录

文档方面

10个详细的文档文件 工作流程图示 配置说明 故障排查指南 SQL查询示例


项目状态: 完成 部署状态: 待部署 测试状态: 待测试 文档版本: 1.0 最后更新: 2025-09-30

🎊 所有功能已完整实现,可以开始部署和测试!