Drilling Deeper Into Features - Object Detection

在现实世界中,很多时候我们需要对两张图片进行比较,或者在一大堆图片中搜索包含某个物体的图片。比如:谷歌的图像搜索,在防卫组织的指纹库中搜索某个人的指纹。我们要如何解决这些问题呢?

我们需要能够描述图片(和颜色,大小,旋转角度,仿射变换无关)的方法。在计算机视觉中,我们想要用特征来描述图片。在上一章节,我们已经看了一些基本的特征,比如:梯度,边缘。但是这些不足以来描述图像,而且它们对亮度的改变很敏感。只使用边缘特征,我们无法区分钟表和车轮,它们都会返回一堆点来构成一个圆。因此,我们需要更好的特征抽取技术来帮助处理这些情况。

在本节,我们会扩展对于特征的了解,然后看一看能够在图像中抽取更好细节的高级图像特征,这些特征通常对大小,颜色,和旋转具有很好的稳定性和不变形。以下是本节将要讨论的特征列表:

  • Corner detection (Harris corner)
  • Cascade classifier—Local Binary Pattern (LBP)
  • Oriented FAST and Rotated BRIEF (ORB)

在我们进入前述的算法前,让我们简要地回顾一下什么是图像特征,为什么它们对我们想要做的事情如此重要。

Revisiting image features

图像的梯度和边缘给了我们很多关于不同物体的形状的信息。使用边缘,我们有时可能也能够决定图像中物体的方向。但是有一些弱特征,我们不能一直去依赖它们,因为它们对亮度,对比度和背景的改变很敏感。我们需要比梯度和边缘更加稳定的特征。为了解决这个问题,我们使用更复杂的特征描述子,比如:corners, Local Binary Pattern (LBP), BRISK, 和 Oriented FAST and Rotated BRIEF。让我们先来理解一下这些特征有什么不同,使得它们比只用边缘和图像梯度更好。

如果一个特征描述子是一个好的特征,那么它应该对于大小,旋转和翻转的改变具有不变性。也就是说,如果我们能够用某种特定的方式来描述图像中的汽车,那么即使这个图像被缩小一半,或者旋转90度,我们依然能够用同样的方式来描述汽车。具有这种性质的特征描述子能够对图像的变化更robust,也能有效地处理现实生活中的情况。随着机器学习的发展,研究者和工业界的人们目前使用神经网络从图像中抽取特征。结果显示,相比本节所要讲的传统的方法,它们取得了显著的进步。但是我们仍然要说,理解更多传统的算法对于完全理解和掌握特征抽取是如何起作用的非常重要

我们将从图像中定义的最基本的特征:corners-角点开始。简单地说,角点不过是两个边的交点。假如我们有一张桌子的照片,我们计算得知图像中的四个角点。然后我们被给了一张桌子的图片,那么这个图像也是桌子么?关于桌子,我们都知道些什么?我们知道桌子有四个角点,所以我们在新的图像中计算角点的个数。我们看到新的图像也有四个角点,所以我们说新的图像也是桌子。但是许多物体都有四个角点,因此角不是我们描述图像的最好方式,不过它确实是我们后面要学习的算法中的一个部分。

Harris corner detection

一种非常粗暴的寻找角点的方法是先找到图像中的所有边,然后检查每一对边是否相交。这种方法在某些情况可能效果不错,但是在实际情况中非常低效不可取。让我们看一种快速的角点检测算法—Harris corner.

角点是图像中非常重要的点。它们在许多应用中都有使用,比如:图像相关性,视频稳定性和3D建模。Harris corner是角点检测中最常使用的技术之一。Harris corner检测器在图像上使用滑动窗口来计算强度的变化。由于角点周围的强度值会有很大的变化,我们需要寻找图像中滑动窗口在所有方向上强度变化很大的位置。Harris corner检测器使用数学方程来决定哪些点是角点。

为了检测角点,我们尝试最大化下面的等式:
$$\sum{}{}{\left[ I(x+u, y+v)-I(x,y)\ \right]^2}$$这里,$I$是图像,$u$是滑动窗口在水平方向的位移,$v$是垂直方向的位移。

