卷积神经网络 (Convolution Neural Networks, CNN)
卷积神经网络常用于图像处理和计算机视觉等多个领域。在第1至4节中讲述了构建卷积神经网络的基础知识。第5节讲述了经典的卷积神经网络。第7至9节涉及了三种常见的CNN应用场景:目标检测、人脸识别以及风格迁移。
1. 卷积计算
1.1 卷积运算 (Convolution):
如图所示,在6×6大小的输入数据中应用一个3×3尺寸的滤镜完成一次二维卷积运算操作后会得到一个大小为4×4的结果数据集其中每个结果元素的位置值是通过输入数据特定区域与其对应的滤镜权重做点积运算汇总而得具体而言对于结果位置坐标为(1 1)的数据点它是由输入数据中对应位置及其相邻8个像素点分别与滤镜核中的相应权重相乘后再累加总和所得通过逐步平移该处理窗口可以在整个输入数据上完成全部位置的结果计算从而构建起完整的输出特征图

滤波器大小一般是奇数,例如3×3、5×5等,这样就会有一个中心点,便于计算。
注意,在某些数学教材中(卷积)要求对滤波器进行反射翻转操作;未进行这种反射翻转的操作被称为互相关运算。而在深度学习领域的文献中,则通常未进行这种反射翻转。
1.2 边缘检测 (Vertical edge detection):
该文展示了垂直滤波器(vertical filters)的作用,在图像处理领域具有重要的应用价值。研究者发现该方法不仅能够识别出垂直方向上的边界特征点,并且同样能体现从明到暗或暗到明的过渡效果。

滤波器大小和参数可通过设计灵活设置。此外还能实现不同角度的边缘检测。在神经网络中,参数经由模型训练确定。


1.3 填充 (Padding):
在卷积计算过程中,在卷积操作中输入图像经过滤波器处理后的输出矩阵尺寸可以通过以下公式确定:输出高度和宽度均为(n - f + 1) × (n - f + 1),其中n表示输入图像的空间维度大小而f表示滤波器的尺寸参数。该过程主要表现在以下两个方面:首先随着网络层数的增加输入图像经过连续多次卷积操作会导致输出图像的空间尺寸不断减小从而难以有效提取细节特征;其次在处理边缘区域时由于滤波器无法完全覆盖到边缘像素通常会导致边缘区域的信息丢失具体而言左上角等角落位置仅被访问一次从而失去了丰富的细节信息因此需要引入填充层来补充这些区域的信息通常采用的方法是填充零层以维持输入图像的空间维度而不影响后续特征提取过程如图所示

其中 n=4、f=3、p(padding amount)=1。
因此,后面说的卷积有两种模式:
- 有效卷积:无填充操作
- 同一卷积:有填充操作,在该模式下输出尺寸与输入一致,并且满足p=(f-1)/2的条件
没有特殊说明一般指Valid convolution。
除此之外,还有一个重要的参数是卷积的步长s(strided convolution),通常情况下步长s被设置为1。举个例子说明当步长s=2时的情况

所以,卷积后的大小为:

1.4 三维卷积:
下面给出了一个三通道图像卷积的示例:

该图像尺寸设定为6×6×3像素,并分为宽度w、高度h和通道数c三个维度。由于滤波器设计为三维结构,在实际应用中通常会保持与输入图像相同的通道数量。因此,在后续处理中可能省略对此参数的具体说明。经过处理后得到的结果是一维通道下的4×4二维图像。
如果我们有多个滤波器 (Multiple filters),可以做以下运算:

当有两个滤波器的时候,可以得到一个二通道图像。
2. 卷积层 (Convolution layer)
其实,使用多个滤波器对图像进行处理就构成了一个卷积层,同该例:

下面对卷积层进行符号说明:如果第ζ层是一个卷积层:

Example ConvNet:

其中前三层都为卷积层,最后一层使用了全连接和softmax激活函数。
3. 池化层 (Pooling layer)
池化本质上是一种降采样过程,在深度学习模型中涉及多种形式的非线性池化操作。其中最常用的包括Max pooling(即Max pooling),它通过滑动窗口的方式从输入特征图中提取具有最大响应值的区域进行特征提取

