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绕过, 视频监控, 请求拦截, 逆向工具