凌晨两点,我从一家无人便利店出来,攥着瓶水,恍惚了几秒——我付钱了?哦,付了。没有扫码,没有停顿,拿起就走。这种“偷窃感”十足的体验,背后是一套冷冰冰的算法,和一群快被逼疯的工程师。说实话,第一次进去我像个傻子一样在货架前反复拿起放下,就是想看它会不会搞乱,结果账单分毫不差。这玩意儿,到底是怎么看穿我的?
一、它不止是“看”,它在实时追踪你的骨骼
别以为就是摄像头录像。你一踏进店门,头顶那些不起眼的白色圆球——其实是定制化的RGB+深度传感器阵列——立刻给你分配了一个数字ID,然后开始画骨骼。对,就那种动画师用的骨骼绑定。你的肩膀、手肘、手腕,十几个关键点,每秒30帧地刷新。这不是比喻,算法上叫多目标实时姿态估计(Multi-person Pose Estimation),用的模型是OpenPose的变体,但为了跑在嵌入式设备上,做了大量剪枝,只保留了上肢骨架。为什么?因为购物主要靠手。

光有骨架不够。当两个人交错,骨架会重叠,系统怎么分清谁是谁?这里用了一个叫Deepsort的跟踪算法,它结合了运动模型和外观特征。运动模型用卡尔曼滤波预测下一帧的位置,外观特征呢——他们偷偷加了一个行人重识别(ReID)网络,把你的衣服纹理、背包形状压成一个128维的特征向量。当两个骨架交汇,系统就比对特征向量的余弦相似度,高分的归给同一个人。这一套,实验室里准确率能到98%以上。但现实嘛……后面聊坑的时候你就知道了。
更有趣的是拿取动作判断。怎么知道你拿了还是放回去了?规则+深度学习。手腕关键点靠近商品SKU区域,且速度曲线出现一个急停再平缓移动的特征,同时深度传感器检测到手部与货架的距离从近拉远,就视为拿取。反之视为放回。这套逻辑用了几十万条人工标注的拿取视频训练,类间召回率92%。不算完美,但够用——配上货架底部的重力传感器,就能交叉验证。
二、一次50人并发压测,数据撕开浪漫想象
去年秋天,我们在一个60平米的测试店里搞了场“癫狂购物节”:50个托儿同时涌入,有人正常购买,有人故意遮挡、互换物品、甚至把商品塞进对方的背包。目的就是搞死系统。结果?后端8张A100组成的GPU集群,总输入像素每秒2400万,推理延迟从平时的35ms飙升到120ms,但没有丢帧。最终统计:商品识别准确率97.4%,漏扫率1.2%,多扫率0.9%。作为对比,同规模传统便利店在高峰期的收银差错率约5%(算上人工漏扫、输错码),而且结账排队时间平均4.3分钟。

但别急着欢呼。这个97.4%意味着平均每人漏扫了不到1件,但场景里50人就是将近50件商品差错。账单对不上,损耗率依然有1.9%。而一家盈利平衡点要求损耗率低于0.5%。所以单纯的视觉方案,远没到可以放任不管的地步。于是才有了后面的多模态融合和人工兜底。
另外一个隐藏的数据:算力成本。8张A100一小时电费+折旧要上百块,一个店每天营业24小时,这成本摊下来能把利润吃光。后来我们转向了边缘计算,在店内部署基于Xavier的推理节点,只把异常视频片段上传云端二次核验。这样带宽和云端算力消耗降了70%。
坑1:当遮挡发生,系统像个脸盲症患者

最让我想砸键盘的bug:ID Switch。比如两个人擦肩而过,或者一个人弯腰捡东西,骨架重叠半秒,ReID特征没来得及匹配,系统就可能把A的后续动作挂到B身上。于是B的账单上多了一袋A拿的薯片,B怒了。我们曾经接到投诉,一个姑娘被收了包卫生棉,她发誓没拿——查录像,原来是被旁边的大妈挡住了。这个坑,纯算法极难根除,因为遮挡本身破坏了连续性。我们的解法是物理约束+步态辅助。每一层货架隔板都埋了四个压力传感器,精度正负2克,当拿取事件触发时,系统同步读取重量变化。如果视觉说是拿了一瓶可乐(约360g),但重量变化显示多了420g,就会标记疑似错拿,随后调取多角度快照让远程客服确认。另外,我们也在ReID里加入了步态特征——走路的姿势。这个信息在遮挡时不受影响,因为腿还能看到。加入步态后,ID Switch事件减少了40%。
坑2:99%准确率也可能亏到爹妈不认
很多人以为无人零售就是省人工。其实账得这么算:一个80平米店,传统店4个员工倒班,月人力2万4。无人店初期硬件投入150万,按5年折旧每月摊2万5;电费、带宽、清洁等运维月均5000;还得有个远程客服中心,一个人盯10家店,均摊下来月3000。不加损耗的话,月固定成本就3万3,比人工店还高!所以核心不是取代人,而是把损耗率从2%压到0.2%。我们最初因为漏识别和欺诈,损耗率高达2.5%,一直亏。后来上了狠招:异常行为监测模型。当顾客拿起商品后,身体有意遮挡商品超过5秒,系统立刻语音提示“商品已扫描,请放心”,同时客服切入实时画面。这招让故意偷盗率大降。又加入了出门复核:门禁处的摄像头做最后一次手持商品核对,跟购物清单比对,不一致就不开门。但牺牲了一点点体验——你得在门前停1秒。最终损耗率压到0.4%,开始盈利。
坑3:新品上架头几天,AI表现得像个智障

新品,特别是新包装零食,没训练过,系统要么当成“未知物品”触发报警,要么错误映射到相近SKU。我们曾把一款芦荟汁映射成漱口水——都是绿色瓶子,顾客发现账单后差点以为我们是黑店。解决方案:小样本生成+在线难例挖掘。供应商给10张实物图,我们用StyleGAN自动生成不同光照、旋转角度的变体,扩充到500张,然后自动标注分割掩膜,微调商品识别模型的最后一层。整个流程现在5分钟搞定,新品上线首日准确率92%,三天内通过抓取真实场景的难例(比如被手拿着的、半遮挡的)继续训练,提升到99%以上。另外,货架上也加了电子价签联动,当新品被拿起时,旁边的屏幕会亮起介绍,引导顾客正确拿起,这样同时收集了高质量训练数据。
回过头看,无人店根本不是浪漫的“拿了就走”,而是工程上无数个补丁堆出来的。每一个坑都得用真金白银和失眠的夜晚去填。不过话说回来,现在每次夜班出来,看到店里的灯光和安静运转的摄像头,我开始觉得这堆钢铁和代码,还挺性感的。