对人类来说,我们只需一眼便能快速识别我们所处的环境以及环绕在我们身边的物体。当我们看到一张图片或是环看四周的时候,无需刻意观察,多数时候也能立即描述出场景特征并标记出每一个对象。
当计算机看到一张图像(输入一张图像)时,它看的是一大堆像素值。根据图片的分辨率和尺寸,它将看到一个 32 x 32 x 3 的数组(3 指代的是 RGB 值)。为了讲清楚这一点,假设我们有一张 JPG 格式的 480 x 480 大小的彩色图片,那么它对应的数组就有 480 x 480 x 3 个元素。
问题定义
当你提供给计算机这一数组后,它将输出描述该图像属于某一特定分类的概率的数字(比如:80% 是猫、15% 是狗、5% 是鸟)
我们想要计算机做什么
我们想要计算机能够区分开所有提供给它的图片
当我们看到一幅狗的图片时,如果有诸如爪子或四条腿之类的明显特征,我们便能将它归类为狗。同样地,计算机也可以通过寻找诸如边缘和曲线之类的低级特点来分类图片,继而通过一系列卷积层级建构出更为抽象的概念。这是 CNN(卷积神经网络)工作方式的大体概述。
对于计算机视觉任务来说,我们希望模型可以对于物体姿势或位置的变化具有一定的不变性,从而在不同场景下实现对于物体的分析。传统 CNN 中使用卷积和 Pooling 操作在一定程度上实现了平移不变性,但这种人工设定的变换规则使得网络过分的依赖先验知识,既不能真正实现平移不变性(不变性对于平移的要求很高),又使得CNN对于旋转,扭曲等未人为设定的几何变换缺乏应有的特征不变性。
CNN
卷积层
下图的动画中,绿色表示原图像素值,红色数字表示卷积核中的参数,黄色表示卷积核在原图上滑动。右图表示卷积运算之后生成的feature map。
卷积核在原图上滑动,进行卷积运算,得到特征图feature map
权值共享: 卷积核扫过整张图片的过程中,卷积核参数不变。
局部连接: feature map上每个值仅对应着原图的一小块区域,原图上的这块局部区域称作感受野(receptive field)
池化层
用一个像素代替原图上邻近的若干像素,在保留 feature map 特征的同时压缩其大小
为什么 CNN 能够成功?
先来介绍两个概念:
平移不变性(translation invariant)
- 对输入进行平移不改变输出的结果。
平移等价性(translation equivalence)
- 当输入发生平移时,输出也应该相应地进行平移
这对于图像分类问题来说肯定是最理想的,因为对于一个物体的平移并不应该改变它的类别。
而对于其它问题,比如目标检测,语义分割来说,这个性质则不应该有,原因是当输入发生平移时,输出也应该相应地进行平移。这种性质又称为平移等价
卷积层带来了平移等价性,池化层赋予了弱的平移不变性。
##Motivation
当处理分类任务时,通常希望我们的系统对输入变化具有鲁棒性。通过这种方式,如果输入经历了某种“转换”,那么我们的分类模型理论上应该吐出与转换前相同的类标签。
我们的图像分类模型可能面临的“挑战”有:
- scale variation: 现实世界和图像中尺寸的变化
- viewpoint variation: 观察者的视角不同
- deformation: 非刚体可能会变形并扭曲成不同寻常的形状
虽然对人类来说,对它们进行分类的任务似乎微不足道。
但我们的计算机算法只能处理具有亮度值的原始3D数组,因此输入图像的微小变化就可以改变相应阵列中的每个像素值。因此,我们理想的图像分类模型在理论上应该能够将物体姿态和变形从纹理和形状中分离出来。
CNN的问题
只要输入图片稍微改一个像素、平移一个像素,CNN的输出就会发生巨大的变化
如果输入发生了扭曲等改变,CNN 的输出更加不会是不变的了。
对于 CNN 来说,只有一个局部的,预先定义好的池化层来提供微弱的平移不变性。
那我们有什么办法能够加入平移不变性呢,先介绍一下仿射变换
Image Transformations
在讨论仿射变换之前,我们首先讨论线性变换。
我们定义如下:
- 向量 $K$ 包含两个坐标点:$\begin{bmatrix} x \\y \end{bmatrix}$
- 矩阵 $M=\begin{bmatrix}a & b \\c & d \end{bmatrix} $
线性变换 $T$ 被定义为矩阵的积 $K’ = T(K) = MK$。其中 a,b,c,d 是线性变换的参数。
Identity Transformation
如果 $M = \begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix} $
$
K’ = \begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix}\begin{bmatrix}
x \\
y
\end{bmatrix} =
\begin{bmatrix}
x \\
y
\end{bmatrix} = K$
这意味着点 $K$ 点在平面上没有移动。
Scaling
如果 $M = \begin{bmatrix}
a & 0 \\
0 & e
\end{bmatrix} $
$K’ = \begin{bmatrix}
a & 0 \\
0 & e
\end{bmatrix}
\begin{bmatrix}
x \\
y
\end{bmatrix} =
\begin{bmatrix}
ax \\
ey
\end{bmatrix}$
这意味这对 $K$ 点进行了缩放。 有一种特殊的缩放情况,称为各向同性缩放,其中 $x$ 和 $y$ 方向的缩放因子是相同的,比如 $s$,在这种情况下,放大图像对应于 $s>1$,而缩小图像对应于$s<1$。
Rotation
如果 $M = \begin{bmatrix}
\cos{\theta} & -\sin{\theta} \\
\sin{\theta} & \cos{\theta}
\end{bmatrix}$
$K’ = \begin{bmatrix}
\cos{\theta} & -\sin{\theta} \\
\sin{\theta} & \cos{\theta}
\end{bmatrix}
\begin{bmatrix}
x \\
y
\end{bmatrix} =
\begin{bmatrix}
x\cos{\theta}- y\sin{\theta} \\
x\sin{\theta} + y\cos{\theta}
\end{bmatrix}$
将 $K$ 点进行旋转。
Shear
当我们要剪切图像时,我们将 $y$ 方向偏移与 $x$ 成比例的距离,将 $x$ 方向偏移与 $y$ 成比例的距离。
将 $M$ 设置为:
$M = \begin{bmatrix}
1 & b \\
d & 1
\end{bmatrix}$
得到:
$K’ = \begin{bmatrix}
1 & b \\
d & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y
\end{bmatrix} =
\begin{bmatrix}
x + by \\
y + dx
\end{bmatrix}$
前面介绍的三种线性变换的缺点是不能表示平移,因为它不是线性变换。 但是,平移是非常重要且必要的变换,因此我们希望能够将其封装在矩阵表示中。
Translation
我们希望通过一种变换,将 $K$ 点分别向 $x$ 和 $y$ 的方向平移 $e$ 和 $f$ 的距离,即:
$K’ = \begin{bmatrix}
x+e \\
y+f
\end{bmatrix} =
T(K)
$
我们尝试用矩阵和向量运算构造一下:
$\begin{bmatrix}
x+e \\
y+f
\end{bmatrix} =
\begin{bmatrix}
1 & 0 \\
0 & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y
\end{bmatrix} +
\begin{bmatrix}
e \\
f
\end{bmatrix}
$
将加号包括到矩阵积运算中:
$\begin{bmatrix}
x+e \\
y+f
\end{bmatrix} =
\begin{bmatrix}
1 & 0 & e\\
0 & 1 & f
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
1
\end{bmatrix}
$
多添加两个参数$e$ 和 $f$, 我们就可以得到平移变换。
Summary
我们可以推广我们的结果,并用6个参数矩阵表示我们的4个仿射变换(所有的线性变换都是仿射变换)
$M=
\begin{bmatrix}
a & b & c \\
d & e & f
\end{bmatrix}$
更有直觉性,让我们再来看看下面的猫的图片:
如果我们的模型可以从左到右使用某种剪裁和尺度标准化组合来简化后续的分类任务,这不就是非常理想的吗?
Spatial Transformer Networks
应当是对输入做仿射变换得到的输出作为 CNN 新的输入。
这个变换应当是根据输入的不同,有不同的变换,也就是仿射变换矩阵中6个参数的值应该是自适应的。
是对像素点的位置做仿射变换,而不是像素值做仿射变换。
STN由上图所示的三个组件构成:
- localisation network
- grid generator
- sampler
Localisation Network
Localisation Network 的目标是输出仿射变换的参数 $\theta$。
- 输入: 特征图 U,形状为 (H, W, C)
- 输出: 变换矩阵 $\theta$,形状为 (6,)
- 结构: 全连接层,卷积层都可。
Parametrised Sampling Grid
网格生成器的工作是输出参数化的采样网格,该网格是一组点,应在这些点上对输入图进行采样以产生所需的转换输出。
$$\begin{bmatrix}
x^{s}_i \\
y^{s}_i
\end{bmatrix} =
T_\theta (G_i) = A_\theta
\begin{bmatrix}
x^t_i \\
y^t_i \\
1
\end{bmatrix} =
\begin{bmatrix} \theta_{11} & \theta_{12} & \theta_{13} \\
\theta_{21} & \theta_{22} & \theta_{23}
\end{bmatrix}
\begin{bmatrix}
x^t_i \\
y^t_i \\
1
\end{bmatrix}$$
Differentiable Image Sampling
由于双线性插值是微分的,因此非常适合当前的任务。
借助输入特征图和参数化的采样网格,我们可以进行双线性采样,并获得形状为(H’,W’,C’)的输出特征图 V。
双线性插值 Bilinear Interpolation
当图像经历仿射变换(如旋转或缩放)时,图像中的像素会四处移动。当输出的像素位置没有直接映射到输入图像中的像素位置时,这就是问题。
假设旋转图像后,我们需要找到位置(6.7,3.2)的像素值。 然而不存在这种位置的像素值。
算法
我们的目标是计算点 $P$ 的像素值。
我们先计算 $R_1$ 和 $R_2$ 的像素值:
$$R_1 = \frac{x_2 - x}{x_2 - x_1}Q_{11} + \frac{x - x_1}{x_2 - x_1}Q_{21}$$
$$R_2 = \frac{x_2 - x}{x_2 - x_1}Q_{12} + \frac{x - x_1}{x_2 - x_1}Q_{22}$$
再计算点 $P$ 的像素值:
$$P = \frac{y_2 - y}{y_2 - y_1}R_1 + \frac{y - y_1}{y_2 - y_1}R_2$$