当前位置: 首页 > news >正文

实现自己的AI视频监控系统-第二章-AI分析模块5(重点)

文章目录

  • 前言
  • 一、基本回顾
    • 1.1 视频展示系统
    • 1.2 基于TensorRT的推理封装
  • 二、video system的设计与实现
    • 2.1 推理引擎的设计
    • 2.2 拉流引擎的设计
    • 2.3 主体服务的设计
    • 2.4 代码展示
  • 总结
  • 后续内容预告


前言

在上一小节,我们实现了基于TenosRT的推理加速,在本小节,我们将汇总第一章节的视频展示系统,实现8路视频满帧分析,并封装为完整的工程化代码。具体参考代码git仓库video_system。


一、基本回顾

1.1 视频展示系统

  • 视频展示系统采用pyav以软解码的方式实现了8路RTSP视频流的拉取,并在屏幕上实现8路视频的实时显示
    在这里插入图片描述
  • 同时采用接口的方式进行了开启和关闭的封装
    • 添加视频流
      接口: POST /streams/{stream_id}
    • 启动指定视频流
      接口: POST /streams/{stream_id}/start
    • 停止指定视频流
      接口: POST /streams/{stream_id}/stop
    • 删除视频流
      接口: DELETE /streams/{stream_id}

1.2 基于TensorRT的推理封装

第二章节我们详细介绍了基于ultralytics、onnxruntime以及TensorRT的模型推理,以实验的方式介绍了各个推理工具的优缺点。通过该实验,我们验证了TensorRT具备以下优势:

  • 更快的推理速度。相比ultralytics和onnxruntime,最大并发推理帧率可提升约2倍。
  • 更低的资源占用。相比ultralytics和onnxruntime,设备利用率可提升约200%。

二、video system的设计与实现

2.1 推理引擎的设计

  • 推理引擎实现了一个基于TensorRT的YOLO目标检测模型推理类,主要功能包括:

    • 模型加载与缓存:使用类级别缓存避免重复加载相同模型

    • 线程安全设计:使用类级别锁保护CUDA资源初始化和实例级别锁保护推理过程

    • 预处理:图像缩放、填充和归一化

    • 推理执行:使用TensorRT进行高效GPU推理

    • 后处理:包括置信度过滤和非极大值抑制(NMS)

    • 结果可视化:在图像上绘制检测框和标签

  • 接口及依赖图如下所示

使用
依赖
依赖
TrtModel
-_cuda_lock: threading.Lock
-_engine_cache: Dict
-allocations: List
-mean: None
-std: None
-confidence_threshold: float
-classes: Optional[List[int]]
-model_name: str
-n_classes: int
-class_names: List[str]
-input_shape: Tuple[int, int]
-engine: trt.ICudaEngine
-imgsz: List[int]
-context: trt.IExecutionContext
-inputs: List[Dict]
-outputs: List[Dict]
-batch_size: int
-_instance_lock: threading.Lock
+__init__(engine_path, confidence_threshold, classes)
-_cleanup()
+output_spec()
+infer(img)
+preprocess(image)
+draw_detections(image, detections, conf_threshold)
+predict(frame, conf, show)
+postprocess(output, scale, orig_shape, conf_threshold, nms_threshold)
+get_fps()
+__del__()
«module»
CommonUtils
+cuda_call()
+memcpy_host_to_device()
+memcpy_device_to_host()
«external»
TensorRT
+Logger
+Runtime
+init_libnvinfer_plugins()
«external»
CUDA
+cudart
+cudaMalloc()
+cudaFree()

  • 调用执行示意图
ClientTrtModelTensorRTCUDA__init__(engine_path)检查引擎缓存使用缓存引擎创建运行时并加载引擎缓存引擎alt[引擎已缓存][引擎未缓存]分配内存返回初始化模型predict(frame)preprocess(frame)infer(processed_image)postprocess(output)返回检测结果draw_detections(image, detections)返回带标注的图像ClientTrtModelTensorRTCUDA

  • 执行流程示意图
开始推理
预处理图像
调整大小和填充
转换颜色空间和数据类型
执行TensorRT推理
后处理输出
应用置信度阈值
应用非极大值抑制NMS
转换边界框坐标
返回检测结果
是否可视化?
绘制检测框和标签
结束

  • 这个设计展示了TrtModel类的结构、与其他组件的关系以及推理过程的流程。类使用了线程安全设计和缓存机制来提高性能,同时提供了完整的预处理、推理和后处理功能。但是也存在以下弊端:
    • 缺少合适的多模型推理机制。 如果需要一路分析多个算法和模型,目前的运行机制尚不完全满足。
    • 缺少合适的多结果展示机制。 当前所有通道均为一个模型,如果存在多模型推理,如何展示不同推理模型的结果是个问题。
    • 没有克服python GIL锁的限制。 受限于编程语言,多线程执行存在python GIL锁的限制。
    • 缺少合适的进程池封装。 没有采用合适的多进程-多模型设计来进一步提高分析的帧率。

