T0ks1k24/secure-monitoring-system
GitHub: T0ks1k24/secure-monitoring-system
基于 YOLOv8 和微服务架构的 AI 驱动视频监控平台,通过实时目标检测和区域安全规则实现智能告警与证据留存。
Stars: 0 | Forks: 0
# 安全监控系统
一个采用微服务架构构建的生产级 AI 驱动的视频监控平台。该系统捕获实时摄像头视频流,应用实时目标检测与追踪,评估基于区域的安全规则,并将即时警报推送到 Electron 桌面应用程序。
## 目录
- [概述](#overview)
- [核心功能](#key-features)
- [架构](#architecture)
- [服务](#services)
- [快速开始](#quick-start)
- [配置](#configuration)
- [API 参考](#api-reference)
- [开发](#development)
- [项目结构](#project-structure)
## 概述
```
IP Cameras (RTSP)
│
▼
┌─────────────┐ WebRTC/HLS ┌──────────────────┐
│ MediaMTX │ ──────────────────► │ Electron Frontend│
│ (RTSP Hub) │ │ (React + Redux) │
└──────┬──────┘ └────────┬─────────┘
│ RTSP │ HTTP (zones / cameras)
▼ ▼
┌──────────────────┐ ┌─────────────────────┐
│ Frame Extractor │ │ Backend Service │
│ (Python/RTSP) │ │ (FastAPI + PG) │
└────────┬─────────┘ └──────────┬──────────┘
│ JPEG frames │ WebSocket (events)
▼ │ RabbitMQ (zones)
┌─────────────────┐ RabbitMQ │
│ AI Service │ ──────────────────────► │
│ YOLOv8 + Zones │ security.events │
└─────────────────┘ │
▼
┌─────────────┐
│ PostgreSQL │
└─────────────┘
```
## 核心功能
| 功能 | 详情 |
|---|---|
| **实时检测** | 可配置 FPS 的 YOLOv8 目标检测 |
| **多目标追踪** | 每个摄像头跨帧保持持久的 track ID |
| **区域规则** | 限制区 / 周界 / 停车区 / 行人区 / 计数区 |
| **智能分析** | 徘徊、拥挤、方向违规、遗留物检测 |
| **实时警报** | 通过 WebSocket 在亚秒级内将事件传递给所有连接的客户端 |
| **证据帧** | 为每个区域事件保存带标注的 JPEG 快照 |
| **热重载区域** | 通过 RabbitMQ 将区域更改传播到 AI 服务,无需重启 |
| **基于角色的访问控制** | 具有 JWT 身份验证的管理员 / 操作员角色 |
| **Electron 桌面应用** | Kiosk 模式、多窗口支持、可拖拽的摄像头网格 |
| **Docker 编排** | 整个技术栈通过一条 `docker compose up` 命令运行 |
## 架构
系统分为两个逻辑层:
### 云端层
运行在服务器或虚拟机上。负责处理 AI 计算、数据持久化和 API。
| 服务 | 端口 | 技术 | 角色 |
|---|---|---|---|
| `backend` | 8000 | FastAPI + PostgreSQL | REST API、身份验证、WebSocket、事件存储 |
| `ai_service` | 5000 | FastAPI + YOLOv8 | 目标检测、追踪、区域分析 |
| `postgres` | 5432 | PostgreSQL 16 | 持久化存储事件、区域、用户 |
| `rabbitmq` | 5672 / 15672 | RabbitMQ 3 | AI → Backend 和 Backend → AI 之间的异步消息传递 |
### 本地层
在 onsite 运行,靠近摄像头。
| 服务 | 端口 | 技术 | 角色 |
|---|---|---|---|
| `frame_extractor` | 8100 | FastAPI + OpenCV | 捕获 RTSP 视频帧并转发给 AI |
| `frontend` | 3000 / 80 | React + Electron | 用于监控和管理的桌面 UI |
| `mediamtx` | 8554 / 8888 / 8889 | MediaMTX | RTSP 枢纽;为前端提供 WebRTC 和 HLS 服务 |
### 数据流
**摄像头 → 警报 pipeline:**
```
ffmpeg (cam publisher)
→ MediaMTX :8554/cameraX [RTSP]
→ Frame Extractor [reads frames at DEFAULT_FPS]
→ AI Service POST /detect [JPEG + camera_id]
→ YOLO detection + tracking
→ Zone intersection
→ Risk engine + smart analytics
→ RabbitMQ "security.events" exchange [topic: events.{type}.{camera_id}]
→ Backend EventConsumer
→ PostgreSQL (persist)
→ WebSocket broadcast [to all connected frontend clients]
→ Frontend alert overlay
```
**区域更新 pipeline:**
```
Frontend draw/edit zone
→ Backend PUT /api/zones/{id}
→ PostgreSQL (persist)
→ RabbitMQ "security.zones" exchange [routing: zones.updated.{camera_id}]
→ AI Service zone cache invalidation [hot-reload, no restart needed]
```
### RabbitMQ 拓扑
| Exchange | 类型 | 发布者 | 消费者 |
|---|---|---|---|
| `security.events` | topic | AI Service | Backend (binding `events.#`) |
| `security.zones` | topic | Backend | AI Service (exclusive queue) |
## 服务
### Backend 服务 (`cloud/backend_service/`)
采用整洁架构分层(表现层 → 应用层 → 领域层 → 基础设施层)的 FastAPI 应用程序。
**职责:**
- JWT 身份验证(access + refresh token,管理员/操作员角色)
- 区域 CRUD(创建、列表、更新、删除)
- 从 RabbitMQ 获取事件并存储在 PostgreSQL 中
- 通过 WebSocket 向前端广播实时事件
- 通过 RabbitMQ 向 AI 服务发送区域更新通知
**默认管理员凭据**(首次启动时创建):
- 用户名: `admin`
- 密码: `admin` *(在生产环境中请务必修改!)*
### AI Model 服务 (`cloud/ai_model_service/`)
具有多步骤检测 pipeline 的 FastAPI 应用程序。
**检测 pipeline(每一帧):**
1. **YOLOv8** — 目标检测(人、汽车、刀等)
2. **Tracker** — 为每个摄像头分配持久的 `track_id`
3. **区域相交** — 检查每个轨迹占据了哪些区域
4. **风险引擎** — 应用区域规则(例如,限制区内出现人 → HIGH)
5. **智能分析** — 徘徊、拥挤、遗留物、方向
6. **RabbitMQ 发布** — 将 `SecurityEvent` JSON 发布到 `security.events`
7. **证据存储** — 为区域触发的事件保存带标注的 JPEG
**区域类型及默认规则:**
| 区域类型 | 触发条件 | 风险等级 |
|---|---|---|
| `restricted` | 任何物体进入 | HIGH |
| `pedestrian` | 车辆进入 | HIGH |
| `parking` | 人(非车辆)进入 | MEDIUM |
| `entrance` | 任何移动(非工作时间) | MEDIUM |
| `perimeter` | 任何移动 | MEDIUM |
| `counting_line` | 物体越线 | LOW |
| `safe_zone` | 风险累积降低 | — |
### Frame Extractor 服务 (`local/frame_extractor_service/`)
管理一组摄像头 worker 的 FastAPI 应用程序。
**职责:**
- 为每个摄像头维护与 MediaMTX 的 RTSP 连接
- 将帧提取限流至 `DEFAULT_FPS`(默认值:2.0)
- 将帧编码为 JPEG 并转发至 AI Service
- 在 SQLite 中持久化摄像头配置
- 将 `localhost` RTSP URL 重写为 `mediamtx` 以适应 Docker 网络
**摄像头 worker 生命周期:** `STOPPED → CONNECTING → RUNNING → ERROR → CONNECTING → …`
### Frontend 服务 (`local/frontend_service/`)
Electron + React 桌面应用程序。
**页面:**
- **监控** — 实时 RTSP 视频流 (WebRTC)、区域绘制、实时事件信息流
- **摄像头网格** — 多摄像头视图,带有每个摄像头的警报覆盖层
- **分析** — 事件统计、风险分布图表、热力图
- **设置** — 摄像头管理、连接设置、显示网格配置、访问控制
**核心功能:**
- 直接在视频流上绘制和编辑检测区域
- 通过 WebSocket 连接到后端,实现实时事件流传输
- 为专用监控站提供 Kiosk 模式
- 支持具有独立 localStorage 状态的多窗口
- 自动刷新 token (JWT)
## 快速开始
### 前置条件
- Docker ≥ 24 和 Docker Compose ≥ 2.20
- 两个放置在 `./video/cam1.mp4` 和 `./video/cam2.mp4` 的摄像头视频文件
*(可选 `cam3.mp4` 作为第三个摄像头)*
### 1. 克隆并启动
```
git clone https://github.com/T0ks1k24/secure-monitoring-system.git
cd secure-monitoring-system
# 复制视频文件(未在 git 中追踪):
# cp /your/video.mp4 ./video/cam1.mp4
# cp /your/video2.mp4 ./video/cam2.mp4
# 启动所有服务
docker compose up -d
# 或使用 Makefile:
make docker-start-d
```
### 2. 等待服务就绪
```
docker compose ps # all services should be "healthy"
docker compose logs -f # watch startup logs
```
典型启动顺序:`postgres` → `rabbitmq` → `backend` → `ai_service` → `frame_extractor`
### 3. 打开前端
Web 前端可在 **http://localhost:3000** 访问
如需运行 Electron 桌面应用,请在本地执行:
```
cd local/frontend_service/frontend
npm install
npm run electron:dev
```
### 4. 登录
- **用户名:** `admin`
- **密码:** `admin`
### 5. 添加摄像头
1. 前往 **Settings → Camera Settings → Add Camera**
2. 输入 RTSP URL:`rtsp://localhost:8554/camera1`
3. 帧提取器开始捕获;事件将在几秒钟内出现
## 配置
### 环境变量
#### Backend 服务 (`cloud/backend_service/backend/.env`)
| 变量 | 默认值 | 描述 |
|---|---|---|
| `DATABASE_URL` | `sqlite:///./local.db` | PostgreSQL 连接字符串 |
| `RABBITMQ_URL` | `amqp://guest:guest@rabbitmq:5672/` | RabbitMQ AMQP URL |
| `JWT_SECRET` | `SUPER_SECRET_KEY` | **在生产环境中务必修改!** |
| `JWT_ALGORITHM` | `HS256` | JWT 签名算法 |
| `ACCESS_TOKEN_EXPIRE_MINUTES` | `15` | Access token 有效期 |
| `REFRESH_TOKEN_EXPIRE_DAYS` | `30` | Refresh token 有效期 |
| `EVENTS_EXCHANGE` | `security.events` | RabbitMQ 事件 Exchange 名称 |
| `ZONES_EXCHANGE` | `security.zones` | RabbitMQ 区域 Exchange 名称 |
| `EVENTS_QUEUE` | `backend.events` | 用于后端消费的持久化队列 |
#### AI Model 服务 (`cloud/ai_model_service/.env`)
| 变量 | 默认值 | 描述 |
|---|---|---|
| `BACKEND_API_URL` | `http://backend:8000` | 从后端获取区域的 URL |
| `RABBITMQ_URL` | `amqp://guest:guest@rabbitmq:5672/` | RabbitMQ 连接 |
| `MODEL_PATH` | `yolo26s.pt` | YOLO 模型权重路径 |
| `DETECTION_CONFIDENCE` | `0.4` | 检测置信度阈值 (0.0–1.0) |
| `DETECTION_IOU` | `0.45` | NMS IoU 阈值 |
| `INFERENCE_IMG_SIZE` | `640` | YOLO 输入尺寸 (320 / 640 / 1280) |
| `DEVICE` | `cpu` | 推理设备:`cpu`, `cuda`, `mps` |
| `SAVE_PROCESSED_FRAMES` | `False` | 将带标注的帧保存到磁盘 |
| `EVIDENCE_PUBLIC_BASE_URL` | `http://localhost:5000` | 用于证据图片链接的公开 URL |
| `ZONE_CACHE_TTL` | `30.0` | 区域缓存 TTL(秒) |
| `DEBUG_VISUALIZE` | `False` | 显示 cv2.imshow 调试窗口 |
#### Frame Extractor 服务 (`local/frame_extractor_service/.env`)
| 变量 | 默认值 | 描述 |
|---|---|---|
| `AI_SERVICE_URL` | `http://localhost:5000/api/v1/detect` | AI 服务检测 endpoint |
| `AI_REQUEST_TIMEOUT` | `5` | AI 请求的 HTTP 超时时间(秒) |
| `DEFAULT_FPS` | `2.0` | 默认帧提取率 |
| `DEFAULT_RESIZE_WIDTH` | `1280` | 编码前的帧调整宽度 |
| `DEFAULT_JPEG_QUALITY` | `95` | JPEG 压缩质量 (1–100) |
| `DEFAULT_RECONNECT_DELAY` | `3` | RTSP 重连前的等待秒数 |
| `RTSP_LOCALHOST_REWRITE_HOST` | `mediamtx` | 替换 RTSP URL 中的 `localhost` (Docker) |
| `DATABASE_URL` | `sqlite:///./cameras.db` | 用于存储摄像头配置的 SQLite 路径 |
#### Frontend (`local/frontend_service/frontend/.env` 或 Docker 构建参数)
| 变量 | 默认值 | 描述 |
|---|---|---|
| `VITE_API_URL` | `http://localhost:8000` | 后端 API 基础 URL |
| `VITE_FRAME_API_URL` | `http://localhost:8100` | Frame extractor API URL |
| `VITE_MEDIA_MTX_HLS_URL` | `http://localhost:8888` | MediaMTX HLS endpoint |
| `VITE_MEDIA_MTX_WEBRTC_URL` | `http://localhost:8889` | MediaMTX WebRTC endpoint |
| `VITE_WS_EVENTS_URL` | *(从 API URL 推导)* | WebSocket 事件 endpoint |
## API 参考
查看 [docs/api-reference.md](docs/api-reference.md) 获取完整的 API 参考。
**交互式文档**(运行时可用):
- Backend: http://localhost:8000/docs
- AI Service: http://localhost:5000/docs
- Frame Extractor: http://localhost:8100/docs
## 开发
查看 [docs/development.md](docs/development.md) 获取开发指南。
### Makefile 命令
```
make docker-start-d # Start all services in background
make docker-stop # Stop all services
make docker-rebuild # Full rebuild (no cache)
make docker-clean # Stop + remove volumes
make docker-logs # Stream all logs
make docker-logs-backend # Stream backend logs only
make db-reset # Drop and recreate the database
make db-shell # Open psql shell
make backend-shell # Open shell in backend container
```
## 项目结构
```
secure_monitoring_system/
│
├── cloud/ # Cloud-side services
│ ├── backend_service/
│ │ └── backend/ # FastAPI backend
│ │ ├── core/ # JWT, config, WebSocket manager
│ │ ├── domain/ # Entities, enums, repository interfaces
│ │ ├── application/ # Services, DTOs
│ │ ├── infrastructure/ # SQLAlchemy models, repos, RabbitMQ
│ │ └── presentation/ # FastAPI routers (controllers)
│ │
│ └── ai_model_service/ # AI detection service
│ ├── models/ # YOLO model loader
│ ├── services/ # Pipeline, tracker, zone manager, risk engine
│ ├── schemas/ # Pydantic event/zone schemas
│ ├── config/ # Settings
│ └── api/ # FastAPI routes
│
├── local/ # On-site services
│ ├── frame_extractor_service/ # RTSP frame capture
│ │ ├── core/ # CameraManager, CameraWorker, factory, repository
│ │ ├── core/implementations/ # RTSPFrameSource, AIClientSink
│ │ ├── detection/ # Motion detector processor
│ │ ├── api/ # FastAPI cameras and system routes
│ │ └── schemas.py # Pydantic request/response models
│ │
│ └── frontend_service/
│ └── frontend/
│ ├── electron/ # Electron main process + preload
│ └── src/
│ ├── components/ # Reusable React components
│ ├── hooks/ # useEventStream, useKioskMode
│ ├── pages/ # Monitoring, CamerasGrid, Analytics, Settings
│ ├── services/ # RTK Query API slices (camerasApi, zonesApi, eventsApi)
│ │ └── auth/ # baseQueryWithRefresh, authSlice
│ ├── store/ # Redux store
│ └── utils/ # windowStorage
│
├── mediamtx/
│ └── mediamtx.yml # MediaMTX configuration
│
├── video/ # Camera test videos (not in git)
│ ├── cam1.mp4
│ ├── cam2.mp4
│ └── cam3.mp4
│
├── docker-compose.yml # Full stack (development + production)
├── docker-compose.local.yml # Local-only (frontend + frame_extractor)
├── docker-compose.cloud.yml # Cloud-only (backend + AI + infra)
├── Makefile # Convenience commands
└── docs/
├── architecture.md # Detailed architecture documentation
├── api-reference.md # Complete API reference
└── development.md # Developer guide
```
## 许可证
本项目为卢茨克国立技术大学 (LNTU) 126 专业——信息系统与技术——的毕业设计论文。
标签:AV绕过, Electron桌面应用, FastAPI, YOLOv8, 人工智能, 微服务架构, 测试用例, 用户模式Hook绕过, 视频监控, 请求拦截, 逆向工具