当前位置: 首页 > 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.dtcms.com/a/356417.html

相关文章:

  • js AbortController 实现中断接口请求
  • 【MFC教程】C++基础:01 小黑框跑起来
  • 【MFC应用创建后核心文件详解】项目名.cpp、项目名.h、项目名Dlg.cpp 和 项目名Dlg.h 的区别与作用
  • Java项目打包成EXE全攻略
  • Kafka 副本同步异常与 ISR 收缩故障排查实录
  • C语言————操作符详解
  • 《华为战略管理法:DSTE 实战体系》读书笔记
  • 【完整源码+数据集+部署教程】骨折检测系统源码和数据集:改进yolo11-EfficientHead
  • 【微信小程序】微信小程序基于双token的API请求封装与无感刷新实现方案
  • 华为无线AC主备配置案例
  • KNN算法详解:鸢尾花识别和手写数字识别
  • mysql安全运维之常见攻击类型与防御指南-从SQL注入到权限提升
  • .Net应用程序和SqlServer数据库使用tls加密会话过程
  • DMZ层Nginx TLS 终止与安全接入配置实战20250829
  • C5仅支持20MHZ带宽,如果路由器5Gwifi处于40MHZ带宽信道时,会出现配网失败
  • Git 合并冲突
  • 【网络】snat/MASQUERADE作用和应用场景
  • 【混合开发】Android+WebView视频图片播放硬件加速详解
  • 网页提示UI操作-适应提示,警告,信息——仙盟创梦IDE
  • 嵌入式学习 day61 DHT11、I2C
  • 项目一系列-第8章 性能优化Redis基础
  • Python OpenCV图像处理与深度学习
  • 30分钟入门实战速成Cursor IDE(2)
  • 30分钟入门实战速成Cursor IDE(1)
  • 微硕WINSOK高性能NP沟道MOS管WSP4067在Type-C双向快充电源管理系统中的应用
  • Vibe Coding、AI IDE/插件
  • Ansible Playbook 实践
  • 随机森林的 “Bootstrap 采样” 与 “特征随机选择”:如何避免过拟合?(附分类 / 回归任务实战)
  • html入门教程
  • Java使用apache.commons.math3的DBSCAN实现自动聚类