2.2 拉流引擎的设计

  • 拉流引擎实现了一个高效的多功能视频流解码器,主要功能包括:

    • RTSP流处理:支持RTSP视频流的连接和解码

    • 智能重连机制:支持超时和重连策略

    • 帧处理与回调:支持帧处理回调函数,可与AI推理模块集成

    • 时间戳添加:在视频帧上添加时间戳水印

    • 抽帧策略:支持关键帧提取和自定义帧跳过策略

    • 线程安全设计:使用锁保护共享资源

    • 状态监控:提供连接状态和统计信息

  • 其接口依赖图、执行调用流程和执行逻辑如下图所示:

使用
使用
VideoStreamDecoder
-stream_id: str
-stream_url: str
-buffer_size: int
-hw_accel: Optional[str]
-timeout: int
-reconnect_delay: int
-max_retries: int
-keyframe_only: bool
-frame_skip: int
-inference_callback: Optional[Callable]
-detection_enabled: bool
-_retry_count: int
-_connection_status: str
-_frame_counter: int
-_container: Optional[av.container.InputContainer]
-_video_stream: Optional[av.video.stream.VideoStream]
-_current_iterator: Optional[Any]
-_last_frame: Optional[np.ndarray]
-_last_processed_frame: Optional[np.ndarray]
-_frame_count: int
-_keyframe_count: int
-_running: bool
-_decode_thread: Optional[threading.Thread]
-_options: Dict
-lock: threading.Lock
+__init__(stream_id, stream_url, buffer_size, hw_accel, timeout, reconnect_delay, max_retries, keyframe_only, frame_skip, inference_callback)
-_get_codec_options() : Dict
+connect() : bool
-_process_frame_callback(processed_frame, detections)
-_decode_loop()
-_attempt_reconnect() : bool
+start()
+get_frame(processed)
+get_stats()
+update_settings(**kwargs)
+enable_detection(enable)
+stop()
+restart()
«external»
AVLibrary
+open()
+decode()
+close()
«external»
OpenCV
+putText()
+getTextSize()
+rectangle()

ClientVideoStreamDecoderAVLibraryInferenceCallbackstart()connect()av.open()容器和流对象启动_decode_loop线程获取下一帧视频帧add_timestamp(帧)更新_last_frame调用推理回调_process_frame_callback(结果)更新_last_processed_framealt[检测已启用且是抽帧时机]loop[解码循环]get_frame()返回最新帧stop()关闭容器ClientVideoStreamDecoderAVLibraryInferenceCallback

启动解码器
连接视频流
连接成功?
启动解码线程
等待重连
获取视频帧
添加时间戳
更新最新帧
检测已启用?
是否抽帧?
调用推理回调
异步处理结果
外部请求
获取帧
请求处理帧?
有处理帧?
返回原始帧
返回处理帧
  • 拉流引擎使用了多线程处理视频流解码支持智能重连机制和与AI推理模块的集成。设计还展示了帧处理流程和状态管理机制。

2.3 主体服务的设计

  • 主体服务实现了一个完整的多路视频流管理系统,集成了视频流解码、AI目标检测、报警管理和可视化展示功能。主要特点包括:

    • FastAPI Web服务:提供RESTful API接口管理视频流和模型

    • 多路视频流管理:支持同时处理多个RTSP视频流

    • 智能报警系统:支持基于检测结果的多种报警方式(暂未完善)

    • 多线程处理:使用线程池和进程池进行异步推理

    • 可视化展示:提供2×4网格的多路视频实时显示

    • 动态配置:支持运行时动态调整流参数和模型配置

  • 数据流转、调用流程图参考下图:

使用
包含
管理
使用
包含
«FastAPI应用»
FastAPI
-app: FastAPI
+各种API端点
+startup_event()
+shutdown_event()
StreamManager
-decoders: Dict[str, VideoStreamDecoder]
-model_manager: ModelManager
-lock: threading.RLock
+add_stream()
+remove_stream()
+start_stream()
+stop_stream()
+get_frame()
+enable_detection()
+load_model()
+add_alert_condition()
ModelManager
-models: Dict[str, TrtModel]
-active_models: Dict[str, List[str]]
-alert_handler: AlertHandler
-executor: ThreadPoolExecutor
-process_executor: ProcessPoolExecutor
+load_model()
+add_model_to_stream()
+process_frame_async()
+add_alert_condition()
AlertHandler
-alert_conditions: Dict
-alert_actions: Dict
-last_alert_time: Dict
+add_alert_condition()
+check_alerts()
+execute_alert_action()
«来自前一个文件»
VideoStreamDecoder
+各种视频流处理功能
«来自第一个文件»
TrtModel
+各种模型推理功能