池化层不包含可训练的权重和阈值等参数,并且仅需预先定义的关键参数:f代表滤波器尺寸(filter size)、s代表跨距大小(stride)、以及选择最大池化(max pooling)或平均池化(average pooling)。
4. 卷积神经网络
Neural network example:卷积层(CONV)、池化层(POOL)、全连接层(FC)

该种经典的卷积神经网络架构采用以下基本单元:conv-pool模块重复设计,并在顶层接全连接层(fc)与分类器(softmax)。由于池化层不含参数,在实际应用中通常将卷积操作与池化操作合并视为一层计算量。至于模型超参数的选择,则应避免随意设定,默认值可能不适用于特定数据集;建议参考相关文献中的设置以获得最佳性能
可以发现一个规律,随着神经网络的加深,激活值的size逐渐变小。

为什么要使用卷积?相比于全连接层有什么优势?
- 参数共享机制不仅适用于图像的一部分特征检测(如边缘检测),还广泛应用于图像的各个区域。这表明卷积层所使用的参数数量明显少于全连接层所需的参数数量;
- 卷积层输出中的每个数值都主要由输入中的有限区域决定,这体现了稀疏连接特性。
5. 经典的卷积神经网络
5.1 LeNet-5
结构:conv - pool - conv - pool - fc - fc - softmax
该网络提出的时间较早,使用的激活函数还是 sigmoid / tanh


5.2 AlexNet
该网络比 LeNet 更大,但更简单。使用的激活函数是 ReLU


5.3 VGG-16
这种网络很大,但结构规整且不复杂。


5.4 ResNet (残差网络)
Residual block (残差块):


添加这样一个“捷径”,就可以构成一个残差块,将信息传递到网络的更深层。


随着深度递增,在深度学习模型中,训练误差会逐步提高收敛程度,在信息传递路径拉长的情况下(即数据经过更多层变换),任何微小的信息偏差都可能被放大到显著的程度。残差网络通过巧妙的设计缓解了梯度消失与爆炸现象,并且在支持更深网络结构的同时维持了较高的性能水平。
5.5 谷歌 Inception 网络
先介绍一下1×1卷积:


通过运用单通道卷积操作处理后的图像其宽度和高度保持不变,并且其中每个像素的新值仅取决于原始图像中对应位置处的那个通道的数据。若采用n个独立的一维卷积层,则能够生成宽度和高度维持原状但通道数量增至n的新图像。

上图中,两种卷积效果基本相同,但下面的计算量仅为原来的十分之一。
该网络将多种卷积与池化操作整合到单层计算中,并使网络能够自主决定采用哪种操作?


Inception network:


6. 迁移学习和数据扩充
6.1 迁移学习
当当前任务的数据量较为有限时
自己的训练集越大,需要冻结的层数就越少,可以训练的层数越多。
6.2 数据扩充
在计算机视觉领域中运用数据增强技术对于提升各种任务的表现具有显著价值。主要采用以下方式:镜面反射以实现图像的对称扩展;通过随机裁剪图像来增加训练样本的多样性;利用旋转和缩放操作生成多角度图像实例;此外还包含图像扭曲变形和色调调整等技术手段以丰富数据特征
7. 目标检测
7.1 一些符号定义
假设我们的检测对象包括:1.行人;2.汽车;3.摩托车;4.无目标场景(仅用于背景填充)。

将输入图像输入至该神经网络其预期输出包括以下信息:当目标物体存在(pc=1)时系统会返回相关参数以及边界框数据;若仅识别背景(pc=0)则后续六个参数无实际意义。此外该图像的预测结果约为y = [1, 0.5, 0.7, 0.3, 0.4, 0, 1, 0]
损失函数 (cost function):

7.2 特征点检测
该方法要求首先确定特征点的数量,并创建包含这些特征点的标签训练数据集。然后通过神经网络模型确定关键特征点的具体位置。
以如图所示的人脸为例,在其中包含了128个特征点的情况下,输出应包含总共129个参数(其中一个是用于判断是否为face的关键参数值,其余部分则对应于该脸部各关键点的位置信息)。

