这行代码我敲了第三遍,还是报同样的内存溢出错误。
为了证明那些吹嘘“深度视觉识别”的无人便利店在扯淡,我决定自己动手。不就是调用个OpenCV吗?我甚至没打算训练自己的模型,就用现成的Haar级联分类器,识别我桌上这几瓶饮料总行吧。可乐、雪碧、矿泉水,包装颜色和形状差异那么大。
结果呢?光是配环境就耗掉我大半个下午。Python版本冲突,OpenCV的whl包死活装不上,最后不得不把整个Anaconda环境推倒重来。等我终于看到摄像头画面在屏幕上弹出来的时候,窗外天都黑了。这还只是万里长征第一步。
真正的滑稽戏从调用分类器开始。我找了个据说能识别“瓶子”的预训练xml文件。启动,对准桌上那瓶孤零零的可乐。识别框颤颤巍巍地出现了,像个醉汉一样在可乐瓶周围晃荡,时而套住半个瓶身,时而又飘到旁边的键盘上。这精度,别说计数了,连“有没有瓶子”都判断得模棱两可。
我较上劲了。调整参数,minNeighbors调到5,scaleFactor调到1.1,据说能更精确。再试。这回识别框稳了点,但新的问题来了:我把两瓶饮料靠在一起。在OpenCV的“眼”里,它们立刻合并成了一个巨大的、形状诡异的“物体”。我稍微移动一下摄像头角度,或者把台灯的光线从正上方改成侧打,刚才还能勉强认出来的瓶子,瞬间就从画面里“消失”了。
这还只是最最基础的物体检测,连分类都谈不上。我查了查资料,想试试更高级的,比如用HOG特征加SVM,或者哪怕跑一个现成的YOLO tiny模型。结果现实给我泼了盆冰水。光是下载YOLO的权重文件就慢如蜗牛,跑起来之后,我那台勉强算主流的开发本风扇立刻起飞,画面卡成PPT,识别一帧要两三秒。就这性能,还实时结算?还多人同时购物?扯淡。
我瘫在椅子上,盯着屏幕上那个抽搐的识别框。那些融资新闻怎么写来着?“基于先进的计算机视觉技术,实现即拿即走,误识别率低于千分之五”。我现在信了,千分之五的误识别率,大概指的是投资人PPT上的数字吧。
真正的难点根本不是算法本身,而是落地。光线变化怎么办?商品被部分遮挡怎么办(专业术语叫Occlusion,遮挡处理)?不同角度、不同摆放姿态下的泛化能力怎么办?为了应对这些,需要多角度、多光照条件下的海量标注数据,需要昂贵的GPU算力做实时推理,需要针对具体场景(比如那个冰柜的尺寸、灯光布局)做极其细致的调优。每一分性能的提升,背后都是成堆的钞票和工程师的头发。
而他们宣称的成本呢?一个“智能冰柜”只比普通冰柜贵几百块?光是一块能本地跑轻量级模型的边缘计算盒子就不止这个价了。要么是识别效果惨不忍睹,要么就是在云端处理——那网络延迟和稳定性呢?店里人多网络卡一下,是不是就白拿了?
想到这里,我反而有种诡异的痛快感。技术这玩意儿,你不亲手去碰一下,永远不知道坑有多深。我调一个下午OpenCV的狼狈,可能就是那些明星初创公司CTO们一整年的噩梦缩影。只不过,他们必须把噩梦包装成童话,讲给坐在空调房里的人听。
关掉程序,电脑风扇渐渐安静下来。屏幕黑了,映出我33岁、有点油的脸。什么无人零售,什么视觉革命,在2017年的这个晚上,在我这张堆满饮料瓶的桌子上,它连一瓶可乐都认不利索。
但我知道,故事会继续讲下去。直到下一个更唬人的概念出现。














