第二章:系统总体架构设计——分层架构与模块交互

好,咱们直接进入正题。智能安防视觉系统,说白了就是把摄像头拍到的东西,变成有用的信息,再做出反应。这个链条看着简单,但真要落地,架构设计就是地基。地基不稳,后面全是坑。

我个人习惯,做系统架构先画分层图。为什么?因为分层能解耦。每一层只关心自己的事,出了问题也好定位。你想想看,如果所有代码揉在一起,摄像头采集、网络传输、算法分析、报警推送全在一个模块里,那改一个地方可能就崩一片。我早期一个项目就吃过这个亏,后来老老实实分层了。

2.1 四层架构:感知、传输、分析、应用

咱们这套系统,我把它分成四层。不多不少,刚好够用。

层级 核心职责 典型组件
感知层 数据采集与初步处理 摄像头、编码器、边缘盒子
传输层 数据可靠传输与协议适配 RTSP/GB28181网关、消息队列
分析层 智能分析与事件检测 AI推理引擎、规则引擎
应用层 业务逻辑与用户交互 告警平台、客户端、API网关

嗯,这里要注意:分层不是绝对的。比如边缘计算场景下,感知层和分析层可能会合并在一个边缘设备上。但架构设计时,逻辑上还是要分开,方便后续扩展。

2.2 感知层:不只是“拍个照”

感知层是系统的眼睛。很多人觉得就是装个摄像头,其实没那么简单。

我在项目中遇到过,某工厂的摄像头装好了,但晚上画面全是噪点,算法根本跑不起来。后来发现是选型时没考虑低照度场景。所以感知层设计,我建议至少考虑三点:

  • 分辨率与帧率:人脸识别至少1080P,车牌识别可能需要4K。帧率一般15-25fps就够,太高了传输压力大。
  • 编码格式:H.265比H.264省一半带宽,但解码更吃算力。边缘设备上我一般选H.264,服务器端用H.265。
  • 边缘预处理:比如在摄像头端做ROI裁剪、图像增强,能减少无效数据传输。我曾经在某个项目中,把边缘端的无效帧过滤掉,传输量直接降了60%。
小技巧: 如果摄像头支持ONVIF协议,尽量用。它能让你的感知层设备接入更标准化,省去很多适配的麻烦。

2.3 传输层:数据能不能到,就看这层

传输层是系统的血管。数据流不通,分析层再强也没用。

常见的传输方案有两种:

  • 实时流传输:用RTSP或GB28181协议,适合需要低延迟的场景,比如实时监控。但缺点是容易丢包,网络抖动时画面会卡。
  • 消息队列传输:用Kafka或RabbitMQ,适合非实时场景,比如告警事件上报。优点是可靠,消息不会丢,但延迟会高一些。

我个人的经验是:视频流走RTSP,事件数据走消息队列。两者互补,别混用。曾经有个团队把视频帧也塞进Kafka,结果消息体太大,队列直接堵死了。嗯,这是个教训。

传输层还有一个关键点:协议转换。不同厂商的摄像头可能用不同的协议,你需要一个统一的网关来适配。我一般用GB28181作为国标协议,再转成内部统一的RTSP流。

2.4 分析层:系统的“大脑”

分析层是核心。它接收传输层送来的数据,跑算法模型,输出事件结果。

分析层的模块划分,我建议这样:

  1. 视频解码模块:把压缩的视频流解码成原始帧。这一步很吃CPU/GPU,我一般用硬件解码来加速。
  2. AI推理引擎:跑目标检测、人脸识别等模型。这里要注意模型部署的格式,ONNX和TensorRT是主流。
  3. 规则引擎:把AI检测到的结果,结合业务规则做判断。比如“检测到人进入禁区”这个事件,需要AI检测到人,再结合区域坐标来判断。
  4. 事件聚合模块:把多个检测结果合并成一个完整事件。比如连续几帧都检测到同一个人,就只上报一次,避免重复告警。

避坑指南: 我曾经在分析层犯过一个错——把AI推理和规则引擎放在同一个进程里。结果模型推理卡住时,整个规则引擎也挂了。后来改成独立进程+消息通信,问题就解决了。记住:分析层内部也要解耦。

2.5 应用层:让用户看得见、用得上

应用层是系统的脸面。用户不关心你底层用了什么算法,只关心好不好用。

应用层我一般分三个子模块:

  • 告警管理:接收分析层的事件,做分级、去重、推送。比如“人员闯入”是紧急告警,“画面遮挡”是普通告警,推送方式不同。
  • 数据存储与回放:视频存到NAS或云存储,事件存到数据库。我建议用时序数据库存事件,查询效率高。
  • 用户交互界面:Web端或移动端。这里要注意实时性,告警推送最好用WebSocket,别用轮询。

你想想看,如果用户点开告警记录,要等3秒才看到画面,那体验就太差了。所以应用层要跟传输层配合好,预加载关键帧。

2.6 模块交互流程:数据是怎么跑的?

光说分层还不够,咱们得看看数据到底怎么流。我画一个典型的交互流程:

感知层(摄像头) 
    ↓ RTSP视频流
传输层(流媒体网关) 
    ↓ 解码后的帧数据(通过消息队列)
分析层(AI推理引擎 → 规则引擎) 
    ↓ 事件结果(JSON格式)
传输层(事件消息队列) 
    ↓ 
应用层(告警管理 → 用户界面)

这个流程里,有几个关键点:

  • 感知层到传输层:用RTSP推流,传输层做协议转换和缓存。
  • 传输层到分析层:用消息队列解耦。分析层可以水平扩展,加机器就能提高处理能力。
  • 分析层到应用层:事件数据走消息队列,保证不丢。视频回放走单独的文件存储路径。
注意: 如果分析层处理速度跟不上感知层的采集速度,就会造成数据积压。我建议在传输层加一个“背压”机制,当队列满了就丢弃旧帧,保证实时性。别让旧数据把系统拖死。

2.7 架构设计的取舍

最后说点实在的。架构没有完美的,只有适合的。比如:

  • 如果项目是小型场景(比如一个门店),感知层和分析层可以合并到一台边缘设备上,省去传输层。
  • 如果是大型场景(比如一个城市),传输层和分析层都需要分布式部署,还要考虑负载均衡。
  • 如果对实时性要求极高(比如周界防范),分析层要尽量靠近感知层,减少网络延迟。

我记得有一次做智慧园区项目,客户要求所有告警延迟不超过1秒。我们最后把分析层直接部署在边缘服务器上,传输层只做事件上报,视频流不走网络。嗯,效果很好。

好了,这一章就到这里。下一章咱们聊聊感知层的具体选型和部署细节。有什么问题,欢迎交流。