资源层
处理层
核心服务层
API层
客户端层
RTSP视频流
TensorRT模型文件
视频流解码器
TensorRT推理引擎
流管理器
模型管理器
报警处理器
FastAPI服务器
RESTful API
Web客户端
本地显示窗口

视频处理流水线
API请求处理
视频流解码
帧预处理
模型推理
后处理与报警检查
结果可视化
添加视频流
加载模型
配置模型到流
获取视频帧
触发报警
系统启动
初始化StreamManager
启动显示线程
显示多路视频网格
用户交互
按键切换检测状态
按键切换原始/处理流
按键退出
系统关闭
清理资源

主服务设计展示了一个完整的多路视频流处理管道,从视频流输入到AI推理再到结果展示和报警处理。系统采用了分层架构,各组件职责明确,通过FastAPI提供统一的管理接口,支持动态配置和扩展。

2.4 代码展示

  • 由于本章节涉及的代码较多,请参考github仓库获取完整的代码,对于环境的安装,请参考之前小节的内容。

总结

我们已经完成了一个监控系统应有的部分,包括视频流的管理、基本的AI视频分析功能。但是随着生产需要和新技术的迭代,现有的系统仍需在智能化、实时性、扩展性以及多模态数据分析等方面进行深化和拓展。

接下来的工作重点将围绕以下几个方向展开:

  1. 算法模型优化与迭代

    • 引入大模型,提升系统平台的生命力。

    • 支持多模态分析(如视频、音频、传感器数据融合),增强复杂场景下的检测与识别能力。

    • 持续优化异常行为检测算法,减少误报率,提高准确性和鲁棒性。

  2. 系统性能与实时性提升

    • 优化视频流处理 pipeline,实现低延迟、高并发的实时分析。

    • 支持动态资源调度,根据负载自动分配计算资源,提高系统响应能力。

  3. 平台扩展性与集成能力

    • 提供标准API接口,支持与第三方系统(如门禁、告警、工单系统)无缝集成。

    • 构建插件化架构,允许用户按需加载功能模块,降低系统耦合度。

  4. 数据管理与智能分析

    • 构建视频元数据管理系统,支持智能检索与行为回溯。

    • 引入时序数据分析与模式学习,实现对长期趋势的预测性维护与告警。

  5. 用户体验与可视化

    • 增强监控看板的交互性与自定义能力,提供更直观的数据呈现方式。

    • 支持移动端访问与实时消息推送,提升用户操作的便捷性。

通过这些改进,系统将不仅满足当前的生产监控需求,也为未来的技术演进和应用场景拓展奠定坚实基础。我们致力于打造一个更智能、高效、易用的下一代监控分析平台。

后续内容预告

  • 报警信息的推送与分析画面的推流
  • 大模型赋能系统平台
  • 新的算法提升监控的生命力
http://www.xdnf.cn/news/1390447.html

相关文章:

  • 【开题答辩全过程】以 基于SpringBootVue的智能敬老院管理系统为例,包含答辩的问题和答案
  • 为什么特征缩放对数字货币预测至关重要
  • 克隆态驱动给用户态使用流程
  • Python 异步编程:await、asyncio.gather 和 asyncio.create_task 的区别与最佳实践
  • 【DeepSeek】公司内网部署离线deepseek+docker+ragflow本地模型实战
  • 软考-系统架构设计师 办公自动化系统(OAS)详细讲解
  • 【C语言】深入理解指针(2)
  • [打包压缩] gzip压缩和解压缩介绍
  • webservice在进行run maven build中出现java.lang.ClassCastException错误
  • C++基础(⑤删除链表中的重复节点(链表 + 遍历))
  • 【C++闯关笔记】STL:vector的学习与使用
  • Spring Security 传统 web 开发场景下开启 CSRF 防御原理与源码解析
  • CorrectNav:用错误数据反哺训练的视觉语言导航新突破
  • Apache服务器IP 自动跳转域名教程​
  • electron-vite 配合python
  • UPDF for mac PDF编辑器
  • JAVA:Spring Boot 集成 Easy Rules 实现规则引擎
  • 来自火山引擎的 MCP 安全授权新范式
  • 嵌入式Linux驱动开发:i.MX6ULL按键中断驱动(非阻塞IO)
  • PostgreSQL15——子查询
  • 基于SQL大型数据库的智能问答系统优化
  • Emacs 多个方便查看函数列表的功能
  • QML QQuickImage: Cannot open: qrc:/images/shrink.png(已解决)
  • 前端-初识Vue实例
  • Spring Boot Redis序列化全解析(7种策略)
  • 2024年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • leetcode 461 汉明距离
  • 如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?
  • 基于MCP工具的开发-部署-上线与维护全流程技术实现与应用研究
  • 北斗导航 | PPP-RTK算法核心原理与实现机制深度解析