416 lines
8.9 KiB
Markdown
416 lines
8.9 KiB
Markdown
# AI监控系统帮助文档
|
||
|
||
## 📖 项目简介
|
||
|
||
AI监控系统是一个基于Python的实时视频监控解决方案,支持RTSP视频流接入、AI智能检测、实时告警和Web界面展示。系统集成YOLOv8目标检测模型,支持昇腾NPU加速,可广泛应用于安防监控、生产安全等场景。
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 环境要求
|
||
|
||
- **Python**: 3.7+
|
||
- **操作系统**: Linux/macOS/Windows
|
||
- **硬件**: 支持昇腾NPU(可选,也支持CPU推理)
|
||
- **内存**: 建议4GB+
|
||
- **存储**: 根据视频录制需求配置
|
||
|
||
### 安装依赖
|
||
|
||
```bash
|
||
# 克隆项目(如果从git仓库)
|
||
git clone <repository_url>
|
||
cd AIMonitor
|
||
|
||
# 安装Python依赖
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 依赖包说明
|
||
|
||
```
|
||
opencv-python>=4.9.0 # 计算机视觉库
|
||
PyYAML>=6.0 # YAML配置文件解析
|
||
websockets>=12.0 # WebSocket服务器
|
||
Flask>=3.0.0 # Web框架
|
||
onnxruntime # ONNX模型推理(支持昇腾NPU)
|
||
```
|
||
|
||
### 启动系统
|
||
|
||
#### 方式一:使用启动脚本(推荐)
|
||
|
||
```bash
|
||
# 简单启动(推荐新手使用)
|
||
python3 simple_start.py
|
||
|
||
# 完整启动器(功能更多)
|
||
python3 start.py
|
||
|
||
# Shell脚本启动
|
||
./run.sh
|
||
```
|
||
|
||
#### 方式二:手动启动
|
||
|
||
```bash
|
||
# 终端1:启动RTSP视频流处理服务
|
||
python3 rtsp_service_ws.py
|
||
|
||
# 终端2:启动静态文件服务
|
||
python3 static_server.py
|
||
```
|
||
|
||
### 验证启动
|
||
|
||
启动成功后,可以看到以下输出:
|
||
|
||
```
|
||
=== 系统启动完成 ===
|
||
RTSP WebSocket服务: ws://localhost:8765
|
||
静态文件服务: http://localhost:5000
|
||
```
|
||
|
||
使用以下命令验证端口监听:
|
||
|
||
```bash
|
||
netstat -an | grep -E "(8765|5000)"
|
||
```
|
||
|
||
## ⚙️ 配置说明
|
||
|
||
### 摄像头配置 (`config.yaml`)
|
||
|
||
```yaml
|
||
cameras:
|
||
- id: 1
|
||
name: "入口监控"
|
||
rtsp_url: "rtsp://username:password@ip:port/stream"
|
||
- id: 2
|
||
name: "车间监控"
|
||
rtsp_url: "rtsp://8.130.165.33:8554/test"
|
||
```
|
||
|
||
**参数说明:**
|
||
- `id`: 摄像头唯一标识符
|
||
- `name`: 摄像头显示名称
|
||
- `rtsp_url`: RTSP视频流地址
|
||
|
||
### 系统参数配置 (`rtsp_service_ws.py`)
|
||
|
||
```python
|
||
RTSP_TARGET_FPS = 10.0 # 视频处理帧率
|
||
FRAMES_PER_SEGMENT = 600 # 每个视频片段帧数(约1分钟)
|
||
VIDEO_OUTPUT_DIR = "./videos" # 视频输出目录
|
||
WS_HOST = "0.0.0.0" # WebSocket监听地址
|
||
WS_PORT = 8765 # WebSocket端口
|
||
```
|
||
|
||
## 🔧 核心功能
|
||
|
||
### 1. RTSP视频流处理
|
||
|
||
- 支持多路RTSP视频流同时接入
|
||
- 自动重连机制
|
||
- 视频分段录制(每600帧一个文件)
|
||
- 智能抽帧处理,保证系统性能
|
||
|
||
### 2. AI智能检测
|
||
|
||
基于YOLOv8模型的目标检测:
|
||
- **模型位置**: `YOLO_Weight/` 目录
|
||
- **支持类别**: supervisor(监督员)、suspect(嫌疑人员)
|
||
- **推理加速**: 支持昇腾NPU和CPU推理
|
||
- **自定义扩展**: 可修改`user_process_frame`函数添加自定义算法
|
||
|
||
### 3. 实时告警系统
|
||
|
||
- 基于WebSocket的实时告警推送
|
||
- 支持不同级别的告警分类
|
||
- 自动关联视频录像
|
||
- 告警信息包含时间戳、摄像头ID、事件类型
|
||
|
||
### 4. Web访问接口
|
||
|
||
#### WebSocket接口 (`ws://localhost:8765`)
|
||
|
||
**消息类型:**
|
||
|
||
1. **实时帧数据**
|
||
```json
|
||
{
|
||
"msg_type": "frame",
|
||
"camera_id": 1,
|
||
"timestamp": 1672531200.123,
|
||
"result_type": 0,
|
||
"image_base64": "base64编码的图像数据"
|
||
}
|
||
```
|
||
|
||
2. **告警消息**
|
||
```json
|
||
{
|
||
"msg_type": "alert",
|
||
"camera_id": 1,
|
||
"event_type": 1,
|
||
"video_file": "./videos/20231201_120000_cam1.mp4",
|
||
"timestamp": 1672531200.123
|
||
}
|
||
```
|
||
|
||
#### HTTP文件服务 (`http://localhost:5000`)
|
||
|
||
**访问格式:**
|
||
```
|
||
http://localhost:5000/{camera_id}/{video_filename}
|
||
```
|
||
|
||
**示例:**
|
||
```
|
||
http://localhost:5000/1/20231201_120000_cam1.mp4
|
||
```
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
AIMonitor/
|
||
├── config.yaml # 摄像头配置文件
|
||
├── requirements.txt # Python依赖列表
|
||
├── rtsp_service_ws.py # 主服务程序
|
||
├── static_server.py # 静态文件服务
|
||
├── npu_yolo_onnx.py # YOLO模型推理
|
||
├── start.py # 完整启动器
|
||
├── simple_start.py # 简单启动脚本
|
||
├── run.sh # Shell启动脚本
|
||
├── videos/ # 录制视频目录
|
||
├── YOLO_Weight/ # YOLO模型权重
|
||
├── ONNX_Weight/ # ONNX模型文件
|
||
├── YOLO_Pipe_results/ # YOLO处理结果
|
||
└── __pycache__/ # Python缓存
|
||
```
|
||
|
||
## 🔄 使用流程
|
||
|
||
### 1. 配置摄像头
|
||
|
||
编辑 `config.yaml` 文件,添加您的RTSP摄像头信息:
|
||
|
||
```yaml
|
||
cameras:
|
||
- id: 1
|
||
name: "前门"
|
||
rtsp_url: "rtsp://admin:password@192.168.1.100:554/stream1"
|
||
```
|
||
|
||
### 2. 启动系统
|
||
|
||
```bash
|
||
python3 simple_start.py
|
||
```
|
||
|
||
### 3. 检查运行状态
|
||
|
||
查看日志输出确认服务正常启动:
|
||
|
||
```
|
||
[INFO] WebSocket server started at ws://0.0.0.0:8765
|
||
[INFO] Start capturing: id=1, name=前门
|
||
[INFO] FrameProcessorWorker started
|
||
* Running on http://0.0.0.0:5000
|
||
```
|
||
|
||
### 4. 访问服务
|
||
|
||
- **WebSocket客户端**: 连接 `ws://localhost:8765` 接收实时数据
|
||
- **视频回放**: 访问 `http://localhost:5000/{camera_id}/{filename}` 查看录制视频
|
||
|
||
## 🎯 自定义开发
|
||
|
||
### 添加自定义AI算法
|
||
|
||
修改 `rtsp_service_ws.py` 中的 `user_process_frame` 函数:
|
||
|
||
```python
|
||
def user_process_frame(image, camera_id: int, timestamp: float) -> Dict[str, Any]:
|
||
"""
|
||
自定义AI处理函数
|
||
|
||
Args:
|
||
image: numpy.ndarray (BGR格式)
|
||
camera_id: 摄像头ID
|
||
timestamp: 时间戳
|
||
|
||
Returns:
|
||
{
|
||
"image": processed_image, # 处理后的图像
|
||
"type": result_type # 结果类型(0=正常,>0=告警)
|
||
}
|
||
"""
|
||
# 在这里实现您的自定义算法
|
||
result_type = 0
|
||
|
||
# 示例:调用YOLO检测
|
||
yolo = YOLOv8_ONNX("YOLO_Weight/yolov8n.onnx")
|
||
detections = yolo(image)
|
||
|
||
# 根据检测结果设置告警类型
|
||
if len(detections) > 0:
|
||
result_type = 1 # 检测到目标
|
||
|
||
return {
|
||
"image": image,
|
||
"type": result_type,
|
||
}
|
||
```
|
||
|
||
### 扩展告警逻辑
|
||
|
||
在检测结果处理部分添加自定义告警逻辑:
|
||
|
||
```python
|
||
# 在FrameProcessorWorker.run()方法中
|
||
if result_type != 0:
|
||
# 自定义告警处理
|
||
alert_msg = {
|
||
"msg_type": "alert",
|
||
"camera_id": camera_id,
|
||
"event_type": result_type,
|
||
"video_file": video_filepath,
|
||
"timestamp": ts,
|
||
"custom_data": "您可以添加的自定义数据"
|
||
}
|
||
self.ws_send_queue.put(alert_msg)
|
||
```
|
||
|
||
## 🐛 故障排除
|
||
|
||
### 常见问题
|
||
|
||
#### 1. RTSP连接失败
|
||
|
||
**错误**: `Cannot open RTSP stream`
|
||
|
||
**解决方案**:
|
||
- 检查RTSP地址格式是否正确
|
||
- 验证摄像头用户名密码
|
||
- 确认网络连接正常
|
||
- 检查摄像头是否支持RTSP协议
|
||
|
||
#### 2. 端口被占用
|
||
|
||
**错误**: `Address already in use`
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 查找占用端口的进程
|
||
lsof -i :8765
|
||
lsof -i :5000
|
||
|
||
# 终止进程
|
||
kill -9 <PID>
|
||
```
|
||
|
||
#### 3. 依赖安装失败
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 更新pip
|
||
pip install --upgrade pip
|
||
|
||
# 使用国内镜像源
|
||
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
|
||
```
|
||
|
||
#### 4. YOLO模型加载失败
|
||
|
||
**错误**: `Failed to load model`
|
||
|
||
**解决方案**:
|
||
- 检查模型文件路径是否正确
|
||
- 确认模型文件完整性
|
||
- 验证ONNX模型格式
|
||
|
||
### 性能优化
|
||
|
||
#### 1. 降低处理帧率
|
||
|
||
```python
|
||
RTSP_TARGET_FPS = 5.0 # 从10降到5fps
|
||
```
|
||
|
||
#### 2. 调整视频片段长度
|
||
|
||
```python
|
||
FRAMES_PER_SEGMENT = 300 # 从600降到300帧(30秒)
|
||
```
|
||
|
||
#### 3. 限制并发连接数
|
||
|
||
```python
|
||
# 在WebSocket处理中添加连接数限制
|
||
MAX_CLIENTS = 10
|
||
if len(ws_clients) >= MAX_CLIENTS:
|
||
websocket.close()
|
||
```
|
||
|
||
## 📊 性能监控
|
||
|
||
### 系统资源监控
|
||
|
||
```bash
|
||
# 监控CPU和内存使用
|
||
top -p $(pgrep -f "rtsp_service_ws|static_server")
|
||
|
||
# 监控网络连接
|
||
netstat -an | grep -E "(8765|5000)"
|
||
|
||
# 监控磁盘空间
|
||
df -h ./videos
|
||
```
|
||
|
||
### 日志查看
|
||
|
||
系统日志实时输出包含:
|
||
- `[INFO]`: 正常运行信息
|
||
- `[WARN]`: 警告信息(如队列满、丢帧)
|
||
- `[ERROR]`: 错误信息(如连接失败)
|
||
|
||
## 🔒 安全建议
|
||
|
||
### 1. 网络安全
|
||
- 限制WebSocket访问IP范围
|
||
- 使用HTTPS/WSS加密传输
|
||
- 定期更新依赖包
|
||
|
||
### 2. 数据安全
|
||
- 定期备份重要配置
|
||
- 设置视频文件访问权限
|
||
- 合理配置视频保留期限
|
||
|
||
### 3. 系统安全
|
||
- 使用非root用户运行
|
||
- 配置防火墙规则
|
||
- 监控异常访问
|
||
|
||
## 📞 技术支持
|
||
|
||
### 日志收集
|
||
遇到问题时,请提供以下信息:
|
||
1. 系统环境信息(操作系统、Python版本)
|
||
2. 错误日志输出
|
||
3. 配置文件内容(请脱敏)
|
||
4. 系统资源使用情况
|
||
|
||
### 联系方式
|
||
如需技术支持,请通过以下方式联系:
|
||
- 提交Issue到项目仓库
|
||
- 发送邮件到技术支持邮箱
|
||
- 加入技术交流群
|
||
|
||
## 📄 许可证
|
||
|
||
本项目遵循MIT许可证,详见LICENSE文件。
|
||
|
||
---
|
||
|
||
**最后更新**: 2024-12-10
|
||
**版本**: v1.0.0 |