计算机视觉在上一个世纪60年代脱胎于人工智能与认知神经科学,旨在通过设计算法来让计算机自动理解图像的内容。为“解决”计算机视觉这一问题,麻省理工学院在1966年把它作为一个夏季项目正式提出,但人们很快发现要解决这个问题可能还需要更长的时间。在50年后的今天,一般的图像理解任务虽未得到完美解决,但也有了较为显著的进展。计算机视觉算法随着其商业化的成功,开始得到更广泛的关注,并实现了较大的飞跃。其中包括交互式分割算法(例如微软office中去除图片背景的功能)、图像搜索、人脸识别和对焦和Kinect的人体运动捕捉等应用。几乎可以肯定的是,计算机视觉近来的突飞猛进主要得益于近15到20年来机器学习领域的快速发展。
本系列文章的上篇将主要介绍在探索计算机视觉的道路上所面临的挑战,并会谈到一个机器学习技术中非常重要的——像素级分类决策森林算法。
图像分类
想像一下如果让你的计算机来回答下面这个有关图像分类的问题——“在这张图片中有一辆汽车吗?”
对于计算机来说,一张图片仅仅是由三原色(红、绿、蓝)像素组成的格子,三原色中每一个颜色通道的值在0到255之间变化组合后等到不同的颜色和图像。这些值若发生根本性改变,不仅依赖于事物对象是否在图片中呈现,也依赖于一些干扰事件,比如摄像机的视角、光线条件、背景和对象的形态。还有一个必须处理的是例如不同类别的汽车的外观也不同的问题。具体而言,一辆汽车可能是旅行车、小卡车、或者是轿车,这些都是完全不同的像素组合形式。
幸运的是监督机器学习(Supervised ML)算法提供了替代原本需要人工编码解决这些多可能性的问题的方式。通过收集图片的训练数据集并为其手动标注一些适当的标签,我们就能够使用最好的机器学习算法找到哪些像素模式是同要识别的对象相关的,哪些是干扰因素。我们的目标是,算法最终能够适用于识别以前没有经过训练的新样本,并且可以归纳出各个干扰因素的不变性特点。目前,无论是在开发新的计算机视觉机器学习算法,还是在数据集的收集和标注方面,我们都取得了长足的进步。
像素分类的决策森林算法
一张图片往往包含了多个层面的信息。就像前面我们提到的,我们可以针对整张图片的内容询问某种特定的物体类别是否存在于图片中,比如汽车。但现在我们可以尝试解决一个更复杂的问题——这张图里都包含了哪些物体,这就变成了一个 “图像语义分割(semantic image segmentation)”的问题。以下面这张街道场景的图片分割为例:
你可以看到,这种图像分割可以帮助你选择性地处理照片,或合成一张新的照片;稍后我们还会看到更多的应用场景。
解决语义分割问题可以有很多方法,但是像素分类是其中一个非常强大的基础构件:训练一个分类器在像素级别预测每一个对象(如汽车、街道、树、墙等)的分布情况。但这会给机器学习带来一些计算上的问题,尤其是图片包括大量的像素点(例如,诺基亚1020智能手机的像素是4100万),这就意味着我们所需要的训练和测试样的数量会是图片分类任务本身的百万倍。
这样的规模促使我们研究出一个更有效的分类模型——决策森林(decision forests,也称为随机森林或随机决策森林)。如下图所示,一个决策森林是由多个分离训练决策树所组成的集合。
每一决策树都由一个根节点、多个内部“分支”节点和多个叶子节点组成。分类测试从根节点开始,并且计算二叉“分支函数”,这个函数可能就像“这个像素是否比它邻域的像素更红”一样简单。根据该二元决策,测试沿分支的左边或右边来查看下一个“分支函数”,以此类推。当最终达到叶子节点,一个存储的预测——通常是一个包含类别标签的直方图,就输出出来了。(另见Chris Burges最近发表的一篇非常出色的论文:决策树在搜索排名中的优化变形)。
决策树的亮点在于它的测试效率:虽然从根节点到叶子节点的路径是指数级的,但是一个独立的测试像素仅会通过一个路经。此外,分支函数的计算是基于先前的计算结果的:例如,分类器只需要基于此前分支决策已经给出的答案提出正确的问题。这很像“20问”游戏的原理:尽管你只能问少数几个问题,但你可以根据你以前问题的答案是”yes”还是“no”,快速调整自己要提出的下一个问题,并很快得到正确答案。
有了这项技术,我们对于以下的图像分割问题已取得了突破性的进展: 照片的语义分割,街头的场景分割,人体解剖学的3D医学扫描图像分割,摄像头的重定位和使用Kinect深度摄像头对人体身体部位的划分等。对于Kinect来讲,决策森林的测试时间效率很关键,因为我们有一个非常严格的计算限制。不过Xbox GPU并行处理像素的能力是可以符合这样的计算要求的,因此我们能够适应于这种应用场景。
在本系列的第二篇文章中,我们将围绕近期的一个热门话题——基于“深度学习”的图像分类方法展开讨论,并展望图片分类技术的未来。同时,如果你想要在我们的云平台中开始机器学习的研究,欢迎访问我们的机器学习中心。