将检测任务迁移python

This commit is contained in:
2025-09-30 14:23:33 +08:00
parent 3fe5f8083d
commit 39d39a7a24
69 changed files with 7921 additions and 1836 deletions

567
COMPLETE-SUMMARY.md Normal file
View File

@@ -0,0 +1,567 @@
# 🎉 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部署
```bash
# 1. 准备YOLOv8模型
# 将best.pt放到: python-inference-service/models/best.pt
# 2. 一键部署
deploy.bat # Windows
# 3. 访问系统
# http://localhost:10080
```
### 2. 创建巡检任务
```java
// 创建任务
InspectionTask task = new InspectionTask();
task.setDeviceId(deviceId);
task.setDuration(30); // 录制30秒
task.setStatus(0); // 待执行
inspectionTaskService.insertInspectionTask(task);
// 启动任务
inspectionTaskService.executeInspectionTask(task.getTaskId());
```
### 3. 查看结果
```sql
-- 查看执行记录
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
```bash
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
```yaml
minio:
endpoint: http://49.232.154.205:10900
access-key: 4EsLD9g9OM09DT0HaBKj
secret-key: 05SFC5fleqTnaLRYBrxHiphMFYbGX5nYicj0WCHA
bucket: rtsp
```
### 3. Python服务URL
```java
// 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** - 快速启动指南
### 部署相关
3. **README-DOCKER.md** - 完整部署文档
4. **DEPLOYMENT-NOTES.md** - 详细配置说明
5. **YOLOV8-SETUP.md** - YOLOv8模型配置
### 功能相关
6. **INSPECTION-FEATURE-SUMMARY.md** - 巡检功能总结
7. **INSPECTION-WORKFLOW.md** - 详细工作流程
### 更新记录
8. **UPDATE-SUMMARY.md** - 更新变更记录
9. **DEPLOYMENT-FILES.md** - 文件清单
10. **COMPLETE-SUMMARY.md** - 本文档
## 🔍 验证清单
### Docker部署验证
- [ ] 所有容器运行正常
```bash
docker-compose ps
```
- [ ] 前端可访问
```
http://localhost:10080
```
- [ ] Python服务健康
```bash
docker-compose logs python-service | grep "YOLOv8模型加载完成"
```
- [ ] 后端连接正常
```bash
docker-compose logs backend | grep "Started RuoYiApplication"
```
### 巡检功能验证
- [ ] 创建测试任务
- [ ] 执行任务
- [ ] 检查Record创建
```sql
SELECT * FROM v_inspection_task_record ORDER BY create_time DESC LIMIT 1;
```
- [ ] 检查视频保存
```sql
SELECT accessory FROM v_inspection_task_record WHERE record_id = ?;
```
- [ ] 检查识别结果
```sql
SELECT result FROM v_inspection_task_record WHERE record_id = ?;
```
- [ ] 检查告警创建
```sql
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. **降低检测频率**
```java
if (frameCount % 30 == 0) { // 从10改为30
```
3. **缩短录制时长**
```java
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: 视频未保存
**检查**
```bash
docker-compose logs backend | grep "MinIO"
curl http://49.232.154.205:10900/minio/health/live
```
### Q2: Python识别失败
**检查**
```bash
docker-compose logs python-service
docker exec -it rtsp-python-service ls -lh /app/models/best.pt
```
### Q3: 告警重复
**调整**
```java
// generateDetectionKey中增大容差
int x = rect.x() / 20 * 20; // 从10改为20
```
### Q4: 执行时间过长
**优化**
- 降低检测频率每30帧而不是10帧
- 缩短录制时长
- 使用更小的YOLOv8模型
## 📞 获取帮助
### 查看日志
```bash
# 所有服务
docker-compose logs -f
# 后端
docker-compose logs -f backend
# Python服务
docker-compose logs -f python-service
```
### 查看数据
```sql
-- 最新的执行记录
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;
```
## 🎓 学习资源
- [Ultralytics YOLOv8文档](https://docs.ultralytics.com/)
- [Docker Compose文档](https://docs.docker.com/compose/)
- [FFmpeg JavaCV文档](https://github.com/bytedeco/javacv)
- [MinIO文档](https://min.io/docs/minio/linux/index.html)
## ✨ 总结
### 部署方面
✅ 完整的Docker部署方案
✅ YOLOv8 CPU模式支持
✅ 外部MinIO集成
✅ 容器间使用容器名通信
✅ 只暴露前端端口10080
✅ 完整的健康检查和依赖管理
### 功能方面
✅ 自动创建巡检记录
✅ 自动录制和保存视频
✅ 调用Python服务(YOLOv8)识别
✅ 自动更新识别结果
✅ 创建不重复的告警记录
✅ 完整的异常处理和日志记录
### 文档方面
✅ 10个详细的文档文件
✅ 工作流程图示
✅ 配置说明
✅ 故障排查指南
✅ SQL查询示例
---
**项目状态**: ✅ 完成
**部署状态**: 待部署
**测试状态**: 待测试
**文档版本**: 1.0
**最后更新**: 2025-09-30
🎊 **所有功能已完整实现,可以开始部署和测试!**