读懂一间餐厅,却不认得任何一张脸
餐厅里早就装了摄像头,可那些画面几乎只有在出了问题之后才会被人翻出来看。我们做的视觉系统在班次进行中读取同一路画面,把现场可以立刻处理的事情告诉服务人员,而系统里没有任何人脸模型。
- 行业住宿与餐饮
- 合作方式视觉系统与运营后端,由我们自己完整设计并实现
- 状态可运行的成品;面向门店安装的打包工作尚未完成
工程难点在于它拒绝去做的事
系统接入门店本来就在看的那个空间的常规摄像头视频流,把操作人员画定的用餐区域之外全部涂黑,只对剩下的画面做检测。产出的是餐厅经理真正用得上的三件事:哪些餐台有客人、哪些已经空出但杯盘还没收走、哪些坐了很久却一直没有服务人员过去。
值得讲的是那些约束。它靠制服而不是靠面孔来识别员工。它送往运营侧的是结构化事件而不是画面。它不会因为单独一帧就改变一张餐台的状态,也不会在门店自身的经营记录积累够之前给出推荐。每一项都是更难走的那条路,而它们合在一起,正是这套系统可以向被它观察的人解释清楚的原因。

一间餐厅对视觉系统提出的要求
这件事的难点不在于检测本身,而在于坐满客人的空间对解法施加的种种限制。
只会回看的摄像头
门店的摄像头一直在录,而这些录像通常要等到有人投诉之后才会被调出来。在那件事还来得及补救的时候,现场没有任何人收到提示。
谁都不该走的捷径
要分清服务员和客人,最快的办法是识别人脸。但在餐厅里这是一笔错误的交易:为了一点运营上的方便,把在场的每一个人都纳入生物特征系统,而门店既没法向客人解释,也没法向员工解释。
一次检测不等于一个状态
逐帧运行检测器,同一张餐台会仅仅因为有人从旁边走过,在一分钟里被读成有人、空着、又有人。每秒都在变的餐台图不承载任何信息,员工过一个班次就不再看它了。
支撑起其余部分的四个决定
每一个都放弃了更抢眼的说法,换成门店自己就能核实的说法。
身份来自制服,而不是面孔
把员工和客人区分开的,是我们自己训练、只认一样东西的检测模型:围裙。制服按重叠度与人体关联,即使围裙被椅子或旁人挡住几秒,判定也不会掉。整套系统里没有人脸检测、没有人脸识别,也没有任何跨镜重识别模型。
- 处理链路的任何环节都没有人脸模型
- 认的是制服,不是穿制服的那个人
- 画定的用餐区域之外,在分析之前就已被涂黑
带滞回的餐台状态机
占用与否不是逐帧读数。每张餐台都跑一个状态机,落座和空出各有独立阈值:判定一张台有人需要持续的证据,判定它空出来则需要更多。在这之上还有一个把输出变成工作清单的区分:已经离席但杯盘仍在的餐台不算干净,在收走之前它一直这么报。
- 落座与空出使用各自独立的确认阈值
- 空着,与空着但还没收拾,是两种不同状态
- 有客人却在设定时段内无人服务的餐台会发出逐级升级的提醒
人被读成几何关系
坐着还是站着,由身体几何而非学出来的标签判定:躯干相对竖直方向的倾角、躯干与腿的对齐、髋角与膝角,左右两侧分别投票并在最近若干帧上做平滑,关键点缺失时还有一条回退路径。与餐台的关联则针对落座场景做了调整,因为站立高度的框与餐台的重叠很不可靠。
- 姿态来自关节角度,左右分别投票并随时间平滑
- 落座的客人按身体下半部分与餐台关联
- 每一个阈值都是按门店可调的配置,而不是写死在代码里的常数
出去的是数据,名字必须有人批准
从视觉进程传到运营侧的是一条很小的结构化事件:某张餐台的状态、一次服务停留及其时长、店面重新布置后请求重新标定。画面解码、分析之后即被丢弃。视觉核心只产生一个按摄像头划分的匿名编号,要给这个编号配上名字,只能通过门店自己的员工名册。
- 线上传的是餐台状态和停留时长,不是画面
- 被追踪对象与具名员工之间的对应关系先由系统提出,再由人确认
- 店面重新布置后系统会主动提示,而不是照着过期的平面图继续汇报
这些约束换来了什么
本页没有任何数字。这里的任何一项都没有对照公开基准做过测量,因此下面写的是这套系统做了什么,用文字说明。
事件,不是画面
视觉进程向外发送的内容
架构把视频留在门店自己的设备上:视觉进程传出的是餐台状态、停留时长和重新标定请求。例外是那些确实需要图像的操作步骤,比如在一张静止画面上描出餐台边界,它们是有意开启、可以关闭的动作,而不是持续运行的通道。
不认脸
如何区分不同的人
员工靠制服识别,客人则完全不做识别。系统里没有人脸检测、没有人脸识别,也没有跨镜重识别模型,所以这是架构本身的性质,而不是事后加上去的一条规定。
不会硬猜
推荐
推荐这一侧用的是可以读懂、也可以被质疑的关联规则统计,在门店自身的经营记录积累到足够长之前,它既不训练也不预测。在那之前它如实报告已经收集到什么程度,而不是给出一个看起来很笃定的猜测。