本地生活场景中包含大量极富挑战的计算机视觉任务,如菜单识别,招牌识别,菜品识别,商品识别,行人检测与室内视觉导航等。
这些计算机视觉任务对应的核心技术可以归纳为三类:物体识别,文本识别与三维重建。
2018 年 11 月 30 日-12 月 1 日,由 51CTO 主办的 WOT 全球人工智能技术峰会在北京粤财 JW 万豪酒店隆重举行。
本次峰会以人工智能为主题,阿里巴巴本地生活研究院人工智能部门的负责人李佩和大家分享他们在图像识别的过程中所遇到各种问题,以及寻求的各种解法。
什么是本地生活场景
我们所理解的本地生活场景是:从传统的 O2O 发展成为 OMO(Online-Merge-Offline)。
对于那些打车应用和饿了么外卖之类的 O2O 而言,它们的线上与线下的边界正在变得越来越模糊。
传统的线上的订单已不再是只能流转到线下,它们之间正在发生着互动和融合。
在 2018 年,我们看到滴滴通过大量投入,组建并管理着自己的车队。他们在车里装了很多监控设备,试图改造线下的车与人。
同样,对于饿了么而言,我们不但对线下物流的配送进行了改造,而且尝试着使用机器人,来进行无人配送、以及引入了智能外卖箱等创新。
可见在本地生活场景中,我们的核心任务就是将智能物联(即 AI+IoT)应用到 OMO 场景中。
上图是阿里巴巴本地生活饿了么业务的人工智能应用的逻辑架构。和其他所有人工智能应用计算平台类似,我们在底层用到了一些通用的组件,包括:数据平台、GPU 平台、特征工程平台、以及 AB 测试平台。
在此之上,我们有:智能配送、分单调度和智能营销等模块。同时,算法人员也进行了各种数据挖掘、机器学习和认准优化。
目前对于阿里巴巴的本地生活而言,我们的图像视觉团队承担着整个本地生活集团内部,与图像及视觉相关的所有识别和检测任务。而所有的图像处理都是基于深度学习来实现的。
我将从如下三个方面介绍我们的实践:
物体识别
在我们的生活场景中,有着大量对于物体识别的需求,例如:
对于图片目标的检测评价,目前业界有两个指标:
上图列出了目标检测的常用基础算法,它们分为两类:
两步法历史稍久一些,它源于传统的滑窗法。2014 年,出现了采用深度学习进行目标检测的 R-CNN。
之后又有了金字塔池化的 SPP 方法,以及在此之上研发出来的 Fast R-CNN 和 Faster R-CNN 两个版本。
当然,Faster R-CNN 算法在被运用到机器人身上进行实时检测时,为了达到毫秒级检测结果的反馈,它往往会给系统的性能带来巨大的压力。
因此,有人提出了一步法,其中最常用的是在 2016 年被提出的 SSD 算法。
虽然 2017 年、2018 年也出现了一些新的算法,但是尚未得到广泛的认可,还需进一步的“沉淀”。
下面,我们来讨论那些针对不同场景目标的解决算法。在此,我不会涉及任何的公式,也不会涉及任何的推导,仅用简单浅显的语言来描述各个目标检测算法背后的核心思想。
R-CNN 的简单思路是:
各种上述 R-CNN 流程最大的问题在于:产生的候选框数量过多。由于矩形框的形状,包括长度、宽度、中心坐标等各不相同,因此如果一张图中包含的物体过多,则找出来的矩形框可达成千上万个。
鉴于每个候选框都需要单独做一次 CNN 分类,其整体算法的效率并不高。当然,作为后期改进算法的基础,R-CNN 提供了一种全新的解决思路。
SPP(空间金字塔池化)的特点是:
上图是我整理的 Faster R-CNN 执行逻辑框架图,其流程为:
可见,上述提到的各种两步方法虽然精度高,但是速度较慢。而在许多真实场景中,我们需要对目标进行实时检测。
例如:在无人驾驶时,我们需要实时地检测周围的车辆、行人和路标等。因此,一步方法正好派上用场。YOLO 和 SSD 都属于此类。
YOLO 方法的核心思想是:对于整张图片只需要扫描一次,其流程为:
由于此方法较为古老,因此在实际应用中,一般不被作为首选。
作为我们的首选,SSD 采用了一种类似于金字塔结构的处理方法。它通过循环来对给定图片不断进行降采样,进而得到分辨率更低的另外一张图片。
同时,在降采样之后的低分辨率图片上,该方法还会反复进行物体检测,以发觉物体的信息。
因此,SSD 的核心思想是:将同一张图片分成了多个级别,从每个级别到其下一个级别采用降采样的方式,从而检测出每个级别图片里的物体框,并予以呈现。
可见,对于 YOLO 而言,SSD 能够发现不同分辨率的目标、发掘更多倍数的候选物体框,在后续进行重排序的过程中,我们会得到更多条线的预定。
当然 SSD 也是一种非常复杂的算法,里面含有大量有待调整的细节参数,因此大家可能会觉得不太好控制。
另外,SSD 毕竟还是一种矩形框的检测算法,如果目标物体本身形状并不规则,或呈现为长条形的话,我们就需要使用最新的语音分割来实现。
文本识别
除了通过传统的 OCR 方法,来对身份证、健康证、营业执照进行识别之外,我们还需要对如下场景进行 OCR 识别:
传统的 OCR 流程一般分为三步:
但是鉴于如下原因,该流程并不适合被应用到店铺的菜单识别上:
因此,我们分两步采取了基于深度学习的识别方案:文字行检测+文字行识别。
即先定位图片中的文字区域,再采用端到端的算法,实现文字行的识别。
如上图所示,文字行的检测源于物体识别的算法,其中包括:
说到全卷积网络(FCN),它经常被用来进行语义分割,而且其 OCR 的效果也是最好的。
从原理上说,它采用卷积网络,通过提取特征,不断地进行卷积与池化操作,使得图像越来越小。
接着再进行反卷积与反池化操作,使图像不断变大,进而找到图像物体的边缘。因此,整个结构呈U字型,故与 U-Net 关联性较强。
如上图所示:我们通过将一张清晰的图片不断缩小,以得到只有几个像素的蓝、白色点,然后再将其逐渐放大,以出现多个蓝、白色区域。
接着,我们基于该区域,使用 SoftMax 进行分类。最终我们就能找到该图像物体的边缘。
经过实践,我们觉得效果最好的方法是基于全卷积网络的 EAST。如上图所示,其特点是能够检测任意形状的四边形,而不局限于矩形。
EAST 的核心原理为:我们对上图左侧的黄色区域不断地进行卷积操作,让图像缩小。在中间绿色区域,我们将不同尺度的特征合并起来。
而在右侧蓝色区域中,我们基于取出的特征,进行两种检测:
对于文字行的识别,目前业界常用的方法是 CTC+Bi-LSTM+CNN。如上图所示,我们应该从下往上看:首先我们用 CNN 提取给定图像的卷积特征响应图。
接着将文字行的卷积特征转化为序列特征,并使用双向 LSTM 将序列特征提取出来;最后采用 CTC 方法,去计算该图像的序列特征与文本序列特征之间所对应的概率。
值得一提的是,CTC 方法的基本原理为:首先通过加入空白字符,采用 SoftMax 进行步长特征与对应字符之间的分类。
籍此,对于每个图像序列,它都能得到字符序列出现的概率。然后通过后处理,将空白字符和重复符号删除掉,并最终输出效果。
三维重建
在无人驾驶的场景中,我们有时候可能需要通过移动摄像头,将采集到的数据构建出建筑物的三维结构。
如上图所示,其核心框架为:首先对各种给定的图片进行不只是 CNN 的特征提取,我们还可以用 SIFT 方法(见下文)提取其中的一些角点特征。
然后,我们对这些角点进行三角定位,通过匹配找到摄像头所在的空间位置。
最后我们使用光束平差,来不断地构建空间位置与摄像头本身的关系,进而实现三维构建。
上面提到了 SIFT 特征提取,它的特点是本身的速度比较慢。因此为了满足摄像头在移动过程中进行近实时地三维构建,我们需要对该算法进行大量的调优工作。
同时,在三维重建中,我们需要注意重投影误差的概念。其产生的原因是:通常,现实中的三维点落到摄像机上之后,会被转化成平面上的点。
如果我们想基于平面的图像,构建出一个三维模型的话,就需要将平面上的点重新投放到三维空间中。
然而,如果我们对摄像机本身参数的估算不太准确,因此会造成重新投放的点与它在三维世界的真正位置之间出现误差。
如前所述,我们还可以使用光束平差来求解矩形的线性方程组。通常它会用到稀疏 BFGS(拟牛顿法)去进行求解,进而将各个三维的点在空间上予以还原。
最后一步是关于离群点的过滤。由于我们在做三维重建的过程中,会碰到大量的噪点,那么为了过滤它们,我们会使用 RANSAC 方法来进行离群点的过滤。
从原理上说,它会不断随机地抽取部分点,并构建自由模型,进而评比出最佳的模型。
如上图所示,由于上方两张图里有着大量的边缘位置特征,我们可以通过 RANSAC 离群点过滤,将它们的特征点对应起来,并最终合成一张图。而且通过算法,我们还能自动地发觉第二张图在角度上存在着倾斜。
总的说来,我们在物体识别、文本识别、以及三维重建领域,都尝试了大量的算法。希望通过上述分析,大家能够对各种算法的效果有所认识与了解。