import matplotlib.pyplot as plt
from skimage import io, color, feature

img = io.imread("../image.png")  #Read an image
img = color.rgb2gray(img)

corners = feature.corner_harris(img) #Compute the Harris corners in the image. 
coords = feature.corner_peaks(corners, min_distance=5) #Using the corner response image we calculate the actual corners in the image
coords_subpix = feature.corner_subpix(img, coords, window_size=13)  # This function decides if the corner point is an edge point or an isolated peak

fig, ax = plt.subplots()
ax.imshow(img, interpolation='nearest', cmap=plt.cm.gray)
ax.plot(coords[:, 1], coords[:, 0], '.b', markersize=3)
ax.plot(coords_subpix[:, 1], coords_subpix[:, 0], '+r', markersize=15)
ax.axis((0, 350, 350, 0))
plt.show()
  • corner_harris: 这是一个基本的函数,它度量了图像中的每个像素是角点的可能性。Harris角点检测器背后的数学超出了本书的范围,但正如我们前面所看到的,它试图在图像中找到各个方向都有变化的部分。并且该部分的中心像素被标记为可能的角点像素。
  • corner_peaks: 使用corner_harris()函数的输出结果,corner_peaks尝试找到真正的角点。该函数返回角点的像素坐标,这些坐标被用来画在图像中。
  • corner_subpix: 这是另外一个辅助函数,它用来帮助对corner_peaks的结果进行优化。例如,它试图区分这个点是两个边的交点,还是实际上是一个角(像一个正方形)除非你的应用真的需要这一层的分类,否则不需要使用该函数。

这里有一点需要注意的是Harris corners是旋转和变形不变的。即使角点被移动到了图像中的新的位置,或者被旋转了一定的角度,该算法都能够对角点进行检测。

Local Binary Patterns

Local Binary Patterns (LBP) cascade是一种级联分类器,级联分类器在计算机视觉中被广泛地使用。在理解LBP之前,我们先来看一看什么是级联分类器。分类器就像黑箱,我们输入一张图片,它根据(使用许多训练图片训练得到的)一些模型输出这张图片的标签。“级联”意思是许多分类器构成一个链条。一个分类器的输出被传给下一个分类器作为输入。级联分类器的两个非常著名的例子是 Haar Cascades 和 Local Binary Patterns (LBP)。在这部分,我们只讨论LBP。

在LBP中,通过对图像中的每个像素,考虑它的八个相邻像素(左上,右上,左右,左下,右下),来构建一个八位二进制特征向量。对于每个相邻像素,都有一个相应的位,如果它的像素值大于中心像素的像素值,则相应的位值为1,否则为0。八位特征向量被视为二进制数(稍后将其转换到十进制值),并使用每个像素的十进制值,计算一个256框直方图。该直方图被用作图像的表示。

使用我们在最后一段中描述的八位二进制特征向量,我们可以识别出图3所示的一组基元。空心圆意味着相邻像素大于中心像素,黑色实心圆表示相邻像素的值大于中心像素。

Oriented FAST and Rotated BRIEF (ORB)

Oriented FAST and Rotated BRIEF (ORB) 是在OpenCV labs发现的,它可以作为SIFT和SURF的有效和可行的替代方案。ORB被认为主要是因为SIFT和SURF是专利算法。但是ORB可以自由使用。

ORB在特征检测任务方面的表现和SIFT一样好(比SURF好),并且几乎快了两个数量级。 ORB建立在知名的FAST关键点检测器和BRIEF描述符上。这两种技术由于其良好的性能和低成本而具有很强的吸引力。 ORB的主要贡献如下:

  • 在FAST中增加了一个快速和准确的定向分量
  • 定向BRIEF特征的高效计算
  • 定向BRIEF特征的方差和相关性分析
  • 一种在旋转不变性下解BRIEF特征的学习方法,在最近邻应用中得到了更好的性能

oFAST – FAST keypoint orientation

FAST detector

Orientation by intensity centroid

rBRIEF – Rotation-aware BRIEF

Steered BRIEF

Variance and correlation

Image stitching

Summary