所以,我们通常所说的“观察”(see),实际上是已经包含了对视觉信息的加工,以及和真实世界的关系映射。那么在计算机视觉领域,我们怎样去定义“观察”(see)这个概念,和我们人类的理解一致呢?这里我们把它分成三个层次:
第一个层次,也是最经典的解释,1982年David Marr(著名的生物神经学家,计算机视觉理论的鼻祖),他总结的“To know what is where by looking”。中文意思就是知道有什么东西,在哪里,这就是一个最基本的“see”这个概念。它对应计算机视觉里面几类基本问题:一个是做图像识别,即解决是什么(what),另一个是物体定位,即在哪里(where)。这里还需要提一下“图像语意分割”这个概念,它是一个像素级别的物体识别,即每个像素点都要判断它的类别。它和检测的区别是,物体检测是一个物体级别的,他只需要一个框,去框住物体的位置,而通常分割是比检测要更难的问题。
再进一个层次,除了要知道图像像素/二维平面内每一个像素代表的信息以外,我们可能还需要知道这个物体在这个真实世界当中的3D信息。举个例子,给定一张卧室的照片,以及一些相机参数和环境的一些假设,我们需要知道床在这个三维空间的真实的位置,包括它的长宽高。在这个层次中,一个重要的课题就是我们经常提到的SLAM,即同时定位和建图,这个方向在机器人领域有十分重要的作用。
第三个层次则是更高一层的视觉问题,比如说给定图片或者视频,我们需要去知晓这个场景正在发生什么,如果是一个更高级的系统,我们甚至希望计算机能够根据图像或者视频,我们回答一些问题。这就是前两年非常火的视觉问答(Visual question answering)方向。
现在我们回归物体检测。物体检测是视觉感知的第一步,也是计算机视觉的一个重要分支。物体检测的目标,就是用框去标出物体的位置,并给出物体的类别。物体检测和图像分类不一样,检测侧重于物体的搜索,而且物体检测的目标必须要有固定的形状和轮廓。图像分类可以是任意的目标,这个目标可能是物体,也可能是一些属性或者场景。
Object Detection Evaluation
如果给定一个物体检测系统,我们要怎么样去评价它的好坏?物体检测的输出,就是一系列的框,加上其属于某一类别的置信度得分。测评的时候我们需要把他们和标注的框(ground truth)进行比配。好的检测框,应该和标注框有非常大的重叠率,同时又不能对同一个物体重复检测。我们把那些和标注框重叠率很高的定义为true positive,把那些重叠率低(甚至没有重叠)和重复检测的框,定义为false positive。
我们还需要定义两个描述指标:precision 和recall。Precision是true positive 数量除以 true positive和false positive的比值,即所有的检测结果中,正确的比例。Recall 则是所有truepositive的个数和标注框个数的比值,即所有的目标中,被系统检测出来的比例。
接下来,我们可以把检测的结果根据置信度进行排序,设一个阈值,然后去计算这个情况下的precision和recall。我们设置不同的阈值,可以得到很多组precision 和recall。如果我们把所有的precision 和recall 都画到一张图上,x轴代表recall,y轴代表precision,那么我们得到的图,就叫做PR(precision-recall)曲线。我们可以用这条曲线在x轴上的积分,去描述物体检测的好坏,这个指标叫做Average precision(AP)。AP值高,就说明系统在比较高recall的情况下,还能保持比较高的的precision.现在一些成熟的人脸检测系统,AP都是在90%以上。如果我们直接拿标注去算AP,那么肯定就是100%了。
How to Detect an Object
History of Recognition(Detection)
有了目标的候选区域,我们怎样得到物体的类别分数呢?这就是一个分类问题。其实图像识别这个领域,已经有大半个世纪的历史了。图像识别,或者说模式识别,最早是在二十世纪60年代被提出来的。当时MIT的计算机教授,组织了一个面向本科生的两个月的Summer project。这个project 的目的是设计一个系统,能够智能识别场景里头的物体,并区分出类别。显然当时他们低估了这个问题的难度,结果可想而知。
实际上,从1966年之后到现在,这个问题还并不能算完全解决。但在一定程度上,在深度学习出来之后,这个问题得到了很大程度上的解决。其实识别问题本身就不是一个容易的事情。为什么呢?首先,我们看到的这个物体的样子,只是它在某种背景下某一种光线条件下特定角度的投影的,换一个角度可能就是完全不同的样子。即使是同一个物体,例如人,它具有多种不同的姿态,所以外观也会不一样。例如他可能是躺着的,或者是站着的,形态都是不一样的。
到了九十年代之后,主流的方法是只从图像本身考虑,而不去管物体原来的三维形状。这类方法统一叫做appearance based techniques.所谓appearance,从模式识别的角度去描述的话,就是图像特征(feature),即对图像的一种抽象描述。有了图像特征,我们就可以在这个特征空间内做匹配,或者分类。一个最经典的例子,就是”Eigen Faces”方法,这也是90年代做人脸识别最重要的方法之一。它的主要思想是用PCA(主成分分析)去分解人脸数据集,得到特征向量,然后把每一张人脸图像表达为特征向量的组合。这些组合系数,就构成了对人脸图像的抽象描述,即特征。最后我们就可以用特征空间内样本的距离,来判断样本是否是属于同一个人脸:同一个人脸在样本空间内距离很小,不同脸之间距离比较大。
然而这个方法还是存在很多问题,首先它需要我们对所有的图片进行对齐,像人脸图像,就要求每一幅图中五官基本在固定的位置。但是很多应用场景下,目标并不是像人脸那么规整,很难去做统一对齐,而且这种基于全局特征和简单欧式距离的检索方法,对复杂背景,遮挡,和几何变化等并不适用。
到2000年之后,识别领域有了较大的发展。首先图像特征层面,人们设计了各种各样的图像特征,像SIFT,HOG,LBP等等,比起图像边缘和角点等简单的特征更加鲁棒。与此同时,机器学习方法的发展也为模式识别提供了各种强大的分类器,例如SVM,boosting等的方法。在此期间,出现了第一个真正具有实际应用价值的人脸检测:Viola and Jones提出的实时人脸检测。在它之前的一些方法要么效果不怎么好,速度比较快,或者是速度很慢,效果相当或者更好。所以作者当时在CVPR上拿着摄像头展示算法的实时demo,惊艳了全场。这个方法能够做到又快又好的关键,在于使用了简单的基于积分图像(integral-image)的图像特征,和级联分类器(cascaded classifier)。前者可以在常数的时间复杂度内计算任意区域的特征,使得特征提取变得十分快速;后者可以在一些简单的背景样本上做到提前终止(earlyrejection),极大降低了全图中所有图像块分类的计算量。