一、卷积神经网络基础
1、计算机视觉
如:图片分类,对象检测、神经网络实现图片风格迁移等
2、边缘检测
如下图,是一次卷积计算的过程
左边的矩阵表示一副图片。
中间的 * 表示进行卷积运算,图片表示一个3×3的过滤器,也可以称之为核
要得到右边的矩阵结果,需要将过滤器在左边的矩阵进行覆盖,对覆盖后的区域求各个元素积并求和,随后可得到一个新的值。计算完一个值后需要将过滤器右移一次,如果右边没位置了,则需要下移一次,并再次从左边开始。
3、Padding
上述卷积计算有两个缺点:
- 1、随着卷积次数的增加,新生成的图片将会越来越小。
- 2、边缘的信息通常只被一部分过滤器进行计算,而中间的部分能被过滤器的各个部分都进行计算,这样会导致丢失大量边缘信息。
为了解决上述的问题,在进行卷积操作时,可以对图像进行填充(pad)。通常,填充一个像素表示在原来的图像周围,新增一圈像素。
填充像素有两种方法,一种叫Valid卷积,表示不填充
另一种叫Same卷积,表示填充后,你的输出将会和原图像像素一样。
通常,要满足Same卷积的结果,填充的像素p需要满足如下等式(其中f为过滤器的维数):
p=f−12
p = \frac {f-1}{2}
p=2f−1
4、卷积步长
通过设定卷积步长,可以让过滤器移动设定好的步长距离。
此时,输入与输出的维度关系由以下公式决定:
输出维度为:n+2p−fs+1
输出维度为: \frac {n + 2p - f}{s} + 1
输出维度为:sn+2p−f+1
其中 n 表示原图像的维度, f 表示过滤器的维度,填充 p ,步长为 s 。
此时,如果除法运算的结果不是一个整数,将进行向下取整。
5、三维卷积
三维卷积运算也类似。
首先过滤器的最后一维需要与原图的最后一维相同。随后需将过滤器覆盖的范围进行元素相乘并求和。
6、一层卷积网络
7、池化层
通常卷积神经网络分为三层,卷积层(conv)、池化层(pooling)、全连接层(fully connected)
在池化层中,最大化池的功能是:在任何一个象限内提取到某个特征,它都会保留在最大池化的输出里。即将过滤器中提取到的特征保留最大值。
二、深度卷积模型
2.1、经典网络
2.1.1、LeNet-5
[LeCun et al., 1998. Gradient-based learning applied to document recognition]
该模型针对灰度图像进行训练,对于一个32 × 32 × 1的图片来说,该模型结构在第一层使用6个5 × 5的过滤器,步幅为1,产生一个新结果再进行池化操作,过滤器宽度为2,步幅为2。此时新结果会缩小2倍。然后再进入下一个卷积层,使用16个5 × 5的过滤器,再下一步为池化层,然后为全连接层。
全连接层中有400个节点,每个节点有120个神经元。
2.1.2、AlexNet
[Krizhevsky et al., 2012. ImageNet classification with deep convolutional neural networks]
第一个卷积过滤器采用96个11 × 11的过滤器,步幅为4,然后使用3 × 3的过滤器构建最大池化层。
第二个卷积过滤器采用1个5 × 5的same卷积。再使用3 × 3 的最大池化。
随后进行多次same卷积,和一次最大池化,最后在进行多个全连接层
2.1.3、VGG-16
[Simonyan & Zisserman 2015. Very deep convolutional networks for large-scale image recognition]
该网络没有许多超参数,仅需专注于构建卷积层。
首先使用3 × 3步幅为1的same过滤器构建卷积层,然后为2 × 2步幅为2的最大池化层。具体流程如下图:
第一步使用2次64个过滤器,再使用最大池化。
第二步使用2次128个过滤器,再使用最大池化。
第三步使用3次256个过滤器,再使用最大池化。
…
其中VGG-16中的数字表示包含16个卷积层和全连接层
2.2、ResNets
[He et al., 2015. Deep residual networks for image recognition]
该网络由Residual block构成。
在之前要计算l层后面的激活函数值,需要一步一步往下进行计算,如下图所示:
而这个网络将会使al的信息直接到达神经网络的深层,不再沿着之前的主路径传递
而al的插入时机是在进行ReLU激活之前。
2.3、1×1过滤器
可以调整信道数量
2.4、Inception网络
当进行卷积的时候,你要决定过滤器的大小或者是否添加池化层。
使用Inception网络可以帮助我们做以上这些决定,虽然网络架构会变复杂,但会表现的非常好
[Szegedy et al. 2014. Going deeper with convolutions]
网络模型如下所示:
左边为输入矩阵,Inception层奖代替人工来确定卷积层中的过滤器类型。
中间的过滤器可能为64个1×1,128个3×3,32个5×5,也可能有池化层。将这些中间得到的输出结果向右边一样堆积起来,最终输出结果如上图右边所示为28×28×256。
它不需要决定使用哪个过滤器或是否使用池化层,而是通过网络自行确定这些参数。可以人工给网络添加这些参数的所有可能的值,然后将输出连接起来,让网络选择自己学习它需要什么参数。
以5×5的卷积为例,我们可以看到它的计算规模到了1.2亿次。除了上图的架构,我们还有下面的一种架构:
中间是一个瓶颈层,是网络中最小的部分。该架构先将网络缩小,再扩大。所得到的计算次数如上图所示,前面与后面共同计算的次数是1240万次。
模型总结如下:
2.5、MobileNet
该网络能在手机计算环境中运行
一般卷积的计算次数如下所示:
计算的次数将是等于过滤器的规模乘以输出的规模,如上图所示。
现在介绍深度可分离卷积,它可分为两步
-
深度卷积:
它的过滤器规模不再有输入的通道数量,而是过滤器数量等于通道数量
这样进行卷积计算的时候,计算的次数将等于过滤器大小乘以输出大小 -
逐点卷积
将上一步的输出值,作为这一步的输入值以便得到想要的结果值
上图为计算一次的过程,若结果有深层,那么过滤器的数量等于结果的通道数量
计算次数将是过滤器的参数乘以结果的规模参数。
通常深度可分离卷积和普通卷积的计算成本之比为 :
点积过滤器数量的倒数加上深度卷积过滤器的f的平方的倒数。
所以深度可分离卷积可以作为卷积神经网络的基本构成要素,相比普通卷积更高效。
而MobileNet的结构,就是将上述深度可分离卷积进行13次堆栈,在最后仍需加上池化层,全连接层以及softmax进行预测
后续的MobileNet v2模型如下所示
这也叫一个瓶颈区块,一方面它采用扩展过程,可以增加需要表现的大小,使神经网络具有更丰富的功能也可以进行更多的计算。另一方面可以在移动设备、一些内存较少的设备上使用。
通常这个区块要使用17次,并加入池化、全连接等后可以进行分类
[Sandler et al. 2019, MobileNetV2:Inverted Residuals and Linear Bottlenecks]
2.6、EfficientNet
让神经网络能够放大或缩小,使之能够用在新的设备上面。
可进行的操作有,提供一张高分辨率图像或使得神经网络变得更深或计算层变得更宽或根据计算资源还可以使用复合缩放。
[Tan and Le, 2019,EfficientNet:Rethinking Model Scaling for Convolutional Neural Networks]
2.7、通过开源代码完成自己的项目
下载开源项目的工程
如果要进行猫的三分类,通过网上下载的工程,修改其SoftMax满足自己的目标,同时前面的参数保持不变,仅训练和Softmax层有关的参数。
在训练集很少的时候,可以冻结尽可能多的神经网络层。
数据越多,冻结的就越少。
三、目标检测
3.1、目标定位
如判断汽车在图片中的位置,或是检测其他对象。
图像分类的思路可以帮助学习分类定位,而这样的对象定位思路又有助于学习对象检测。
如上图所示,在原来图片分类的基础上,新输出四个参数值。bx和by表示标记框的中心位于图片的哪个位置,bh表示标记框高度为原图片的多少倍,bw表示标记框的宽度为原图片的多少倍。
为该监督学习任务定义目标标签y:
此时的y是一个向量,
- 第一个pc表示是否含有对象,如果对象属于前三个分类,则pc等于1,如果图片中仅有背景则pc等于0。
- 如果检测到对象,就会输出被检测对象的边界框参数bx,by,bh和bw
- 如果pc等于1,同时还会输出c1,c2,c3,表示对象属于上图中123的哪一类。
3.2、特征点检测
标注一些关键特征点,再输出标注过的特征点,这样可以达到一些效果,如判断人物动作姿态,识别图片中人物的表情。
总结:批量添加输出单元,用来输出要识别的各个特征点的坐标值。
3.3、目标检测
通过上述目标定位和特征点检测,可以构建一个对象检测算法,这个算法叫做基于滑动窗口的目标检测算法。
如果我们要构建一个汽车检测算法:
- 首先创建一个标签训练集。可以适当剪切原图片,使得整个图片都被目标占据,当然也要有一些没有该对象的图片。
- 输入这些图片进入卷积网络,输出y表示有该对象或无该对象。训练完这个卷积网络就可以用它来实现滑动窗口目标检测。
滑动窗口目标检测:
- 存在一个测试图片,判断是否存在对象。
- 选定一个特定大小的窗口,将该窗口输入卷积网络,卷积网络将进行预测,判断该窗口内的图是否有对象。
- 滑动窗口检测算法会继续选定新的区域去判断,直到滑过测试图片的每一个角落。
- 不断选用更大的窗口进行滑动检测。
但对于滑动窗口有一个问题,如果窗口较小且滑动步伐也小,则能够得到较高的准确率,但是此时窗口数量会很多,造成计算成本的上升。如果窗口大滑动步伐也大,那么虽然解决了高计算成本的问题,但是准确率却不足以保证。
下面将构建滑动窗口的卷积应用:
首先要了解如何将神经网络的全连接层转化为卷积层,如下图所示:
前面几层保持不变,在全连接层中加入过滤器,使得新的输出从原来的单元变成了1×1×400维度
[Sermanet et al., 2014, OverFeat:Integrated recognition, localization and detection using convolutional networks]
此时,如果窗口为14×14大小,通过前述的全连接层转化为卷积层,可以得到一个输出。
然后将测试图片应用新滑动窗口算法,此时不再需要将输入图片分成多个子集,分别进行前向传播,而是将它们作为一张图片输入给卷积网络进行计算,其中的公有区域可以共享一些计算,在最终的输出结果上可以一次性得出所有窗口的结果,从而解决计算成本问题,提高了效率。
但是该算法仍然存在一个缺点:边界框位置不准确
一个能得到更精确边界框的算法是:Yolo算法
[Redmon et al., 2015, You Only Look Once:Unified real-time object detection]
对于一副图片,可能分成9份(或者更细),此时对于训练集的标签如上图右边所示,对于无对象的,pc的值为0,其余的值可以不关注。有对象的pc值为1,其余值需要有表示。此时整张图的输出为3×3×8
而对于有对象的图,通常将对象分给中心点所在的区域,其余区域通常进行忽略。
在本例中,对于一个区域中一个对象的识别是没有问题的。
该算法与图像分类和定位算法相像,能显式地输出边界框坐标,这可以让神经网络输出的边界框具有任意宽高比,并且能输出更精确的坐标。
3.4、交并比函数(IOU)
该函数可以用来评价对象检测算法,计算两个边界框交集和并集之比,如果此时IOU大于等于0.5则检测正确
3.5、非最大值抑制
它能确保算法对每个对象只检测一次。
首先看看每次报告检测结果的相关概率,找到最大值,设定为最可靠的检测,此时非最大值抑制就会进行检测,所有和该最大的边界框有很高交并比的输出就会被抑制。然后再找最大值,依次类推,并扔掉被抑制的结果。
3.6、Anchor Boxes
前述的方法都是一个格子检测一个对象,使用Anchor Boxes可以一个各自检测多个对象。
如上图所示,两个对象的中心点在一起,此时y将无法输出检测结果。而anchor box将预先定义多个不同形状的anchor box,此时输出的值会包含此前多个y的值。因为anchor box1更接近人的形状,于是它存储的是和人相关的数据,anchor box2则更接近车的形状
3.7、总结Yolo对象检测算法
- 构造训练集。假设训练的算法检测三种对象——行人、汽车、摩托,且使用两个anchor box,则y的大小如下图。此时要构造训练集,需要遍历图中的9个格子然后构成对应的目标向量y。对于其他的8个格子,没有对象,所以数据我们不关心,如中间的向量。对于有对象的格子,由于它的框与anchor box 2交并比更大,所以我们更关注最右边向量的下方部分的数据。实践中是将图片分割成了19*19个图形。
- 然后训练一个卷积网络,输入是图片,大小可能是100×100×3,然后卷积网络最后输出尺寸为3×3×16
- 最后运行非最大值抑制
3.8、候选区域(了解)
[Girshik et. al, 2013, Rich feature hierarchies for accurate object detection and semantic segmentation]
R-CNN算法,带区域的卷积网络,会尝试选出一些区域,并且在这些区域上运行卷积网络分类器是有意义的。
运行图像分割算法选出候选区域,对右图中的色块运行卷积算法进行检测。相比于原来的滑动窗口,提升了一定的速度。
但速度还可以提升。
3.9、图像分割算法
有时候仅仅是对对象画框是不够的,可能还需要判断哪些像素区域能够满足我们的条件。这时可以用到图像分割。
图像分割的原理:在输出图像中,用0和1来表示图片中的每一个像素,假设此时被标记为1表示是汽车的一部分,标记为0则不是汽车的一部分。
那么如何进行操作呢?
首先将此前网络的后面几层删除。在之前,随着层数的加深,图片的大小会越来越小,图片的深度会越来越深,而进行图像分割,我们需要获得全尺寸图像。
通过新的操作将被缩小的图像放大回原图大小。
而要将缩小的图像再次放大之前,我们需要了解一下反卷积(转置卷积)。
反卷积是U-Net架构的关键部分,将使用反卷积将2×2的输入变为4×4的输出,需要选择一个3×3的过滤器。令padding=1,步长S=2。
将输入部分的值乘到过滤器上,并将过滤器放置到输出上,忽略扩展的部分,将实际需要的范围填入结果。
当绿色部分和红色部分重叠的时候,需要将绿色位置的值加到原红色位置上。
3.10、U-Net架构
[Ronneberger et al., 2015, U-Net: Convolutional Networks for Biomedical Image Segmentation]
-
首先将输入图片h×w×3图片看成一个薄片模型,U-Net第一部分使用普通前馈神经卷积层(黑色箭头表示一个卷积层),经过几个卷积层后,通过最大池化来减少高度和宽度(红色箭头表示最大池化),然后再经过两个带有值激活函数的普通前馈卷积层,再此时用最大池化来减少高度和宽度,然后是多次普通卷积,重复上述黄色步骤。
-
然后开始反卷积(绿色箭头),从而构建该神经网络的维度备份。通过第一个反卷积层,得到新的激活。再通过跳过连接(灰色箭头)获取前置激活并复制到右边。
-
此时,为了继续构建U-Net,将添加新的普通卷积层,再应用新的反卷积层。重复几次步骤。最终得到的结果它的大小、高度、宽度将与原始输入图像一致。 -
然后把新的结果映射到分割图像上,使用1×1卷积(洋红色箭头),最后得到输出,它的维度为h×w×3(数字3所处位置的大小取决于我们要识别类型的数量)
四、人脸识别
4.1、什么是人脸识别?
人脸认证:
- 输入图像,名字和id
- 验证输入图片中的人是否符合所声明的身份
人脸识别:
- 有一个存有k个人的数据库
- 输入图像
- 如果输入图像符合数据库中的人脸图,则输出ID
4.2、一次学习
通常在人脸识别中,只有一个样本提供学习。
这时我们可以使用相似度函数,比较两者图片的相似度。此时只需设定一个阈值(超参数),差异值大于该参数则不是同一个人,否则是同一个人。
4.3、Siamese网络
实现4.2中功能的方法就是使用siamese网络
[Taigman et. al., 2014. DeepFace closing the gap to human level performance]
如上所示,对于两个不同的输入,运行相同的卷积神经网络,然后比较最后的输出,可用如下表示:
如何训练?
神经网络的参数定义了编码函数f。
通过学习参数,来比较两个图片是同一个人,则两个编码的距离就小。
4.4、Triple 损失函数
通常需要比较成对的图像。
Anchor和positive(negative)进行比较。通过看anchor图片,使得anchor和positive进行比较时距离更近一些,anchor和negative进行比较时距离更远一点。总结损失函数公式如下:
L(A,P,N)=max(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α,0) L(A,P,N) = max(\parallel f(A) - f(P) \parallel ^2 - \parallel f(A) - f(N) \parallel ^2 + \alpha , 0) L(A,P,N)=max(∥f(A)−f(P)∥2−∥f(A)−f(N)∥2+α,0)
训练所选取的数据应当让d(A,P)与d(A,N)尽可能地接近,而不是随机的选取。
[Schroff et al.,2015, FaceNet: A unified embedding for fface recognition and clustering]
4.5、面部认证与二分类
这是另一个训练神经网络的方法,选取一对Siamese网络,使其同时计算之前的128维嵌入,然后输入到逻辑回归单元,然后进行预测是否是相同的人。相同的人输出为1。
预测函数如下方笔记所写。
五、神经风格迁移
如上图所示,将S的风格迁移到C图中,得到最后的G图。
5.1、深度卷积网络在做什么?
[Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks]
如上图所示,第一层隐藏单元通常会寻找一些简单的特征(边缘或者颜色阴影)
如上图可以看到层数越深,检测的特征越复杂。
5.2、代价函数
风格迁移的代价函数由两部分组成。
一部分是内容代价函数,它用来度量生成图片的内容和内容图片C的内容有多相似。
另一部分是风格代价函数,用来度量图片G和图片S的风格有多相似。
最后用两个超参数α和β来确定两部分的权重,最后再将这两部分加起来。
[Gatys et al., 2015. A neural algorithm of artistic style. Images on slide generated by Justin Johnson]
内容代价函数使用隐藏层中的某一层计算代价值,通常不会太浅也不会太深。使用预训练的网络,然后计算第l层的两个激活值(图C和图G),然后比较两者的相似值,如果值相似,则内容相似。
风格代价函数
计算机是怎么判断“风格”的呢?某一层不同激活通道之间的相关系数。
如,当你选择了第l层,它是nh×nw×nc的激活矩阵,此时应当了解不同的激活通道间的相关性有多大。
如图,需要计算不同通道之间两个单元的相关性。
若橙色区域是下图的竖线,黄色区域是下图的橙色色调。假如橙色与黄色高度相关,那么意味着所有竖线的位置也很可能有橙色色调。
当计算的时候,也可以计算所有层的数据并求和,但需要添加相应的权重参数。如下图所示。这样可以将神经网络中低层和高层的相关性都考虑到。
其中Gkk’函数的计算如下所示:
主要是将两个通道内对应的激活值进行求积,并在整个通道内进行求和。
那么如何生成一张图片G呢
首先是随机初始化图片G,如右边第一幅图。
然后使用梯度下降不断地调整图像G的像素点。最终得到成品图。