7.3 基于滑动窗口的目标检测 (Sliding windows detection)
该方法首先选取一个小窗口,并以固定步长滑动窗口以覆盖整个图像区域。随后将此区域输入至卷积神经网络进行分类识别。接着增大窗口尺寸,并依次进行上述步骤。
但以上步骤的计算成本高,可以发现有很多冗余计算。

为了改善这个问题,这里先介绍如何将全连接层转换为卷积层:

这两个网络是相同的,但下面的网络只有卷积运算了。
Convolution implementation of sliding windows:

给定一张图像尺寸为16×16像素,在其基础上设置一个滤波器大小为14×14像素。经过滑动窗口处理后,依次将滤波器滑动至四个不同位置,并对其进行卷积运算以获取特征图。若我们不对图像进行分块一次性全局卷积处理,则会面临重复计算各区域特征信息的问题(如上图所示)。因此,在不考虑重叠的情况下进行一次性全局卷积处理能够有效避免中间区域特征信息的冗余计算。
7.4 YOLO算法

在此采用了3×3网格结构,在实际应用中通常采用更为精细的划分方式(例如19×19)。YOLO算法的核心原理在于将之前讨论过的图像定位与分类方法应用于每一个网格单元中。每个单元格都会生成一个y值(类似于7.1节所述),但值得注意的是,在这里我们关注的是目标在当前单元格内的位置信息而非整个图像范围内的位置信息。其中bh和bw可能超过1的数量级因此,在此设置下目标输出尺寸为3×3×8


优势在于神经网络能够生成精确且明确的边界框。由于仅需进行一次卷积计算操作,YOLO算法便能够实现极高的运算速度,从而实现实时识别目标.
更多细节可以看原文文献,据说难度相对较高。
7.5 交并比 (Intersection over union)
交并比用于评估目标检测算法的效果如何?它是通过比较两个边界框之间的交叠与总面积的比例来确定的。通常认为当这一比例超过0.5时被认为是有效的。

7.6 非极大值抑制 (Non-max suppression)
非极大值抑制是为了确保每个对象只被检测到一次。

当在滑动窗口内检测到多个边界框时,则按照以下流程进行处理:首先优先去除那些具有较低概率 (Pc) 的输出边界框;接着从剩下的边界框中选择具有最高概率的边界框进行预输出;随后移除那些与当前预选边界框存在高度重叠的其他边界框;最后反复执行上述步骤直至所有相关边界框都被处理完毕

在YOLO算法中,同样地,在每一个单元格中计算出所有候选边界框的概率值,并找出概率最高的单元格作为最佳检测结果进行标记为边界框。然后检查剩余的矩形区域,并对与当前边界框存在iou(交并比)超过设定阈值的情况进行抑制处理而不被输出。
如果有多种对象,需要独立进行多次非极大值抑制。
7.7 Anchor boxes
当一个格子或窗口中可能存在多个目标时,则必须提高输出维度的数量。

这样的输出就可以检测出两个以内的对象了。
7.8 R-CNN
带区域的卷积网络 (R-CNN) 的主要目标是通过提取候选区域来进行特征检测,在这些候选区域内应用卷积网络分类器以实现精确识别。具体而言,该方法通过图像分割技术确定颜色块的位置,并对识别出的颜色块应用卷积网络进行分类。

R-CNN运行很慢,也有很多改进算法,例如Fast R-CNN、Faster R-CNN等。
8. 人脸识别 (Face recognition)
Verification (验证):
- 输入:图像、名字或ID
- 输出:输入的图像是否是该名字或ID对应的人
Recognition (识别):
- 已包含一个具有K个记录的人口数据库
- 输入为图像
- 输出结果为该图像中人物的身份信息ID编码, 若无法识别则返回无对应信息
Siamese network:针对两个独立输入样本分别施以相同的卷积神经网络架构,并计算其间的相似性度量;损失函数用于评估该网络对每一对输入样本的识别能力。

Triple loss:训练对象是一个三元组 (anchor、positive、negative):

9. 风格迁移 (Neural style transfer)

10. 关于深层卷积神经网络到底在学什么
卷积神经网络的可视化:

层数越深,特征越复杂。
以上内容主要参考吴恩达《深度学习》课程第四课
博客园链接
