目录
[1.1 边缘检测](#1.1 边缘检测)
[1.2 其他边缘检测器](#1.2 其他边缘检测器)
[8.1 最大池化](#8.1 最大池化)
[8.2 平均池化](#8.2 平均池化)
[1.1 LeNet-5](#1.1 LeNet-5)
[1.2 AlexNet](#1.2 AlexNet)
[1.3 VGG](#1.3 VGG)
[MobileNet v2](#MobileNet v2)
一、卷积神经网络
应用计算机视觉面临输入的数据可能非常大,如一张1000×1000×3的图片,则神经网络输入层的维度将高达三百万,使得网络权重 W 非常庞大,造成神经网络结构复杂,数据量相对较少,容易出现过拟合;所需内存和计算量巨大。
因此,一般的神经网络很难处理蕴含着大量数据的图像。解决这一问题的方法就是使用卷积神经网络(Convolutional Neural Network, CNN)。
1、卷积运算
1.1 边缘检测
图片最常做的边缘检测有两类:垂直边缘(Vertical Edges)检测 和水平边缘(Horizontal Edges)检测。

卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将结果组成一个矩阵。

如果将最右边的矩阵当作图像,那么中间一段亮一些的区域对应最左边的图像中间的垂直边缘。
图中的 * 表示卷积运算符号。在计算机中这个符号表示一般的乘法,而在不同的深度学习框架中,卷积操作的 API 定义可能不同:
- 在 Python 中,卷积用
conv_forward()表示; - 在 Tensorflow 中,卷积用
tf.nn.conv2d()表示; - 在 keras 中,卷积用
Conv2D()表示。

1.2 其他边缘检测器


其他常用的滤波器还有 Sobel 滤波器和 Scharr 滤波器,它们给中心行赋予更多权重,使检测更加稳健。
当需要在复杂图像中检测边缘时,不需要手动选择,可以将矩阵中的9个数字视为参数,然后通过反向传播来学习,目标是学习9个参数,使得当处理图像时,能得到良好的边缘检测器。
2、填充

如:6×6 * 3×3 = (6-3+1)×(6-3+1)
- 缺点:
- 应用卷积运算时,图像会缩小,只能进行有限次操作
- 角落或边缘的像素只在一个输出中被使用,在输出中的利用率较低,丢弃了大量的图像边缘信息
为解决以上缺点,可在卷积运算前对图像进行填充。

通过填充,保持了原始图像尺寸,减少了边缘图像被低估的影响。
P为填充量,在此例中P=1,即四周各填充1像素。
输出尺寸公式:(n+2P-f+1)×(n+2P-f+1)
为使输出图像与原始图像尺寸一致,。
按惯例,在计算机视觉中,f通常是奇数。只有当f是奇数时,相同卷积才能提供自然的填充,即四周均匀填充,而不是左多右少或其他不对称方式,且奇数尺寸的滤波器有一个中心位置,可以讨论滤波器位置。
3、卷积步长
卷积过程中,有时需要通过填充来避免信息损失,有时也需要通过设置**步长(Stride)**来压缩一部分信息。
步长表示滤波器在原始图片的水平方向和垂直方向上每次移动的距离。之前,步长被默认为 1。而如果我们设置步长为 2,则卷积过程如下图所示:

输出尺寸公式:,s为步长,注意公式中有一个向下取整的符号,用于处理商不为整数的情况。向下取整反映着当滤波器,即阴影部分完全包括在图像内部时,才对它进行运算。
4、互相关与卷积
卷积的定义方式是在进行逐元素相乘和求和之前,需先将滤波器在水平轴和垂直轴进行翻转。

互相关则不需要进行翻转。
因此,截至目前我们学习的"卷积"实际上被称为互相关(cross-correlation),而非数学意义上的卷积。
5、三维卷积
基于步长1且无填充:,
为通道数/深度维度,
为滤波器数量。

6、单层卷积网络

与之前的卷积过程相比较,卷积神经网络的单层结构多了激活函数和偏移量;而与标准神经网络: 相比,滤波器的数值对应着权重
,卷积运算对应着
与
的乘积运算,所选的激活函数变为 ReLU。
对于一个 3x3x3 的滤波器,包括偏移量 b在内共有 28 个参数。不论输入的图片有多大,用这一个滤波器来提取特征时,参数始终都是 28 个,固定不变。即选定滤波器组后,参数的数目与输入图片的尺寸无关。因此,卷积神经网络的参数相较于标准神经网络来说要少得多。这是 CNN 的优点之一。
符号总结
设 l 层为卷积层:
-
:滤波器的高(或宽)
-
:填充长度
-
:步长
-
:滤波器组的数量
-
输入维度:
,其中
表示输入图片的高,
表示输入图片的宽。之前的示例中输入图片的高和宽都相同,但是实际中也可能不同,因此加上下标予以区分。
-
输出维度:
。其中
,
-
每个滤波器组的维度:
,其中
为输入图片通道数(也称深度)。
-
权重维度:
-
偏置维度:
7、简单的卷积网络

其中,的维度为 7x7x40,将 1960 个特征平滑展开成 1960 个单元的一列,然后连接最后一级的输出层。输出层可以是一个神经元,即二元分类(logistic);也可以是多个神经元,即多元分类(softmax)。最后得到预测输出
。
随着神经网络计算深度不断加深,图片的高度和宽度、
一般逐渐减小,而
在增加。
一个典型的卷积神经网络通常包含有三种层:卷积层(Convolution layer) 、池化层(Pooling layer) 、全连接层(Fully Connected layer)。
8、池化层
池化层的作用是缩减模型的大小,提高计算速度,同时减小噪声提高所提取特征的稳健性。
8.1 最大池化
原理:如果这个特征在滤波器内任何位置被检测到,就保持一个高数值,若未被检测到,那么这些数字的最大值仍很小。

一旦确定f、s,它就是一个固定计算,梯度下降不会改变任何东西。
如果是三维输入,计算最大池化的方法是在每个通道上独立进行上述计算的。

8.2 平均池化

9、卷积神经网络示例


参数量计算
- 卷积层:
,
为输入通道数,
为输出通道数。eg:CONV1(5×5×3×6+6=456)
- 全连接层:M×N+N,M为输入神经元数,N为输出神经元数。eg:FC3(400×120+120=48120)
10、卷积的优势
相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:
- 参数共享:在输入图像的不同位置使用相同的滤波器(参数)
- 稀疏连接:输出仅依赖于某几个输入特征,而其他特征(像素)完全不影响这个输出
通过这两种机制,神经网络参数数量大幅减少,能够用较小的训练集进行训练,更不容易过拟合,是神经网络更加鲁棒,能更好的捕捉这种平移和变化的理想特性。
二、深度卷积网络
1、经典网络架构
1.1 LeNet-5

- LeNet-5 针对灰度图像进行训练,因此通道数为1。
- 该模型总共包含了约 6 万个参数,远少于标准神经网络所需。
- 典型的 LeNet-5 结构包含卷积层(CONV layer),池化层(POOL layer)和全连接层(FC layer),排列顺序一般为 CONV layer→POOL layer→CONV layer→POOL layer→FC layer→FC layer→OUTPUT layer。一个或多个卷积层后面跟着一个池化层的模式至今仍十分常用。
- LeNet-5 模型的池化层使用的是平均池化,且各层激活函数一般选用 Sigmoid 和 tanh。
1.2 AlexNet

- AlexNet 模型与 LeNet-5 模型类似,但是更复杂,包含约 6000 万个参数。
- AlexNet 模型使用了 ReLU 函数。
- 当用于训练图像和数据集时,AlexNet 能够处理非常相似的基本构造模块,这些模块往往包含大量的隐藏单元或数据。
1.3 VGG

- VGG又称VGG-16,16指网络中包含 16 个带权重的层。
- VGG 需要训练的特征数量巨大,包含多达约 1.38 亿个参数。
- 结构不复杂且规整,在每一组卷积层进行滤波器翻倍操作。
2、残差网络
残差网络 (Residual Networks,简称为ResNets)由残差块(Residual block)构成。

正常情况下过程为,我们称之为主路径。
残差网络中
,我们称其为捷径或跳跃连接。
,此时加上
ji就构成残差块。
构建一个残差网络就是将许多残差块堆积在一起,形成一个深度网络。

理论上,随着网络深度的增加,性能应该越来越好。但实际上,对于一个非残差网络,随着神经网络层数增加,训练错误会先减少,后增多;而残差网络的训练效果显示,即使网络再深,其在训练集上的表现也会越来越好。

残差网络有助于解决梯度消失和梯度爆炸问题,使得在训练更深的网络的同时,又能保证良好的性能。
残差网络有效的原因

,当发生梯度消失时,即W和b为0时,
。
因此,这两层额外的残差块不会降低网络性能,相比未加深的网络,因其可轻松学习恒等映射,即使增加两层仍能复制值,而如果没有发生梯度消失时,训练得到的非线性关系会使得表现效果进一步提高。
注意:如果 与
的维度不同,需要引入矩阵
与
相乘,使得二者的维度相匹配。参数矩阵
既可以通过模型训练得到,也可以作为固定值,仅使
截断或者补零。
3、1×1卷积
1x1 卷积指滤波器的尺寸为 1。当通道数为 1 时,1x1 卷积意味着卷积操作等同于乘积操作。

而当通道数更多时,1x1 卷积本质上是一个全连接神经网络,从而降低(或升高,取决于滤波器组数)数据的维度。
池化能压缩数据的高度及宽度
,而 1×1 卷积能压缩数据的通道数
。在如下图所示的例子中,用 32 个大小为 1×1×192 的滤波器进行卷积,就能使原先数据包含的 192 个通道压缩为 32 个。

1×1 卷积既能缩减通道数,也可以保持原样,甚至按需增加通道数。
4、Inception网络
Inception网络代替人工来确定卷积层中滤波器尺寸,或选择使用卷积层还是池化层,然后将所有的输出连接起来,让网络自行学习它需要的参数。
计算成本问题


从约1.2亿次减少约1/10,即1240万次乘法。
利用1×1卷积创建瓶颈层,从而大幅降低计算成本。只要合理构建瓶颈层,就可以既显著缩小计算规模,又不会降低网络性能。
Inception网络

上图是引入 1x1 卷积后的 Inception 模块。值得注意的是,为了将所有的输出组合起来,红色的池化层使用 Same 类型的填充(padding)来池化使得输出的宽高不变,通道数也不变。
多个 Inception模块组成一个完整的 Inception网络。

5、MobileNet
常规卷积与深度可分离卷积

常规卷积

深度可分离卷积:先深度卷积再逐点卷积


深度可分离卷积计算成本为432+240=672,较常规卷积计算成本降低。一般来说,深度可分离卷积与常规卷积的成本比例为。eg:本例中成本比例为
。
MobileNet v2

在该网络中,点卷积又称为投影。
- 瓶颈层的优势:
- 通过扩展操作,增加了瓶颈块内表示的大小,使网络能够学习更丰富的函数,实现更丰富的计算集
- 通过投影将其投影回更小的值集,保持内存量(即需要在层间传递的激活值的大小)相对较低

6、EfficientNet
自动缩放神经网络以适应特定设备
三、目标检测
1、目标定位
定位分类问题不仅要求判断出图片中物体的种类,还要在图片中标记出它的具体位置,用边框把物体圈起来。

为了定位图片中汽车的位置,可以让神经网络多输出 4 个数字,标记为 。将图片左上角标记为 (0, 0),右下角标记为 (1, 1),则有:
- 红色方框的中心点:
- 边界框的高度:
- 边界框的宽度:
因此,训练集不仅包含对象分类标签,还包含表示边界框的四个数字。定义目标标签 Y 如下:

其中,表示第 n个种类的概率;如果
,表示没有检测到目标,则输出标签后面的 7 个参数都是无效的,可以忽略。
2、基于滑动窗口的目标检测
- 训练集上搜集相应的各种目标图片和非目标图片,样本图片要求尺寸较小,相应目标居于图片中心位置并基本占据整张图片。
- 使用训练集构建 CNN 模型,使得模型有较高的识别率。
- 选择大小适宜的窗口与合适的固定步幅,对测试图片进行从左到右、从上倒下的滑动遍历。每个窗口区域使用已经训练好的 CNN 模型进行识别判断。
- 可以选择更大的窗口,然后重复第三步的操作。
基于滑动窗口的目标检测原理简单,且不需要人为选定目标区域;但需要人为直观设定滑动窗口的大小和步幅。滑动窗口过小或过大,步幅过大均会降低目标检测的正确率。另外,每次滑动都要进行一次 CNN 网络计算,如果滑动窗口和步幅较小,计算成本往往很大。
所以,滑动窗口目标检测算法虽然简单,但是性能不佳,效率较低。
3、基于卷积的滑动窗口实现
在卷积层上应用滑动窗口目标检测算法可以提高运行速度,将全连接层换成卷积层,即使用与上一层尺寸一致的滤波器进行卷积运算。


如图,对于 16x16x3 的图片,步长为 2,CNN 网络得到的输出层为 2x2x4。其中,2x2 表示共有 4 个窗口结果。对于更复杂的 28x28x3 的图片,得到的输出层为 8x8x4,共 64 个窗口结果。
运行速度提高的原理:在滑动窗口的过程中,需要重复进行 CNN 正向计算。因此,不需要将输入图片分割成多个子集,分别执行向前传播,而是将它们作为一张图片输入给卷积网络进行一次 CNN 正向计算。这样,公共区域的计算可以共享,以降低运算成本。
滑动窗口的卷积实现,大幅提高了定位效率,但边界框定位不够准确,可通过YOLO算法获得更精确的边框。
4、YOLO算法
YOLO 算法将原始图片划分为 n×n 网格,将图像分类和目标定位算法,逐一应用在每个网格中,每个网格都有标签如:

若某个目标的中点落在某个网格,则该网格负责检测该对象。

如上面的示例中,如果将输入的图片划分为 3×3 的网格、需要检测的目标有 3 类(行人、汽车、摩托车),则每一网格部分图片的标签会是一个8维的列矩阵,最终输出的就是大小为3×3×8的结果。在实践中,可能使用更为精细的 19×19 网格,则两个目标的中点在同一个网格的概率更小。
YOLO算法采用卷积实现,运行速度非常快,甚至适用于实时目标检测。
5、交互比
交互比(IoU, Intersection Over Union)函数用于评价对象检测算法,它计算预测边框和实际边框交集(I)与并集(U)之比:。
IoU 的值在 0~1 之间,且越接近 1 表示目标的定位越准确。
6、非极大值抑制
非极大值抑制会通过清理检测结果,找到每个目标中点所位于的网格,确保算法对每个目标只检测一次。
单类别目标检测进行非极大值抑制的步骤如下:
- 将包含目标中心坐标的可信度 Pc 小于阈值(例如 0.6)的网格丢弃;
- 选取拥有最大 Pc 的网格(亮框);
- 分别计算该网格和其他所有网格的 IoU,将 IoU 超过预设阈值的网格(暗框)丢弃;

- 重复第 2~3 步,直到不存在未处理的网格。
进行多个类别目标检测时,对于每个类别,应该单独做一次非极大值抑制。
7、锚框

在上图示例中,我们希望同时检测人和汽车。因此,每个网格的的标签中含有两个锚框(Anchor Boxes)。输出的标签结果大小从 3×3×8 变为 3×3×16。若两个 Pc 都大于预设阈值,则说明检测到了两个目标。
局限性:对于同一网格有三个及以上目标,或者两个目标的锚框高度重合的情况处理不好。
锚框的形状一般通过人工选取。高级一点的方法是用 k-means 将两类对象形状聚类,选择最具代表性的锚框。
四、语义分割
相较于只把物体框出来的目标检测,语义分割会把每一类物体的每个像素都精确地标出来。如下图的示例所示,输入一张图片,语义分割会把每一类物体准确地用同一种颜色表示。

在分类模型中,图像会越卷越小,最后压平放进全连接层并输出多个类别的分类概率。

而在语义分割模型中,由于模型的输出也是一幅图像,在输入图像被卷小了以后,还会有一个放大的过程。

1、转置卷积/反卷积
核心思想:建立一个逆向的卷积操作,即从一个值映射到多个值。具体来说,标准卷积是一个多对一的映射,而转置卷积则是一对多的映射。例如,对于一个4x4的输入矩阵,使用3x3的卷积核进行卷积操作,输出将是一个2x2的矩阵。转置卷积则是反过来,从2x2的矩阵生成4x4的矩阵。




2、U-Net
U-Net除了对图像使用了先缩小再放大的卷积外,还使用了一种跳跃连接(与ResNet中残差连接的跳连不同,它是把两份输入拼接在了一起)。这样,在反卷积层中,不仅有来自上一层的输入,还有来自前面相同大小的正卷积的结果。因此,后半部分的网络既能获得前一个卷积的抽象、高级的特征(如类别),又能获得前半部分网络中具体,低级的特征(如位置)。

具体结构如下:

U-Net的前半部分和常见的CNN一样,缩小图像大小,增大图像通道数。而在后半部分中,每次上采样时,一半的通道来自上一层的输出,另一半的通道来自于网络前半部分。