如果你去商场、连锁门店、展馆这些地方做过客流项目,大概率听过运营方吐槽过同一句话:“你们这个系统怎么又把一个人数成三个人了?”这是传统2D摄像头客流统计最常见的翻车场景——早晚高峰顶光一打、浅色衣服和地面颜色一融、人贴着人排队,检测框就开始乱跳,数据自然没法用。后来我逐步把方案切换成“3D视觉+AI”的路线,才算是把这些问题压下去。这套思路这两年落地得很快,核心链路就是从Sensor Pipeline到数据事件引擎,把相机里的原始深度数据一步一步变成业务能直接消费的进出事件、区域热力、停留时长。
这篇文章没有太多学院派理论,更多是工程落地里的取舍。我会按我们自己真的在项目里走过的路径来写:先讲为什么选3D视觉而不是普通2D方案,再拆Sensor Pipeline怎么搭、AI推理层怎么设计,最后落到数据事件引擎——因为“数出来一个人”只是开始,让下游业务系统用起来才叫结束。适合正在做智慧零售、门店数字化、展馆管理的技术人员,也适合打算自建客流系统但还在方案调研阶段的同学参考。
1. 为什么客流系统选择了3D视觉这条技术路线
1.1 2D方案的核心痛点:光照、遮挡和“人的尺度”
传统2D摄像头客流系统,本质上依赖RGB图像里的人体检测和跟踪。单目相机没有深度信息,模型只能靠像素上的外观特征去猜距离和遮挡关系。在实际门店环境里,这件事极其脆弱。
我自己踩过的几个真实场景:
- 门店入口做的是玻璃幕墙,下午两三点太阳直射进来,RGB图像上一片过曝,人走进来就是一个白影,检测框直接丢失。
- 晚上打烊前灯光调暗,深色衣服的顾客和黑色背景墙融成一片,检测器把整个人“吞”掉。
- 排队高峰期,前后两个顾客身体重叠超过70%,单目跟踪器几乎必然发生ID Switch,同一个人的轨迹前半段算A、后半段算B,计数自然翻倍。
这些问题不是调参能解决的,而是传感器维度缺失导致的天花板。单目相机能拿到的是2D像素坐标,但在真实商铺里,我们要的是“这个人是不是真的跨过了这条线”“他在货架前站了多久”“他去的区域是哪块”这类具备空间语义的问题。没有深度信息,空间语义只能靠猜测。
1.2 3D传感方案的三种主流形态对比
3D视觉客流系统目前主流落在三种深度传感技术上:双目立体、结构光、ToF(飞行时间)。三者各有各的脾气,直接决定了你的Sensor Pipeline怎么写。
| 技术路线 | 成本 | 中远距离表现 | 光照敏感度 | 算力开销 | 适合场景 |
|---|---|---|---|---|---|
| 双目立体 | 中 | 依赖纹理,白墙场景拉胯 | 受光照影响较大 | 高(需要实时立体匹配) | 室内纹理丰富场景 |
| 结构光 | 中高 | 近距离精度高,远距离衰减快 | 强光下基本报废 | 中 | 近距精细建模,不太适合客流 |
| ToF | 中 | 距离范围广,精度够用 | 对环境光有一定容忍度,直射阳光会饱和 | 低 | 室内客流、仓储、展馆,目前最主流 |
客流项目我强烈建议优先评估ToF,尤其是顶装或斜顶装场景。原因是客流统计本质上需要的不是毫米级精度,而是“人在哪、往哪走、停留多久”这个粒度的空间信息,ToF在0.3米到8米这个区间内表现得相当稳定。它的分辨率确实不如RGB相机,但做行人级检测绰绰有余;而且ToF对纹理不敏感,白墙、玻璃、纯色地面这些让双目方案头疼的场景,ToF反而不太在乎。
结构光在客流里用得少,主要原因是有效距离短,通常两三米开外精度就崩了,而门店入口的监控区域动辄四五米深。双目最大的问题是算力——实时立体匹配非常吃资源,如果边缘盒子还要跑AI模型,很容易把算力预算撑爆。ToF这边深度图直接输出,省掉的这步预处理能省出大量CPU和内存。
1.3 选型前必须想清楚的两个约束:安装高度和视场角
很多团队一上来先挑相机型号,这是个顺序错误。选3D传感器之前,必须先想清楚物理安装条件,因为它决定型号、焦距、俯仰角、量程,整条Pipeline都跟着变。
客流场景一般有两种典型安装方式:
- 顶装:相机装在通道正上方,高度2.8米到3.5米,垂直向下或者接近垂直。这种方式的优势是俯视视角下人头和肩膀的轮廓非常清晰,遮挡最少,是计数最稳的方式。缺点是覆盖区域偏小,适合闸机口、单向通道这类窄区域。
- 斜顶装:装在墙角或者门头,往下倾斜45度到60度,覆盖面积大,能兼顾通道和部分店内区域。这种方式的缺点是斜视角度下人与人遮挡比较严重,对跟踪算法要求高。
选型时,根据安装高度和期望覆盖宽度,算一下需要的垂直视场角。以3.2米顶装、覆盖2.5米宽通道为例,视场角至少要在60度以上,否则边缘区域的人会被切掉半个头。还要特别注意ToF相机的量程下限——有些型号最近探测距离是0.4米,安装太高导致下方出现盲区,那就直接废了。
我自己常用的组合是:顶装单通道用Intel RealSense D435i或者Orbbec Astra Pro Plus,顶装宽区域或斜顶装用频率更稳的ToF型号(比如Orbbec Femto Bolt或者Azure Kinect这类),具体看预算和算力平台来定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Sensor Pipeline:从深度图像到干净点云流的完整链路
2.1 Pipeline的两个阶段:取流与空间变换
所谓Sensor Pipeline,很多人理解成“把深度图取出来就行了”,这在客流系统里远远不够。真正的Pipeline应该包含两条支线:一条负责把传感器原始输出变成结构化深度数据,这是取流阶段;另一条负责把深度数据映射到真实世界坐标,这是空间变换阶段。两条支线都走完,AI推理层拿到的才不是“一张图”,而是“一群人各自在空间里的位置”。
取流阶段干的事情包括:
- 配置相机参数(分辨率、帧率、深度精度、曝光模式)。
- 从SDK获取深度帧、红外帧、RGB帧(如果有)。
- 对深度帧做时间滤波和空间滤波,去掉传感器底噪。
- 将深度图转成点云,做ROI裁剪和地面剔除。
空间变换阶段干的事情包括:
- 相机内参标定:去掉镜头畸变,确保深度图和RGB图对齐。
- 相机外参标定:把点云从相机坐标变换到世界坐标,让“相机看到的”变成“空间里真实存在的”。
- 多机时间同步:多个相机在同一个空间部署时,统一时基。
2.2 深度图怎么变成可以喂给AI的点云
ToF相机输出的深度图,本质上是一张每个像素点存了距离值的二维矩阵。要从深度图变成点云,最底层的一步是使用相机内参做反投影:
- 给定像素坐标(u, v)和深度值d,根据内参fx、fy、cx、cy,可以算出该点在相机坐标系下的三维坐标(x, y, z)。这个公式任何一个3D视觉SDK都内置了,但你要清楚它为什么存在:因为只有反投影到三维空间,你才能把“像素的距离”变成“真实世界里的坐标”。
点云出来了,还不能直接用。ToF传感器在黑色头发、黑色衣服这些吸光物体上会产生典型的“飞点”——就是深度图像上出现一些孤立且跳变的像素。还有靠近边缘的物体,因为入射角太大,返回信号弱,也会产生空洞。所以Pipeline里至少要加三道滤波器:
- 时域滤波:对连续多帧的同一像素做中值或均值,把随机飞点打掉。可以理解为拍视频的时候把几帧叠在一起降噪。
- 空域滤波:对深度图做双边滤波,保留边缘同时平滑表面。这一步能防止把地面的微小起伏误判成障碍物。
- 离群点移除:在点云空间里检查每个点的邻域密度,孤立点直接删掉。
这三步做完,点云才算是“干净”了。
2.3 空间标定:让AI知道“哪里是门线”
我遇到不少团队在设备装好后,直接把相机画面里的某个位置画一条线当成计数线——这在顶装垂直视角下勉强能用,但在斜顶装、任意视角下就是错误的,因为图像坐标到地面坐标有一个透视变形,你画在画面上的直线,在真实地面上根本不是一条直线。
正确的做法是先把相机的位姿算出来,也就是外参。常规方法有几种:
- 手动标定法:在场景里放几个已知真实坐标的标记点,然后用PnP求解相机位姿。
- 交互式直线标定法:在地面上选一条已知长度的线段(比如一块地砖长度为0.6米),配合地平面假设,估算相机高度和俯仰角。
- 工厂标定法:部分商用设备出厂自带相对地面的标定信息,但还是建议现场校验一遍。
标定完成后,把点云乘以变换矩阵,转到世界坐标。这时候你画“门线”才是真正画在地面上的一条线。线有了真实空间坐标,后面的跨线计数才有几何意义。
2.4 多相机同步:一个不容忽视的工程细节
如果项目只有一台相机,Pipeline到这里就可以停了。但大部分真实场景是商场入口、中庭、多个货架区,需要多台相机覆盖。这时候会遇到一个恶心的问题:每台相机帧率虽然都是30fps,但各自的时钟是独立的,你拿A相机的第30帧和B相机的第30帧,实际采集时刻差了可能几十毫秒——人在动的过程中,这几十毫秒就是几十厘米的位置误差。
处理办法有两种:
- 软件同步:用NTP或者PTP统一所有设备的系统时间,帧上打时间戳,消费端按时间戳对齐。成本低,但精度一般,误差在几十毫秒量级。
- 硬件同步:部分工业级ToF相机支持外触发或者多机级联。以Azure Kinect为例,多台设备可以采用同步电缆级联,让所有相机在同一时刻曝光。这样多视角的点云在时间上是严格对齐的。
如果做的是单相机覆盖独立通道,硬件同步可以省掉;如果多相机画面存在重叠区域,要拼接轨迹或者做接力跟踪,硬件同步就是刚需。这个决策要在设备选型阶段就定下来,不然后期改造成本很高。
3. AI推理层:跨线计数、目标跟踪与热力统计的实现逻辑
3.1 3D空间里的目标检测:两套思路各有优劣
Sensor Pipeline输出的是干净点云和对应的世界坐标,AI推理层要回答的问题是:这里面有多少人?各自在哪?往哪个方向走?目标检测这步,在客流项目里有两种主流实现路径。
路径A:深度图做2D检测,再映射回3D坐标。具体做法是把深度图当成一张单通道图像,用轻量化的2D检测器(比如YOLOv5n、YOLOv8n这类)在深度图上检测人头、头肩区域,然后取目标框中心对应位置的深度值,结合内参反投影算出3D坐标。这个方法的优点是检测器生态成熟,训练数据好搞,部署简单;缺点是深度图上人头和背景对比度不一定好,特别是黑色头发区域容易出现空洞,检测框可能不稳定。
路径B:点云俯视图投影,直接在“2.5D鸟瞰图”上检测。做法是把点云按照世界坐标投射到一个水平栅格上,每个格子保留最高的z值,形成一张俯视密度图。人的头顶在这个图上是一个个亮斑,聚类或者小目标检测都能把它们分开。这个方法的优点是俯视图天然避免了人与人重叠的问题,人在空间里的平面坐标直接就是栅格坐标,不需要再做透视变换;缺点是丢失了高度细节,对弯腰、蹲下这类姿态不敏感。
实际项目里,我倾向用路径B作为主检测手段,路径A作为兜底。因为顶装和斜顶装场景下,人在俯视图上的间距天然比在侧视图上大,聚类效果稳定得多。尤其在人流密集的通道,路径B几乎是唯一抗遮挡的务实选择。
3.2 跟踪与跨线计数:3D坐标让SORT算法变得很能打
检测拿到每一帧的3D位置之后,下一步是把连续帧的位置串成轨迹。在2D场景里,SORT(Simple Online and Realtime Tracking)这种基于卡尔曼滤波和IOU匹配的跟踪器表现平平,因为2D框的大小随距离变化,匹配质量忽高忽低。但在3D世界里,SORT的威力会被放大——因为世界坐标下的目标位置几乎不受视角影响,同一个人的轨迹在空间上是极其平滑的。
具体实现逻辑:
- 状态向量设计为(x, y, z, vx, vz),用卡尔曼滤波预测下一帧位置。
- 检测结果与已有轨迹做匈牙利匹配,代价矩阵基于3D欧氏距离。
- 匹配上的轨迹更新状态,未匹配上的检测点初始化新轨迹,未匹配上的轨迹进入待删除队列。
- 轨迹连续多帧未更新则删除,短暂丢失后重新出现且距离预测位置很近的,直接续接。
跟踪稳定了,跨线计数就是纯粹的几何判断:在世界上任选两个点定义一条线段,每条轨迹第一次与该线段相交时,判断方向是正还是负,分别计为进或出。
这里有几个必须注意的细节:
- 相交判定不能只看单帧,因为目标可能恰好在线附近抖动。一般用“上一帧在线的一侧,当前帧在线的另一侧”这个跨越事件来触发,并配合一个冷却时间窗(比如同一轨迹2秒内不能重复触发同一条计数线)。
- 重复计数的问题,本质上不是因为算法不行,而是因为ID Switch。所以事件引擎设计里一定要保留轨迹ID,它在后面去重和拼接里扮演关键角色。
3.3 轨迹平滑与区域驻留:不只是“数人头”
除了进出计数,门店运营方还想要“哪个区域停留的人最多”“顾客在货架前看了多久”。这些指标在3D方案里实现起来非常自然。
区域热力:把覆盖区域切成0.5米乘0.5米的栅格,每帧把检测到的所有人头位置累加到栅格上,按时间累积,就得到一张热力图。这里有个体感参数:栅格太小,热力很碎;栅格太大,又看不出货架级别的差异。0.5米是普通门店货架宽度的量级,是我试下来最通用的起点。
停留时长:定义好感兴趣区域(比如某组货架前1.5米范围),当轨迹进入该区域时记录进入时间,离开时计算差值。如果同一ID在区域内反复进出,可以做时间窗口合并,把30秒以内的短暂离开视为同一段驻留。这种“会话化”的处理,是后面事件引擎的设计雏形——你已经在把连续的轨迹切成有业务语义的片段了。
我自己在试过一段时间之后,明显感觉到3D轨迹的数据质量比2D方案高了一个量级。卡尔曼滤波输出的3D轨迹,抖动极小,区域边界附近的判断非常稳定。这直接让下游事件引擎可以少写很多“魔法修复代码”。
4. 数据事件引擎:把轨迹数据翻译成业务语言
4.1 为什么要单独做一个“事件引擎”
很多客流项目做到“能数出进出人数”就算交付了,但这类项目往往很难真正让业务方持续使用。原因是“今天进了100个人”这种粗粒度数字,对运营来说只是一个日报数字,没法指导现场动作。真正有用的是这些:
- “刚才有一个顾客在A货架前站了超过3分钟,可以考虑导购介入。”
- “收银台前排队人数超过5人且持续超过1分钟,应该加开窗口。”
- “儿童区在下午4点到5点之间热度明显上升,可以安排活动。”
要让数据产生这种级别的价值,你不能把AI推理层的输出直接往外怼,而要把“轨迹”翻译成“事件”。这就是数据事件引擎的职责:把连续时空轨迹切分为具有业务含义、可消费、可追溯的离散事件。
4.2 核心设计:事件类型、事件结构与生命周期
一个可用的事件引擎,至少需要定义清楚三件事:有哪些事件类型、事件长什么样、事件如何被消费。
事件类型方面,我常用的最小集合是:
| 事件类型 | 触发条件 | 典型消费方 |
|---|---|---|
| ENTER | 轨迹从外侧跨越入口计数线 | 客流日报、大屏展示 |
| EXIT | 轨迹从内侧跨越出口计数线 | 客流日报、大屏展示 |
| ZONE_ENTER | 轨迹进入某个兴趣区域 | 导购提醒、区域热度 |
| ZONE_EXIT | 轨迹离开某个兴趣区域 | 驻留时长计算 |
| DWELL | 同一轨迹在区域内停留超过阈值 | 导购提醒、异常行为检测 |
| HEAT_UPDATE | 栅格热度增量达到阈值 | 可视化大屏热力刷新 |
事件结构方面,我建议至少包含以下字段:
- event_id:全局唯一标识,消费端用来做幂等。
- device_id:产生事件的设备编号,多设备部署时定位用。
- track_id:对应的轨迹ID,排查问题时能一路追回原始数据。
- event_type:事件类型。
- ts:事件发生时间,统一用毫秒级Unix时间戳。
- payload:事件附带的具体信息,比如坐标、方向、持续时间。
生命周期方面,事件引擎必须处理“轨迹未终结时事件是否发出”的问题。拿DWELL事件举例:轨迹已经在区域内停留了3分钟,但人还没走,你不能等他离开才发事件,那样导购提示就晚了。业界通常用“阈值触发+冷却时间”的方式:达到阈值先发一次事件,之后每过相同时间阈值窗口再更新一次。相当于先给一个“持续驻留中”的信号,后面跟进“还在驻留”的更新信号。这个设计跟很多监控系统的“告警+恢复”模型如出一辙。
4.3 事件去重与轨迹拼接:先想清楚怎么处理ID中断
事件引擎最容易被忽视、但上线后最先炸的地方,就是重复事件。
一个人因为遮挡导致轨迹中断5秒,再次出现时有了新的track_id,如果这时候他恰好又跨了一次计数线,事件引擎的执行逻辑就会再次触发ENTER事件——于是同一个人的第二次进入被重复统计。这个问题在2D系统里几乎是绝症,但在3D系统里可以通过两个机制大幅缓解:
- 空间校验:新轨迹产生ENTER事件时,检查其初始位置和轨迹消失时最后位置的3D距离,如果小于阈值(比如0.8米),判定为轨迹续接而非新目标。
- 时间窗校验:如果轨迹中断时间小于阈值(比如10秒),即便track_id变了,也在事件引擎内部把新旧轨迹拼接成同一个会话,后面的DWELL、EXIT事件沿用原始会话ID。
这层逻辑在事件引擎里做,比在跟踪器里做更合适。跟踪器要保持实时性,不愿意为了“可能发生也可能不发生”的续接浪费算力;事件引擎是异步的,有足够的时间窗口去梳理因果。
我踩过的坑是:一开始把轨迹续接逻辑放在AI推理线程里,结果多相机接力跟踪时跟踪器线程越来越慢,最后整条链路延迟增高。后来把续接和补发事件全部挪到事件引擎的消息队列里,用异步处理,速度问题立刻消失了。
4.4 对外投递:MQTT、Webhook还是Kafka
事件引擎内部生成事件之后,要考虑怎么投递给下游。落地时要看下游是谁。如果是自己的前端大屏,进程内回调就够了;如果是第三方导购系统、总部数据中台,一般用MQTT、Webhook或者Kafka。
我的推荐:
- 小规模单店:MQTT + Webhook 组合。MQTT做实时订阅,Webhook做可靠投递(失败重试)。
- 中大规模连锁:事件引擎内嵌Kafka生产者,下游各系统按需消费。Kafka能提供消息持久化和重放能力——出问题时可以拉取一段时间内的事件流复盘,这个能力在系统排查时太重要了。
一个事件投递的JSON示例长这样:
json复制{
"event_id": "evt_9f82b1c4a21e4b0e8d7a6f3c2b1a5e9d",
"device_id": "cam_entry_001",
"track_id": "trk_a3f2c1d9",
"event_type": "ENTER",
"ts": 1702838400000,
"payload": {
"line_id": "entry_main_door",
"direction": "in",
"x": 1.82,
"z": 0.65,
"confidence": 0.97,
"dwell_ms": 0
}
}
这里的confidence字段是AI推理层给的检测置信度,事件引擎原样透传。下游如果关心数据质量,可以根据置信度做二次筛选;不关心就可以忽略。这也是事件引擎设计的一个原则:上游不要替下游做消费决策,把尽可能多的上下文信息带到事件里,让下游各自加工。
关于事件幂等,我要多说一句:几乎所有消息中间件都承诺“至少一次”投递,而不是“恰好一次”。所以不管是MQTT还是Kafka,下游消费者最好以event_id作为幂等键做一层去重。很多问题我们都遇到过——网络抖动导致同一事件推送了两次,下游没有幂等设计,报表直接翻倍。这一层不能指望事件引擎自己去重处理,因为可能有多个消费者各自消费。
5. 落地部署中的坑:从安装到长期运行的真实经验
5.1 安装环节的三个隐藏问题
第一个是吸光材质。深色头发、黑色衣服在ToF深度图上的反射率很低,容易产生空洞或飞点。顶装时如果恰好是头顶正上方有射灯,黑色头发还会把射灯的反射信号吸收,造成头顶区域出现局部凹陷。这些东西在实验室里很难发现,到了现场才暴露。对策是:现场安装后先用一个穿深色衣服的人走一遍测试区域,打开深度可视化看效果,如果发现头顶区域深度明显不稳定,就要考虑调整相机高度或角度,而不是在算法里硬扛。
第二个是反光地面。抛光瓷砖、玻璃地面对ToF信号会产生镜面反射,点云在地面上会出现“倒影”——地面以下出现虚点。这类点云如果直接参与地面检测或有异物计数,会产生大量误报。最简单的方案是:在预处理阶段对地面附近点云做一次保守的深度滤波,把低于地面一定高度的点全部移除。
第三个是设备散热。工业级ToF相机发热量不小,如果装在密封的安装盒里,长期运行会导致深度图像质量退化。我遇到过一台设备运行两周后深度图突然布满条纹,排查到最后是散热不良导致传感器温度超标。安装设计时一定留好通风或者加装小风扇,这看起来是个小事,但能在后续运维里省掉大量工时。
5.2 多机互扰问题:ToF相机之间的干扰
ToF相机的原理是发射调制红外光并测量反射光的时间差。当多台ToF相机同时工作在同一区域时,它们发射的红外光可能互相干扰,导致深度图出现周期性波纹或者大块噪声。
处理手段有几种:
- 频率分集:部分型号支持多个调制频率,相邻相机设置不同频率,可以减少互扰。
- 时间分集:多台相机错峰曝光,把开始曝光的时间错开,虽然牺牲一点全局同时性,但能显著降低干扰。这个方法成本最低,尤其在非重叠区域使用完全可行。
- 硬件同步:用同步电缆让多台相机在同一时刻曝光。在物理上彻底消除互扰,但要求设备支持同步输入,且现场部署时要多花布线成本。
我的建议是:有重叠覆盖区域的多相机,优先走硬件同步;没有重叠覆盖但距离较近的相机,先试试时间分集。不要上来就给全部相机做硬件同步,成本和复杂度会显著上升。
5.3 长期运行的数据漂移与维护节奏
3D客流系统上线后,不等于可以当甩手掌柜。实际运行中最大的坑是环境变化带来的数据漂移。
举个例子:一个门店入口,施工队进场后在地面加铺了一块深色地垫,深度图里这块区域的反射率变化,导致检测置信度整体下降,客流数字开始偏低。这种问题,算法自己不会发现,你需要一个质量监控机制。
我常用的做法是:在事件引擎里加一个“健康度指标”——每小时统计一次每台相机的检测框数量、平均置信度、跨线事件数量,与历史同期做对比。如果出现明显下降(比如置信度中位数从上个月的0.95降到0.8),就触发一个系统事件推送给运维人员,让运维去现场检查是否发生了环境变化。这相当于给系统加了一个“自检告警”,收益极高但很多项目都没有做。
维护节奏上,建议每个月定期巡检一次深度图可视化,目视检查有没有新的干扰源;每季度做一次点位复标定,因为一些场景里相机可能因为清洁、碰撞等原因产生几厘米的位移,这种位移肉眼看不出来,但会直接改变计数线的世界坐标,需要在标定层做校正。
5.4 隐私合规与数据留存:技术之外必须想清的事
最后说一个技术方案本身解决不了、但每个项目都绕不开的点:3D深度数据同样属于个人信息范畴,尤其是如果设备还带RGB摄像头,那就直接涉及人脸等生物特征信息。
我的建议是,在架构层面做“数据最小化”设计:
- 如果场景不要求人脸级别精度,直接关闭RGB传感器,只保留深度和红外灰度。深度图像中的人形轮廓不包含人脸细节,隐私风险大幅降低。
- 事件引擎对外投递的事件中,尽量不要包含原始点云或者深度图,最多包含坐标和置信度。如果需要现场复盘,把原始数据加密留存本地,设定留存周期并定期删除。
这部分一定要在方案设计阶段就和需求方对齐清楚,否则系统上线后会非常被动。我在几个项目上就是因为提前做了RGB“断供”处理,业务方和法务都很满意。
做多了3D视觉客流项目之后,我个人最深的体会是:这套系统的核心挑战从来不在某一环节的算法有多“高大上”,而在于整条链路的完整性。Sensor Pipeline做得不干净,AI推理层天天处理脏数据;事件引擎设计得不清晰,再准的检测结果到下游也是一团乱麻。我建议准备上这类项目的团队,动手前先花一半的时间把业务事件模型定义清楚——你到底要产出哪些事件、每条事件给谁消费、消费之后做什么动作。这个想透了,比什么模型选型都重要。
