#磨染的初心——计算机视觉的现状
【这一系列文章是关于计算机视觉的反思,希望能引起一些人的共鸣。可以随意传播,随意喷。所涉及的内容过多,将按如下内容划分章节。已经完成的会逐渐加上链接。】
- 缘起
- 三维感知
- 目标识别
3.0. 目标是什么
3.1. 图像分割
3.2. 纹理与材质
3.3. 特征提取与分类 - 目标(和自身)在三维空间中的位置关系
- 目标的三维形状及其改变、目标的位移
- 符号识别
- 数字图像处理
特征提取与分类
一定是因为纹理分析与描述以及图像分割没有取得有效的进展,导致通过材质、形状、结构进行目标识别的愿望落了空。甚至当前最优秀的图像分割算法都不能产生人类能够识别的图斑形状,此外形状和结构描述方面也没有取得多少成果,更遑论有价值的成果。但是机器学习却取得了长足的进步,各种各样适合不同分布模型的监督分类算法被发明了出来。目标识别也就顺其自然地走上了“提取特征+描述特征+监督分类”的路线,成就也是显而易见的,当前落地了的计算机视觉应用背后都得到了“特征提取与描述”以及分类的加持。随着卷积神经网络的出现,人工特征提取与描述都省了,计算机视觉已然有了被机器学习收归囊下的意思。
然而相对于纸面上的喧嚣,卷积神经网络并没有开拓出实打实的应用领域。在深度学习成为热词之前,计算机视觉已经满足了人脸识别、指纹识别、行人检测、车辆检测、质检、工业控制等场景的应用需求。深度学习火热之后应用场景没有增加,需求的满足水平也没有本质的提升,唯一改变的是社会对计算机视觉的接受程度——这些应用场景的市场规模被拓展了。
不知道应该用“十字路口”还是应该用“瓶颈”来形容这个现状,不管怎么样,回顾、总结终归是有用的。就在此回顾、总结一下驱动计算机视觉发展到目前的引擎——“特征提取与描述”——吧。归纳起来目前能够提取的特征有点、线、斑块三类。点特征在图像配准、图像几何校正、图像镶嵌、多视几何恢复任务中起到了至关重要的作用。对于线特征,由于缺乏有效的描述方法以及连接成闭合图形的方法,目前还没有什么广泛的用处。斑块特征是笔者的归纳,也许难以理解,该类特征直接和间接表示了图斑之间的位置关系或者图斑的几何结构以及图斑的纹理。比如HAAR和DPM就是斑块类特征,HAAR检测器中两个区域均值相减的操作就是为了在斑块边界上取得足够的响应;从DPM这个名称中就可发现其目的是为了对部件(斑块)的组合有足够的响应,DPM的基础——梯度直方图(HoG)——一定程度上反应了图斑的纹理。
目前点特征提取算法的核心思路有三种,其代表算法分别是Harris、FAST、SUSAN。Harris算法所基于的现象是——角点处更多方向上的梯度将会取得较大值,在判别的时候采用了DoH(Determinant of Hessian),采用此思路的角点检测算法有SIFT、SURF、KAZE。FAST算法所基于的现象是——以角点为中心的圆环上有更长连续像素点的取值与中心点的取值差异较大,最直接的判别依据为圆环上与中心点取值不同的连续像素点的数目,具体实现时采用了不同的优化手段,采用此思路的角点检测算法有AGAST、BRISK、ORB、FREAK。SUSAN算法所基于的现象是——以角点为中心的中心对称区域中与角点取值相同的像素最少,判别依据为与角点取值相同的像素数量。有些算法在采用这些思想时会进行近似计算、缩减计算规模等操作,看起来像是脱离了这三种思路,尤其是SIFT和SURF,他们分别采用LoG和Haar小波来近似梯度的计算。另外在多个尺度上应用具体的角点检测方法是很自然的事情,虽然建立尺度集的具体方法不一定是容易想到的。
要在图像配准、图像几何校正、图像镶嵌、多视几何恢复等任务中应用点特征,必须匹配相同或相似的点。因此需要基于某种测度方法对特征的内涵进行量化,这就叫做特征的描述。常用的点特征描述方法有BRIEF、ORB(Steered BRIEF)、BRISK、SIFT、SURF等。其中BRIEF、ORB(Steered BRIEF)、BRISK描述方法在特征点周围采用一定的方式采集一些点对,然后针对具体的特征点使用二值方式编码点对间像元值的差异,量化的结果是二值串,一般采用汉明距离比较相似程度;当然具体的点对采集方式和点对像元值差异编码方式各不相同。SIFT、SURF描述方法对特征点周围的梯度按照方向进行统计形成了梯度直方图(HoG),量化结果是多维向量,在比较相似度时是当作空间坐标进行处理的。这些点特征描述方法不是只能用于描述提取出来的特征点,还可以对图像上任意像素的局部特征进行描述。还有其他一些局部特征描述方法,用来描述特征点时全局区分度不够,一般用在三维重建的密集匹配过程中。
图像中明显的线特征就是边缘和细线状要素,都可以通过边缘检测算法提取出来。梯度算子对边缘有很高的响应,因此梯度算子也会叫做边缘检测算子,然而用梯度算子对图像做卷积绝对不能称作边缘检测,这是流传甚广的错误。即使不要求获得边缘点组成的坐标串,边缘检测算法也应该获得去除了非边缘点的图像而不是边缘被显示增强的图像。符合这个要求的边缘检测算法有两种——Marr-Hildreth和Canny。Canny算法提取出来的边缘点是一阶梯度的局部极大值点,Marr-Hildreth算法提取出来的是二阶梯度的过零点。Canny算法的效果虽然明显优于Marr-Hildreth,但是也有自身的缺点——强弱边缘梯度的阈值难以确定。在图像中提取出不封闭的特征线,好像实在没有太大的用处,甚至Canny算法的提取效果已经远远超过当前的应用需要了。如果说要提取出封闭的特征线,那就是图像分割的任务了;另外如果观察过很多图像,肯定会同意图像上很多线要素都不是封闭的。关于线提取还有另外一种方法,就是先二值化再应用骨架提取算法;这种方法应用在成像环境和成像对象高度受控的场景,如指纹识别、工业质检等。图像上的直线和圆弧是高度特殊的一类特征线,在线特征提取算法的基础上再将这些可以简单参数化表示的线提取出来的算法叫霍夫变换(Hough Transform),在车道线检测、机场跑道识别等任务上有一定的用处。
当然最近也有不少基于深度学习的点、线提取算法被提了出来,就笔者而言,这不过是“茴”字的另外几种写法而已。因为从一定程度上来说,点、线特征提取是已经解决了的问题,如果智商有余额应当去定义和解决真正的问题。
斑块特征的作用在于目标检测(目标识别、图像分类),这也是卷积神经网络发挥巨大作用的领域。对于图斑来说,不像点、线一样,要将其提取出来;而是采用逆向思维,直接设计一种适合具体任务的描述图斑所蕴含特征的方法。比如,利用Haar特征进行人脸检测时,设计几个Haar-like filter(box filter)采用如下图的布局进行组合,在图像上滑动的时候每个Haar-like filter在其所处的位置上计算出一个值,多个Haar-like filter的计算结果形成特征向量。利用监督分类算法训练出针对此特征向量的分类器,用于判别滑动窗口之下是否是人脸。
至于DPM,思路是类似的,采用HoG方法计算出窗口内的特征向量,然后训练一个打分器,窗口内如果是要检测的目标得分就越高。当然DPM采用了一个根打分器和多个部件打分器,结合部件偏移损失将部件得分和根得分综合到一起作为最终得分,如果最终得分高于阈值就认为根窗口和部件窗口的组合区域中是要检测的目标。
就笔者所知,适用于目标检测的人工特征描述方法就只有Haar和HoG了,之后舞台就交给了CNN。不可否认CNN使目标检测的效果得到了跨越式提升,很多优秀的结构被提了出来,也解决了很多实质问题,如残差网络、锚点框、One-Stage、FPN、FocusLoss等。
然而CNN并非没有缺陷,除了截至目前还无法解决的迁移和泛化问题之外,CNN的正方形感受野使其在识别狭长形目标时显得力不从心,如果狭长形目标是紧挨在一起的形势就更加严峻了。这种情况在航空影像和卫星影像上尤为常见,如下图所示,狭长的大汽车是较难识别的目标,港口的轮船是更难识别的目标。飞机靠气动外形才能飞,样式都是一样的;船体不管什么样的只要排水量超过自重就能漂起来航行,在卫星影像上几乎没有两艘船是一样的。航空影像和卫星影像上最容易识别的就是飞机,接下来是体育场,他们都占据方方正正的空间,外观也比较单一。这也是很多机构只公开飞机和体育场检测效果的原因。