# jc-video-recognize 项目现状与功能梳理 > 基于 `event-judgment-algorithm-architecture.md` 和 `project-integration-plan.md` 两份架构设计文档, > 结合三个 MVP 迭代的实际代码实现,对项目当前已实现功能的全面梳理。 --- ## 文档信息 - **项目名称**: jc-video-recognize 视频模型检测平台 - **文档版本**: v2.0 - **更新日期**: 2026-06-16 - **覆盖范围**: MVP-1(事件判断管道)+ MVP-2(RTSP/MQTT/实时推送)+ MVP-3(LLM 二次判断) --- ## 1. 项目概述 本项目是一个全栈视频智能检测平台,集成了多种 AI 检测模型(YOLO 系列 + PaddlePaddle 系列),覆盖火灾、安全帽、人群、抽烟、徘徊、车辆违停、打架斗殴等场景。系统在原始检测能力基础上,构建了完整的事件判断管道、RTSP 视频流接入、MQTT 预警发布、WebSocket 实时推送、以及大模型二次判断等企业级能力。 ### 1.1 技术栈 | 层级 | 技术栈 | 说明 | |------|--------|------| | **前端** | Vue 3 + Vite 5 + Element Plus + Pinia | 暗色主题 UI,4 个核心页面 | | **后端** | FastAPI + Uvicorn | REST API + WebSocket | | **AI 推理** | YOLOv8/v10 (Ultralytics) + PaddlePaddle 3.0 | 多模型检测服务 | | **视频流** | OpenCV + RTSP | 多路摄像头实时接入 | | **消息系统** | MQTT (paho-mqtt) | 预警事件发布 | | **大模型** | OpenAI 兼容协议 (GPT-4V/Qwen-VL/GLM-4V) | 二次判断与结果融合 | | **目标跟踪** | ByteTrack (纯 Python) | 稳定跟踪 ID 分配 | | **构建部署** | pnpm + Turborepo + Docker + Nginx | Monorepo 管理 | ### 1.2 整体架构图 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ 前端 (Vue 3) │ │ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌──────────────┐ │ │ │ 模型检测 │ │ 摄像头管理 │ │ 规则配置 │ │ 预警列表 │ │ │ │ Home.vue │ │ CameraMgmt │ │ RuleConfig│ │ AlertList │ │ │ └────┬─────┘ └──────┬───────┘ └────┬─────┘ └──────┬───────┘ │ │ │ │ │ │ │ │ └───────────────┴──────────────┴───────────────┘ │ │ │ HTTP/REST + WebSocket │ └───────────────────────┼─────────────────────────────────────────────────────┘ │ ┌───────────────────────┼─────────────────────────────────────────────────────┐ │ ▼ │ │ 后端 (FastAPI) │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ API 层 │ │ │ │ /api/detect/* /api/models/* /api/rtsp/* /api/rules/* /api/llm/*│ │ │ │ /ws/camera /ws/alerts │ │ │ └──────────────────────────┬───────────────────────────────────────────┘ │ │ │ │ │ ┌──────────────────────────▼───────────────────────────────────────────┐ │ │ │ 服务层 │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌────────────┐ │ │ │ │ │ DetectionSvc │ │ RTSPService │ │ StreamMgr │ │ MQTTService│ │ │ │ │ │ (检测核心) │ │ (流接入) │ │ (多路调度) │ │ (消息发布) │ │ │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────┬─────┘ │ │ │ │ │ │ │ │ │ │ │ │ ┌──────▼────────────────▼────────────────▼────────────────▼─────┐ │ │ │ │ │ 事件判断管道 │ │ │ │ │ │ │ │ │ │ │ │ DecisionEngine → AlertRuleEngine → EventAggregator │ │ │ │ │ │ │ │ │ │ │ │ │ │ ▼ ▼ │ │ │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ LLM 二次判断管道 │ │ │ │ │ │ │ │ FrameAccumulator → LLMTrigger → LLMAnalysisService │ │ │ │ │ │ │ │ ResultFusion + LLMCostTracker (熔断降级) │ │ │ │ │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ │ └───────────────────────────────────────────────────────────────┘ │ │ │ │ │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ │ │ ByteTracker │ │ AlertPublisher│ │ DetectionAdapter │ │ │ │ │ │ (目标跟踪) │ │ (MQTT发布) │ │ (结果格式统一) │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────────────┘ │ │ │ └───────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌───────────────────────────────────────────────────────────────────┐ │ │ │ 推理引擎层 │ │ │ │ ┌─────────┐ ┌──────────────┐ ┌────────────┐ │ │ │ │ │ YOLO │ │ PaddlePaddle │ │ Docker API │ │ │ │ │ │(Ultralytics) │(PP-YOLOE) │ │ (ppTSM) │ │ │ │ │ └─────────┘ └──────────────┘ └────────────┘ │ │ │ └───────────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────────────┘ ``` --- ## 2. 已实现功能清单 ### 2.1 AI 检测能力(原始功能) | 模型 ID | 名称 | 框架 | 检测类别 | 图片检测 | 视频检测 | |---------|------|------|----------|---------|---------| | `fire_detection` | 火灾检测 | YOLOv10 | 火焰、烟雾 | ✅ | ❌ | | `helmet_detection` | 安全帽检测 | YOLOv8 | 人员、安全帽 | ✅ | ❌ | | `crowd_detection` | 人群检测 | YOLOv8 | 人员 | ✅ | ❌ | | `smoking_detection` | 抽烟检测 | YOLOv8 | 香烟、烟雾 | ✅ | ❌ | | `smoking_detection_paddle` | 抽烟检测 (Paddle) | PP-YOLOE-s | 香烟 | ✅ | ❌ | | `loitering_detection` | 徘徊检测 | YOLOv8 | 人员(含行为分析) | ✅ | ❌ | | `vehicle_detection` | 车辆检测 | PP-YOLOE-l | 车辆 | ✅ | ❌ | | `illegal_parking_detection` | 违停检测 | PP-YOLOE-l | 车辆(含违停判断) | ✅ | ❌ | | `fight_detection` | 打架斗殴检测 | YOLOv8 | 暴力行为、正常 | ✅ | ✅ | | `action_detection` | 打架检测 (Docker) | ppTSM | 打架、正常 | ✅ | ❌ | **行为分析算法**(集成在 `loitering_detection` 下): | 算法 | 说明 | 参数 | |------|------|------| | 静止检测 | 基于位置匹配,检测人员静止停留 | 静止阈值(秒)、位置容差(像素) | | 徘徊检测 | 基于跟踪ID,检测人员长时间停留 | 徘徊阈值(秒)、移动阈值(像素) | **检测适配器**:通过 `DetectionAdapter` 将 YOLO、PaddlePaddle、Docker 三种不同输出格式统一为 `UnifiedDetection` / `DetectionResult`,为后续事件管道提供一致的数据入口。 --- ### 2.2 事件判断管道(MVP-1 已实现) 对应设计文档 `event-judgment-algorithm-architecture.md` 中的「决策层」。 #### 2.2.1 事件决策引擎 (`EventDecisionEngine`) **文件**: `services/event/decision_engine.py` - 根据置信度阈值过滤检测结果 - 将底层 class_name 映射为统一 `EventType` 枚举(fire/smoke/smoking/fight/loitering/illegal_parking 等) - 生成 `CandidateEvent` 候选事件,附带严重性级别、来源信息、检测详情 #### 2.2.2 预警规则引擎 (`AlertRuleEngine`) **文件**: `services/event/rule_engine.py` - 从 YAML 配置目录加载规则(`config/rules/*.yaml`) - 支持规则类型:置信度阈值、事件类型、最小边界框面积、限定摄像头来源、必备标签 - 每条规则可配置严重性级别(info/low/medium/high/critical) - 支持热重载(无需重启服务即可更新规则) - 已内置规则文件:`fire.yaml`、`smoking.yaml`、`loitering.yaml`、`fight.yaml`、`vehicle.yaml` #### 2.2.3 事件聚合器 (`EventAggregator`) **文件**: `services/event/aggregator.py` - 基于时间窗口去重:同一 (source_id, event_type, track_id) 在窗口内只产生一条预警 - 空间邻近合并:IOU 超过阈值的同类事件自动合并 - 置信度加权融合:历史置信度按衰减因子递减,新检测加权更新 - 输出 `AlertEvent`,包含首次/末次出现时间、触发次数、关联检测列表 #### 2.2.4 统一事件数据契约 (`event_schemas.py`) **文件**: `models/event_schemas.py` 定义了完整的事件数据模型体系: | 模型 | 说明 | |------|------| | `EventType` | 统一事件类型枚举(11 种) | | `SeverityLevel` | 严重性级别枚举(5 级) | | `DetectionSource` | 检测来源枚举(YOLO/Paddle/Docker/Behavior/Composite) | | `BBox` | 边界框 (xyxy) | | `UnifiedDetection` | 统一检测结果(含 track_id) | | `DetectionResult` | 单帧检测结果集合 | | `CandidateEvent` | 候选事件(决策引擎输出) | | `AlertEvent` | 预警事件(聚合器输出,最终发布格式) | --- ### 2.3 RTSP 视频流接入(MVP-2 已实现) 对应设计文档 `project-integration-plan.md` 中的「视频流接入方案」。 #### 2.3.1 RTSP 流接入服务 (`RTSPService`) **文件**: `services/rtsp_service.py` - 基于 OpenCV VideoCapture 的 RTSP 接入,兼容主流 IP 摄像头 - 后台线程解码帧,避免阻塞事件循环 - 自动重连:断线后按指数退避策略重试(可配置最大次数、间隔、退避因子) - 帧回调机制:每解码一帧触发回调,由 StreamManager 分发到检测管道 - 优雅关闭:stop() 等待解码线程退出,释放资源 - 流状态管理:idle → connecting → connected → reconnecting → stopped → error #### 2.3.2 多路流调度管理器 (`StreamManager`) **文件**: `services/stream_manager.py` - 统一管理多路 RTSPService 实例(最大 16 路,可配置) - 每路流对应一个 `FrameBuffer`(环形缓冲区),解耦解码与检测 - 检测调度:轮询帧缓冲区,按流配置的模型和参数执行检测 - 状态监控:汇总所有流状态,提供健康检查接口 - RESTful API 管理:添加/移除/启动/停止/配置更新 #### 2.3.3 帧缓冲区 (`FrameBuffer`) **文件**: `services/frame_buffer.py` - 环形缓冲区设计,防止内存溢出 - 支持丢帧策略(最新帧优先 / 均匀采样) - 线程安全:解码线程写入、检测线程读取 #### 2.3.4 RTSP 管理 API **文件**: `api/rtsp.py` | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/rtsp/streams` | 获取所有流状态列表 | | `GET` | `/api/rtsp/streams/{stream_id}` | 获取单路流详情 | | `POST` | `/api/rtsp/streams` | 添加新摄像头流 | | `DELETE` | `/api/rtsp/streams/{stream_id}` | 移除摄像头流 | | `POST` | `/api/rtsp/streams/{stream_id}/start` | 启动指定流 | | `POST` | `/api/rtsp/streams/{stream_id}/stop` | 停止指定流 | | `PUT` | `/api/rtsp/streams/{stream_id}/config` | 更新流检测配置 | | `POST` | `/api/rtsp/start-all` | 启动全部流 | | `POST` | `/api/rtsp/stop-all` | 停止全部流 | | `GET` | `/api/rtsp/health` | 健康检查 | --- ### 2.4 MQTT 预警消息系统(MVP-2 已实现) 对应设计文档 `project-integration-plan.md` 中的「MQTT预警事件消息系统」。 #### 2.4.1 MQTT 客户端服务 (`MQTTService`) **文件**: `services/mqtt_service.py` - 基于 paho-mqtt 的 MQTT 客户端封装 - 支持用户名/密码认证 - 自动重连:按指数退避策略重试(可配置最小/最大延迟) - QoS 等级可配置(默认 QoS 1,确保至少送达一次) - 消息保留(retain)可配置 #### 2.4.2 预警发布器 (`AlertPublisher`) **文件**: `services/alert_publisher.py` - 将 `AlertEvent` 格式化为标准 JSON 消息 - 主题命名规则:`{prefix}/{event_type}/{source_id}`(单流单类型)、`{prefix}/all`(全量订阅) - 同时触发 WebSocket 广播(通过 AlertBroadcaster) - 消息包含:alert_id、event_type、severity、confidence、source_id、rule_name、detections 等 #### 2.4.3 MQTT 配置 通过环境变量或 `.env` 文件配置: | 配置项 | 环境变量 | 默认值 | 说明 | |--------|----------|--------|------| | 启用 | `MQTT_ENABLED` | `false` | 是否启用 MQTT | | Broker 地址 | `MQTT_BROKER_HOST` | `localhost` | MQTT 服务器 | | Broker 端口 | `MQTT_BROKER_PORT` | `1883` | 端口 | | 客户端 ID | `MQTT_CLIENT_ID` | `jc-video-recognize` | 客户端标识 | | QoS | `MQTT_QOS` | `1` | 消息质量等级 | | 主题前缀 | `MQTT_ALERT_TOPIC_PREFIX` | `video/alerts` | 主题前缀 | --- ### 2.5 目标跟踪服务(MVP-2 已实现) 对应设计文档 `event-judgment-algorithm-architecture.md` 中的「目标轨迹关联」。 #### 2.5.1 ByteTracker (`tracking_service.py`) **文件**: `services/tracking_service.py` - 基于 ByteTrack 论文的简化跟踪器,纯 Python 实现 - 按置信度将检测分为 high/low 两组 - 先用 high 检测与现有 tracks 进行 IOU 匹配 - 未匹配的 tracks 再与 low 检测匹配(拯救低置信度真实目标) - 未匹配的 high 检测创建新 track - 超过 `max_lost_frames` 的 tracks 移除 - 为每个检测目标分配稳定的 `track_id`,支持目标轨迹关联 --- ### 2.6 WebSocket 实时推送(MVP-2 已实现) 对应设计文档 `project-integration-plan.md` 中的「实时通信」。 #### 2.6.1 预警 WebSocket (`/ws/alerts`) **文件**: `api/alerts.py` - `AlertBroadcaster` 维护 WebSocket 连接池 - 支持按事件类型、source_id 过滤订阅 - 心跳机制:前端每 30 秒发送 ping,后端回复 pong - 预警事件通过 MQTT 发布的同时广播到所有 WebSocket 订阅者 - 消息格式:`{"type": "alert", "data": {...}}` #### 2.6.2 摄像头 WebSocket (`/ws/camera`) **文件**: `main.py` → `CameraService` - 实时视频流传输(原始帧 + 标注帧双路) - 支持动态切换模型、调整置信度/IOU 阈值 - 自动清理摄像头资源 --- ### 2.7 LLM 大模型二次判断(MVP-3 已实现) 对应设计文档 `event-judgment-algorithm-architecture.md` 中的「AI增强层」和 `project-integration-plan.md` 中的「大模型二次判断架构」。 #### 2.7.1 多帧累积器 (`MultiFrameAccumulator`) **文件**: `services/event/frame_accumulator.py` - 累积同一目标在时间窗口内的候选事件 - 统计连续命中帧数、平均置信度、首次/末次出现时间 - LRU 淘汰机制:超出最大容量时淘汰最久未更新的条目 - 过期淘汰:超出时间窗口的条目自动清理 - 为 LLM 触发器提供累积统计数据 #### 2.7.2 LLM 触发器 (`LLMTrigger`) **文件**: `services/event/llm_trigger.py` - 基于累积统计决定是否触发 LLM 二次判断 - 触发条件:连续命中帧数 ≥ `min_consecutive_hits` 且平均置信度 ≥ `min_avg_confidence` - 严重性旁路:`critical` 级别事件无需累积,立即触发 LLM - 冷却机制:同一目标在冷却时间内不重复触发 - 输出 `TriggerDecision`,包含是否触发、累积帧列表、触发原因 #### 2.7.3 LLM 分析服务 (`LLMAnalysisService`) **文件**: `services/llm_analysis_service.py` - **Provider 抽象**:`BaseLLMProvider` 抽象基类,支持多种 LLM 后端 - `MockLLMProvider`:离线测试用,返回模拟结果 - `OpenAICompatibleProvider`:支持 OpenAI 兼容协议(GPT-4V/Qwen-VL/GLM-4V 等) - 并发控制:`asyncio.Semaphore` 限制同时进行的 LLM 调用数 - 图像预处理:自动缩放到 `image_max_side` 以节省 token - 结构化输出解析:从 LLM 响应中提取 confirmed/confidence/reasoning - 调用统计:记录调用次数、成功/失败数、总延迟 #### 2.7.4 结果融合器 (`ResultFusion`) **文件**: `services/result_fusion.py` 三种融合策略: | 策略 | 说明 | |------|------| | `weighted` | 加权融合:YOLO 权重 × YOLO 置信度 + LLM 权重 × LLM 置信度 | | `conservative` | 保守策略:LLM 明确否决时直接抑制预警 | | `llm_priority` | LLM 优先:LLM 给出明确判定时以 LLM 为准 | 关键行为: - LLM 不可用/未触发时,可配置是否回退到 YOLO 结果(`fallback_to_yolo`) - LLM 明确否决时,可配置是否抑制预警(`suppress_on_llm_negative`) - 高融合置信度时可自动提升严重性级别(`promote_severity_on_high_confidence`) #### 2.7.5 LLM 成本追踪与熔断降级 (`LLMCostTracker`) **文件**: `services/llm_cost_tracker.py` - **成本追踪**:记录每次 LLM 调用的 token 用量、费用、延迟 - **日预算控制**:超过日预算自动拒绝调用 - **熔断降级**: - 状态机:CLOSED → OPEN → HALF_OPEN → CLOSED - 触发条件:最近 N 次调用错误率超过阈值 - 冷却恢复:OPEN 状态持续 `cooldown_seconds` 后进入 HALF_OPEN,允许一次试探 - 手动控制:支持紧急停用 / 重新启用 / 重置统计 - **定价表**:内置主流模型定价,支持自定义覆盖 - **统计接口**:提供日级统计、历史趋势、最近调用记录 #### 2.7.6 LLM 管理 API **文件**: `api/llm.py` | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/llm/status` | 获取 LLM 运行状态(provider/模型/触发配置/融合配置/成本) | | `GET` | `/api/llm/cost` | 获取当前成本统计 | | `GET` | `/api/llm/cost/history` | 获取历史成本趋势(按天) | | `GET` | `/api/llm/cost/records` | 获取最近调用记录 | | `POST` | `/api/llm/disable` | 紧急停用 LLM | | `POST` | `/api/llm/enable` | 重新启用 LLM | | `POST` | `/api/llm/reset` | 重置成本统计与熔断状态 | --- ### 2.8 规则配置管理(MVP-3 已实现) #### 2.8.1 规则管理 API **文件**: `api/rules.py` | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/rules` | 获取所有规则列表 | | `GET` | `/api/rules/{name}` | 获取单条规则详情 | | `POST` | `/api/rules` | 新增规则(写入 custom.yaml) | | `PUT` | `/api/rules/{name}` | 更新规则 | | `DELETE` | `/api/rules/{name}` | 删除规则 | | `POST` | `/api/rules/reload` | 热重载规则(从 YAML 重新加载) | | `GET` | `/api/rules/_stats` | 获取规则统计信息 | --- ### 2.9 统一配置管理(MVP-1/2/3 已实现) **文件**: `core/settings.py` 基于 `pydantic-settings` 的多环境配置管理,支持环境变量、`.env` 文件、默认值三级加载。 | 子配置 | 环境变量前缀 | 覆盖范围 | |--------|-------------|---------| | `APISettings` | `API_` | 服务端口、CORS | | `DetectionSettings` | `DETECTION_` | 默认置信度、IOU、最低置信度 | | `ActionDetectionSettings` | `ACTION_DETECTION_` | Docker 行为识别服务 | | `EventEngineSettings` | `EVENT_` | 去重窗口、规则目录、最大事件数 | | `RTSPSettings` | `RTSP_` | 最大流数、缓冲区、重连策略 | | `MQTTSettings` | `MQTT_` | Broker 配置、QoS、主题 | | `TrackingSettings` | `TRACKING_` | ByteTrack 参数 | | `AggregatorSettings` | `AGGREGATOR_` | 空间合并、置信度融合 | | `LLMSettings` | `LLM_` | Provider、模型、API Key、并发 | | `LLMTriggerSettings` | `LLM_TRIGGER_` | 触发阈值、冷却、严重性旁路 | | `FusionSettings` | `FUSION_` | 融合策略、权重、回退 | | `LLMCostSettings` | `LLM_COST_` | 日预算、熔断阈值、冷却 | | `LoggingSettings` | `LOG_` | 日志级别、格式 | | `PathSettings` | `PATH_` | 静态资源、模型路径 | --- ## 3. 前端功能清单 ### 3.1 页面结构 | 页面 | 路径 | 组件 | 功能 | |------|------|------|------| | 模型检测 | `/` | `Home.vue` + `ImageDetection.vue` + `VideoDetection.vue` | 图片/视频/摄像头实时检测 | | 摄像头管理 | `/cameras` | `CameraManagement.vue` | RTSP 流增删改查、启停控制 | | 规则配置 | `/rules` | `RuleConfiguration.vue` | 规则 CRUD + LLM 状态面板 | | 预警列表 | `/alerts` | `AlertList.vue` | 实时预警展示、过滤、LLM 结果展示 | ### 3.2 全局功能 - **暗色主题 UI**:统一深色设计风格 - **可折叠侧边栏**:4 个导航菜单项 - **实时连接状态**:显示 WebSocket 连接状态(已连接/连接中/未连接) - **预警铃铛**:顶部显示未读预警数量,点击跳转预警列表 - **全局预警弹窗**:`AlertNotification.vue` 收到新预警时弹出桌面通知 - **WebSocket 自动重连**:指数退避策略,最多重试 10 次 - **心跳保活**:每 30 秒发送 ping ### 3.3 摄像头管理页面功能 - 统计卡片:摄像头总数、运行中、重连中、故障 - 搜索过滤:按 ID/URL 搜索、按状态过滤 - 摄像头操作:启动/停止/配置/移除 - 批量操作:全部启动/全部停止 - 添加/编辑弹窗:配置 RTSP URL、检测模型、置信度/IOU 阈值、帧采样间隔 - 自动刷新:每 5 秒轮询状态 ### 3.4 规则配置页面功能 - **LLM 状态面板**: - Provider/模型/融合策略/触发阈值展示 - 今日调用次数/成功/失败/费用/预算使用率 - 最近错误率/熔断状态 - 紧急停用/重新启用/重置统计操作 - **规则列表**: - 按规则名/描述搜索、按事件类型过滤 - 规则卡片:严重级别标签、事件类型、启停开关、编辑/删除 - 规则元数据:最低置信度、最小边界框面积、限定摄像头、必备标签 - **新增/编辑规则弹窗**: - 规则名称、事件类型、严重级别 - 最低置信度滑块、最小边界框面积 - 限定摄像头 ID(多选)、必备标签(多选) - 描述、启用开关 ### 3.5 预警列表页面功能 - 统计卡片:预警总数、未读、严重预警、订阅状态 - 过滤工具栏:按严重级别/事件类型/摄像头 ID 过滤 - 预警卡片: - 严重性色条(红/橙/蓝/灰/绿) - 未读标记(绿色圆点) - 事件类型、置信度、触发次数、规则名称 - 检测标签(含 track_id) - **LLM 二次判断结果**:LLM 确认/否决标签、LLM 置信度、推理摘要 - 操作:全部标为已读、清空记录、单条删除 --- ## 4. 完整 API 接口一览 ### 4.1 检测接口 | 方法 | 路径 | 说明 | |------|------|------| | `POST` | `/api/detect/image` | 图片检测(支持所有模型) | | `POST` | `/api/detect/video` | 视频检测(仅 YOLO 模型,主要面向打架斗殴) | | `GET` | `/api/algorithms/config` | 获取算法配置选项 | ### 4.2 模型管理 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/models` | 获取可用模型列表 | | `GET` | `/api/models/{model_id}` | 获取单个模型信息 | | `POST` | `/api/models/{model_id}/load` | 加载指定模型 | ### 4.3 RTSP 流管理 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/rtsp/streams` | 获取所有流状态 | | `GET` | `/api/rtsp/streams/{stream_id}` | 获取单路流详情 | | `POST` | `/api/rtsp/streams` | 添加新摄像头流 | | `DELETE` | `/api/rtsp/streams/{stream_id}` | 移除摄像头流 | | `POST` | `/api/rtsp/streams/{stream_id}/start` | 启动指定流 | | `POST` | `/api/rtsp/streams/{stream_id}/stop` | 停止指定流 | | `PUT` | `/api/rtsp/streams/{stream_id}/config` | 更新流检测配置 | | `POST` | `/api/rtsp/start-all` | 启动全部流 | | `POST` | `/api/rtsp/stop-all` | 停止全部流 | | `GET` | `/api/rtsp/health` | 健康检查 | ### 4.4 规则配置 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/rules` | 获取所有规则 | | `GET` | `/api/rules/{name}` | 获取单条规则 | | `POST` | `/api/rules` | 新增规则 | | `PUT` | `/api/rules/{name}` | 更新规则 | | `DELETE` | `/api/rules/{name}` | 删除规则 | | `POST` | `/api/rules/reload` | 热重载规则 | | `GET` | `/api/rules/_stats` | 规则统计 | ### 4.5 LLM 管理 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/api/llm/status` | LLM 运行状态 | | `GET` | `/api/llm/cost` | 当前成本统计 | | `GET` | `/api/llm/cost/history` | 历史成本趋势 | | `GET` | `/api/llm/cost/records` | 最近调用记录 | | `POST` | `/api/llm/disable` | 紧急停用 LLM | | `POST` | `/api/llm/enable` | 重新启用 LLM | | `POST` | `/api/llm/reset` | 重置统计与熔断 | ### 4.6 WebSocket | 路径 | 说明 | |------|------| | `/ws/camera` | 摄像头实时视频流 | | `/ws/alerts` | 预警事件实时推送(支持过滤订阅) | ### 4.7 系统 | 方法 | 路径 | 说明 | |------|------|------| | `GET` | `/` | 服务信息 | | `GET` | `/api/health` | 健康检查 | --- ## 5. 数据流全景 ### 5.1 实时检测管道(RTSP → 预警) ``` RTSP 摄像头 │ ▼ RTSPService (解码线程) │ ▼ FrameBuffer (环形缓冲区) │ ▼ StreamManager (检测调度) │ ├──▶ ModelService (YOLO/Paddle 推理) │ │ │ ▼ │ DetectionAdapter (格式统一) │ │ │ ▼ │ ByteTracker (目标跟踪, 分配 track_id) │ ▼ DetectionResult (统一检测结果) │ ▼ EventDecisionEngine (置信度过滤 + 类型映射) │ ▼ CandidateEvent[] │ ├──▶ AlertRuleEngine (规则匹配) │ │ │ ▼ │ AlertEvent[] (规则过滤后) │ ├──▶ MultiFrameAccumulator (多帧累积) │ │ │ ▼ │ LLMTrigger (触发判定) │ │ │ ▼ (触发时) │ LLMAnalysisService (大模型分析) │ │ │ ▼ │ ResultFusion (YOLO + LLM 融合) │ │ │ ▼ │ LLMCostTracker (成本追踪 + 熔断) │ ▼ EventAggregator (去重 + 空间合并 + 置信度融合) │ ▼ AlertEvent (最终预警) │ ├──▶ AlertPublisher → MQTT (外部系统) ├──▶ AlertBroadcaster → WebSocket (前端实时推送) └──▶ 前端 AlertList / 桌面通知 ``` ### 5.2 图片/视频检测管道(上传 → 结果) ``` 用户上传图片/视频 │ ▼ POST /api/detect/image 或 /api/detect/video │ ▼ DetectionService │ ├──▶ ModelService (推理) │ │ │ ▼ │ 检测结果 + 标注图/视频 │ ├──▶ 事件管道 (同上,但仅图片检测触发) │ ▼ 返回检测结果 (含标注图/视频 URL/关键帧) ``` --- ## 6. 测试覆盖 项目包含完整的单元测试和集成测试: ### 6.1 单元测试 | 测试文件 | 覆盖模块 | |----------|---------| | `test_decision_engine.py` | 事件决策引擎 | | `test_rule_engine.py` | 预警规则引擎 | | `test_aggregator.py` / `test_aggregator_v2.py` | 事件聚合器 | | `test_event_schemas.py` | 事件数据模型 | | `test_detection_adapter.py` | 检测适配器 | | `test_frame_accumulator.py` | 多帧累积器 | | `test_llm_trigger.py` | LLM 触发器 | | `test_llm_analysis_service.py` | LLM 分析服务 | | `test_llm_cost_tracker.py` | LLM 成本追踪 | | `test_result_fusion.py` | 结果融合器 | | `test_rtsp_service.py` | RTSP 流服务 | | `test_stream_manager.py` | 多路流管理器 | | `test_tracking_service.py` | 目标跟踪 | | `test_mqtt_service.py` | MQTT 服务 | | `test_alert_publisher.py` | 预警发布器 | | `test_frame_buffer.py` | 帧缓冲区 | | `test_settings.py` | 配置管理 | ### 6.2 集成测试 | 测试文件 | 覆盖场景 | |----------|---------| | `test_detect_image_integration.py` | 图片检测端到端 | | `test_detection_service_pipeline.py` | 检测服务管道 | | `test_event_pipeline.py` | 事件管道端到端 | --- ## 7. 设计文档对照:已实现 vs 待实现 ### 7.1 `event-judgment-algorithm-architecture.md` 对照 | 设计模块 | 设计内容 | 实现状态 | 说明 | |----------|---------|---------|------| | 事件决策引擎 | 置信度评估、场景识别、初步筛选 | ✅ 已实现 | 置信度过滤 + 类型映射,场景识别暂未实现 | | 预警规则引擎 | 规则匹配、时间窗口、区域规则 | ✅ 已实现 | 置信度/面积/来源/标签规则已实现,时间窗口规则暂未实现 | | 事件聚合器 | 去重合并、时间窗口、事件关联 | ✅ 已实现 | 时间窗口去重 + 空间合并 + 置信度融合 | | 大模型触发器 | 智能决策、优先级排序、并发控制 | ✅ 已实现 | 多帧累积 + 冷却 + 严重性旁路 | | LLM 视觉分析 | 图像理解、场景分析、推理验证 | ✅ 已实现 | OpenAI 兼容协议 + Mock Provider | | 结果融合 | 置信融合、决策输出 | ✅ 已实现 | weighted/conservative/llm_priority 三策略 | | 严重性评估器 | 风险等级、优先级计算 | ⚠️ 部分实现 | 规则引擎指定严重性,动态评估暂未实现 | | 事件格式化 | 标准格式、元数据填充 | ✅ 已实现 | AlertEvent 统一格式 | | MQTT 发布 | 消息发布、QoS 管理 | ✅ 已实现 | AlertPublisher + MQTTService | ### 7.2 `project-integration-plan.md` 对照 | 设计模块 | 设计内容 | 实现状态 | 说明 | |----------|---------|---------|------| | RTSP 流接入 | 解码、缓冲、重连 | ✅ 已实现 | RTSPService + FrameBuffer + 指数退避重连 | | 多路流管理 | 调度、状态监控 | ✅ 已实现 | StreamManager + REST API | | MQTT 预警系统 | 消息发布、QoS、主题设计 | ✅ 已实现 | MQTTService + AlertPublisher | | AI 模型扩展 | 车辆/打架检测 | ✅ 已实现 | fight_detection + vehicle_detection_paddle | | 大模型二次判断 | 多模型策略、Prompt 设计 | ✅ 已实现 | Provider 抽象 + 结构化输出解析 | | 触发条件 | 置信度区间、去重窗口、并发限制 | ✅ 已实现 | LLMTrigger + MultiFrameAccumulator | | 成本控制 | 日预算、熔断降级 | ✅ 已实现 | LLMCostTracker (CLOSED/OPEN/HALF_OPEN) | | WebSocket 实时推送 | 预警订阅、过滤 | ✅ 已实现 | AlertBroadcaster + 前端 WebSocket 客户端 | | 消息持久化 | 存储与消费确认 | ❌ 未实现 | 当前仅内存存储,未做持久化 | | 人脸识别/属性分析 | InsightFace / PaddleFace | ❌ 未实现 | — | | 越界/入侵检测 | 虚拟围栏算法 | ❌ 未实现 | — | | 异常行为检测 | 自定义行为分析 | ⚠️ 部分实现 | 已有静止/徘徊检测,通用异常行为未实现 | --- ## 8. 项目文件结构 ``` jc-video-recognize/ ├── apps/ │ ├── web/ # 前端 (Vue 3 + Vite 5) │ │ └── src/ │ │ ├── api/detection.js # API 请求封装 (检测/摄像头/规则/LLM) │ │ ├── components/ │ │ │ ├── AlertNotification.vue # 全局预警弹窗 │ │ │ ├── AlgorithmConfig.vue # 行为分析算法配置 │ │ │ ├── DetectionConfig.vue # 检测参数配置 │ │ │ ├── ImageDetection.vue # 图片检测模块 │ │ │ └── VideoDetection.vue # 视频/摄像头检测模块 │ │ ├── layouts/MainLayout.vue # 主布局 (侧边栏+顶栏+预警铃铛) │ │ ├── router/index.js # 路由 (4 个页面) │ │ ├── services/mqtt.client.js # WebSocket 预警客户端 │ │ ├── stores/alertStore.js # Pinia 预警状态管理 │ │ └── views/ │ │ ├── Home.vue # 模型检测首页 │ │ ├── CameraManagement.vue # 摄像头管理 │ │ ├── RuleConfiguration.vue # 规则配置 + LLM 面板 │ │ └── AlertList.vue # 预警列表 │ └── server/ # 后端 (FastAPI) │ ├── main.py # 服务入口 + 生命周期管理 │ ├── api/ │ │ ├── detection.py # 检测 API │ │ ├── models.py # 模型管理 API │ │ ├── rtsp.py # RTSP 流管理 API │ │ ├── alerts.py # 预警 WebSocket API │ │ ├── rules.py # 规则配置 API │ │ └── llm.py # LLM 管理 API │ ├── config/rules/ # 规则 YAML 配置 │ │ ├── fire.yaml │ │ ├── smoking.yaml │ │ ├── loitering.yaml │ │ ├── fight.yaml │ │ └── vehicle.yaml │ ├── core/settings.py # 统一配置管理 (14 个子配置) │ ├── models/ │ │ ├── event_schemas.py # 统一事件数据契约 │ │ └── schemas.py # 检测请求/响应模型 │ ├── services/ │ │ ├── detection_service.py # 检测核心 (管道编排) │ │ ├── model_service.py # 模型加载与管理 │ │ ├── rtsp_service.py # RTSP 流接入 │ │ ├── stream_manager.py # 多路流调度 │ │ ├── frame_buffer.py # 帧缓冲区 │ │ ├── mqtt_service.py # MQTT 客户端 │ │ ├── alert_publisher.py # 预警发布器 │ │ ├── tracking_service.py # ByteTrack 目标跟踪 │ │ ├── llm_analysis_service.py # LLM 分析服务 │ │ ├── llm_cost_tracker.py # LLM 成本追踪 + 熔断 │ │ ├── result_fusion.py # 结果融合器 │ │ ├── loitering_service.py # 徘徊检测服务 │ │ ├── camera_service.py # 摄像头 WebSocket 服务 │ │ ├── action_detection_service.py # Docker 行为识别适配器 │ │ ├── paddle_detection_service.py # PaddlePaddle 抽烟检测适配器 │ │ ├── vehicle_detection_service.py # 车辆/违停检测适配器 │ │ ├── adapters/detection_adapter.py # 检测结果格式统一适配器 │ │ └── event/ │ │ ├── decision_engine.py # 事件决策引擎 │ │ ├── rule_engine.py # 预警规则引擎 │ │ ├── aggregator.py # 事件聚合器 │ │ ├── frame_accumulator.py # 多帧累积器 │ │ └── llm_trigger.py # LLM 触发器 │ └── tests/ # 测试 (17 单元 + 3 集成) ├── models/ # AI 模型文件 │ ├── fire_detection/ # YOLOv10 火灾检测 │ ├── helmet_detection/ # YOLOv8 安全帽检测 │ ├── crowd_detection/ # YOLOv8 人群检测 │ ├── smoking_detection/ # YOLOv8 抽烟检测 │ ├── smoking_detection_paddle/ # PaddlePaddle 抽烟检测 │ ├── loitering_detection/ # YOLOv8 徒步检测 │ ├── fight_detection/ # YOLOv8 打架斗殴检测 │ └── vehicle_detection_paddle/ # PaddlePaddle 车辆检测 ├── docs/ # 项目文档 └── docker/ # Docker 部署配置 ``` --- ## 9. 待完善功能 基于两份设计文档的对照,以下功能尚未实现: | 优先级 | 功能 | 来源文档 | 说明 | |--------|------|---------|------| | 高 | 预警事件持久化存储 | project-integration-plan | 当前仅内存存储,重启后丢失 | | 高 | 时间窗口规则 | event-judgment-algorithm | 规则引擎暂不支持工作时间/非工作时间过滤 | | 中 | 场景识别 | event-judgment-algorithm | 决策引擎暂未实现室内/室外/禁区场景分类 | | 中 | 动态严重性评估 | event-judgment-algorithm | 当前严重性由规则静态指定,未实现动态计算 | | 中 | 越界/入侵检测 | project-integration-plan | 虚拟围栏算法未实现 | | 中 | 人脸识别/属性分析 | project-integration-plan | InsightFace / PaddleFace 未集成 | | 低 | 区域规则 | event-judgment-algorithm | 规则引擎暂不支持区域(禁区/普通区域)过滤 | | 低 | 组合规则 | event-judgment-algorithm | 多条件组合规则未实现 | | 低 | 消息消费确认机制 | project-integration-plan | MQTT 消息持久化与消费确认未实现 | | 低 | 预警消息管理后台 | project-integration-plan | 消息查询与统计分析页面未实现 |