卷积神经网络常常用在计算机视觉方面,用来处理图像。
比如图像分类,目标检测和图像风格迁移
使用卷积运算既可以在保存图像特征的同时缩减图片大小减少计算量,从而使的大图像的处理成为可能

1 边缘检测

卷积神经网络中提取图像特征使用的过滤器filter也叫卷积核kernal
例如一个最简单的卷积核3*3的边缘检测器
图片说明
可知图像的左上角经过卷积核的运算得到了一个-5,说明这个地方右侧的数值比较大,也就是右侧比较黑
那么同理,如果算出来一个正值,那么说明所检测的位置左侧比较黑。
如下更好的说明了为什么这个卷积核可以作为垂直边缘检测器
图片说明
可见经过卷积运算,垂直边缘这个特征高亮展示到了卷积结果中,
卷积运算的结果也可以视为一个特征图像来理解。

卷积神经网络使用不同的卷积核可以提取到不同的特征。

2 padding

可知每次使用卷积运算,特征图像都会减小,直至无法再提取特征。
并且我们的卷积核忽略了边缘的像素。
比如左上角的那一个像素,就只有一个卷积核会用到他进行计算,
而中间部分的像素最多却可以有9次机会参与计算。这就导致了对图像边缘特征的忽略。
那么为了防止图像的过度缩减和提高对图像边缘像素的利用,可以使用padding在原来图像的边缘补充一些无用的空白像素,从而解决上述两个问题。

对于此部分一般深度学习的框架在建立卷积层时都可以设定padding的属性,有两种valid和same。
其中valid是指无padding
nn 的图像经过ff的卷积核,卷积运算后为n-f+1n-f+1的大小
same是指输入图像的大小和输出图像的大小一致。
设padding补充了p的长度
那么大小应该为 n+2p-f+1
n+2p-f+1
所以设置为same实际上是p=(f-1)/2
通常来说卷积核的大小f都是奇数

3 strided convolution 步幅

上述的讲解中卷积核是一个单位一个单位移动的,卷积核也可以一次移动多个单位。
即步幅s
设原图像大小为n*n,padding为p,strided为s。
那么新的卷积结果大小为:(n+2p-f)/s+1向下取整 * (n+2p-f)/s+1向下取整

4 pooling layer 池化层

池化层是为了应对图像太大,缩减图像大小,提高模型计算速度
最常用的pooling layer有max pooling, average pooling
图片说明
图片说明

卷积神经网络比全连接网络有两个好处:
1.参数共享
2.稀疏连接

残差网络

经典的网络数据是由上一层传给紧接的下一层,而残差网络允许上一层的数据直接传给更深层次的网络。
普通的深度神经网络在不断训练时,错误率会首先下降,让后随着训练次数的增加错误率又缓慢上升。
但是残差网络可以解决这个问题。有助于解决当神经网络过深时的梯度消失和梯度爆炸问题。
图片说明
图片说明

1*1 卷积核

11的卷积核在一个二维的处理上看不出来有什么用处,但是对于多信道来说,它可以实现信道压缩。
图片说明
当然了如果你愿意也可以用1
1的卷积核来实现信道的增加,只需要增加卷积核的个数即可。

inception network

这个起始网络用语解决选择什么样的网络比较好的这个问题,
其做法是将所有网络组合起来,让后让计算机自己学应该使用什么样的网络。
图片说明
但是这样带来了大量的计算代价。
为了降低计算代价,又可以使用1*1的卷积层构造瓶颈层。从而缩减计算量。
图片说明

迁移学习

利用别人已经训练好的类似的网络,冻结中间的数据,只训练最后的全连接层,从而解决自己的问题。
图片说明
其中还有一个技巧就是,我们可以把我们的数据进一步加工,先通过之前冻结的网络层,形成新的需要最终喂入softmax层的数据,这样就可以避免我们在之前的层次重复计算了。
图片说明
还有一个规律,就是对于新问题,可用于训练的数据越多,那么就可以冻结更少的层次,从而实现使网络更加适合于新的问题。
如果拥有足够多的数据,那么我们可以将之前人的权重作为我们的初始化值,让后重新训练整个网络。

数据增强

  1. mirroring 构造镜像图像
  2. random cropping 随机剪裁
  3. rotation
  4. shearing
  5. local warping
    图片说明

1.color shifting
图片说明

目标检测

image classfication
object localization and detection
对于图像分类这个任务来说,最后的softmax输出层只需要输出一个分类的向量即可,来表示最终预测的到底是哪一类物品。
对于localization来说,我们还需要输出一个bounding box来表示这个物品在哪个位置,并且大小有多大。
即输出物品的x,y,wx,wy
一般我们习惯于将图像的左上角定位(0,0),定义图像的右下角为(1,1)
这样x,y,wx,wy的变化范围全部都是在0-1之间。方便处理
其中输出的向量y应该为:
y=[pc,x,y,wx,wy,c1,c2,....,cn], 其中pc图像中是否有物品,c1,c2...cn,表示是n类物品中的哪一类。

特征点检测

标记好数据,然后训练输出就好。
比如你要进行对人脸的眼睛位置的定位,那么你只需要设定输出lx,ly,rx,ry,然后通过打好标签的数据训练即可。

目标检测

滑动窗口的目标检测算法
首先训练了一个能够识别物品的卷积神经网络。
然后从所要识别的图像上选取一个小的窗口,传给物品识别的网络,如果检测有,那么这个窗口的位置就有这个物品。否则没有。思想就是用一个较小的窗口,在原来大的图像上滑动一遍,检测所有可能的位置。
并且我们也可以不同大小的窗口来进行滑动窗口检测。
但是这个方法有一个致命的缺点--计算量太大。
为了解决这个问题,提出了卷积的滑动窗口检测方法。

卷积的滑动窗口实现

一般来说做物品分类最后总喜欢有全连接层,来进行对物品分类作为输出。
所以对于整个网络来说,前半部分是卷积的,而最后不是卷积的。
然而卷积的运算方式有着很多检测窗口共享数据,并行计算的优势,所以我们设法将最后的全连接层也改为卷积形式。

图片说明
可见这样一来,我们通过一次卷积的正向传递,就完成了整个滑动窗口的所有位置的检测,最终输出了一个8*8=64的一个检测结果。表示的是64个位置的滑动窗口检测的结果。
但是这样检测也有一个缺点,那就是检测的窗口位置都是一定的,对于实际物品来说这个位置不一定准确。
下面介绍一个更好的方法。

bounding box prediction

accurate bounding box
为了更精确的检测出bounding box的位置,下面介绍
yolo algorithm
首先使用图像定位和图像分类算法,分别应用于下面图像中的9个位置:
图片说明
对于每一个格子,我们输出一个向量y=[pc,x,y,wx,wy,c1,c2,c3]
所以最后的输出就是338的一个结果
图片说明
由于我们是输出的x,y,wx,wy所以我们的结果会比之前只用物品检测和滑动窗口更加准确。
因为我们结合了物品检测,滑动窗口和物品定位三个元素。
也许你会发现这个算法每个格子只能检测一个物品,没错,的确是这样的。
这个算法的核心在于,他根据一个物品的中心位置来把这个物品分配给一个格子。让后把对这个物品的检测交给这个格子处理,而不需要其他格子处理这个物品。即使这个物品横跨了很多个格子。
我们也可以定义更加精细的格子来处理。比如1919,2121等等。
这样显示的给出bounding box可以实现对任意大小的bounding box的精确预测,而不受滑动窗口大小的限制。
其中预测出来的x,y,wx,wy是与整个格子相比的比例大小,这个格子的大小设为单位一。

IOU intersection over union 使用交并比来检验预测结果的准确度

可以用来评价目标检测算法
图片说明

Non-max supperession 非最大抑制

使用滑动窗口,如果窗口比较小,那么会有相邻的一些小窗口都会觉得自己的这个窗口中有一个物品,并且这个物品的中心在自己这里,应该由自己处理这个物品的检测。这样就会导致一个物品会被相邻的好几个格子处理。
为了解决这个问题,提出了非最大抑制。
图片说明
非最大抑制的做法就是,所有格子都去预测,然后会将结果以pc的自信度的方式体现出来,之后会检测与最大的那个pc自信度的格子有着较高IOU的格子都会被忽略。最终只剩下自信度最高的那个格子。
non-max 表示你只输出自信度最大的那个,而忽略其他的。就是把不是最大的抑制掉,非最大抑制。。。
具体做法:
首先去除自信度pc太小的不合格的只留下pc>0.6的bounding box。
然后选出最大的那个自信度。
然后抑制与这个bounding box有着较高iou的其他bounding box
图片说明

Anchor boxes

到目前为止每一个格子都只是检测了一个物品,
因为对于每一个格子都是只输出一个y向量=[pc,x,y,wx,wy,c1,c2,c3],只能预测一个物品。
如果向让一个格子检测出多个物品,可以使用Anchor box。
具体做法:
首先先定义一些anchor box的形状。
让后分别使用这些anchor box去做对应的预测输出。
其实就是y的输出数据不够,限制了一个格子对多个物品的输出。
所以就增加输出的y向量的数据,y=[pc1,x1,y1,wx1,wy1,c11,c12,c13,pc2,x2,y2,wx2,wy2,c21,c22,c23]
然后一个格子不就可以输出两个物品了嘛。
图片说明
图片说明
这种方法自然也没有解决根本问题,就是如何处理被分配到了同一个格子的物品。
因为即使用anchor box做了细分,也有可能遇到多个物品被分到同一个anchor box的情况。
但效果应该好了许多。

Yolo algorithm

首先设定训练数据:
分类三类物品:
pedestrian car motorcycle
假设使用两个anchor box
那么我们一个格子的y为:
y=[pc1,x1,y1,wx1,wy1,c11,c12,c13,pc2,x2,y2,wx2,wy2,c21,c22,c23]
假设我们划分的格子是33=9个
那么最终的输出是y = 3
3*18

图片说明

然后把输出结果使用非最大抑制处理一下
图片说明

Region proposal 候选区域

R-CNN 带区域的卷积网络
试图选择出一些运行卷积运算是有意义的区域
而不是像滑动窗口那样把整个图片扫描一遍
选出候选区域的方式:
运行图像分割算法 segmentation algorithm
就是把原图像分成一些大的色块,然后在这些分割出来的色块上运行卷积运算。
但是还是比较慢,fast-rcnn是rcnn的升级,还有一个faster-rcnn。但还是yolo比较快

One-Shot learning

对于人脸识别来说,我们常常只有少量的样本来进行训练,并且需要分类的物品还会不断增加,那么之前的y的结构就一直需要不断变化(增长)。每次都需要重新训练,这是不符合要求的。

为了解决这个问题,我们需要学习一个相似度。
learning similarity function
图片说明

Siamese Network

Siamese Network用来实现上述的d函数
将图像通过卷积神经网络,输出一个128维的向量,最为这个人的编码。
如果表示的是同一个人,那么希望输出的128维的向量距离很近。
如果不是同一个人,希望输出的向量距离相差较远。

图片说明

Triple loss 用于作为Siamese Network的损失函数

Triple意味着三张图片,
一张anchor image 原图片
一张positiveimage 同一个人的另一张照片,
一张negative image 其他人的一张照片。
我们希望:
图片说明
加一个a是为了让网络能够加大二者之间的区别。以更好的区分不同的人。
triple loss function如下所示:
当||fa-fp||+a<||fa-fn||时我们就认为训练合格了,可以不再做出调整。
否则进行调整,知道距离满足要求。
图片说明

人脸识别与二分类问题

也可以把两个图像的编码作为输入,构造一个二分类问题。
图片说明

neural style transfer

风格转换
图片说明

卷积神经网络的每一层都学到了什么

浅层网络只是学习了一些边缘特征,深层的即是类别特征。

图片说明
图片说明

风格转换的代价函数

方法是寻找一个可以评价两张图片差异的函数J
设原图像为C 风格图像为S 生成的图像为G
那么我们需要最小化 aJc(C,G)+bJs(S,G)
从而使得新生成的画即有原图像的样子,又有风格图像的风格。
可见Jc去学习内容,Js去学习风格,那么这两个代价函数是不一样的。

图片说明

内容代价函数Jc

由上面神经网络学习了什么,可知,在神经网络的浅层只是学到了一些低级的特征,深层是学到了很具体的特征。
那么我们需要对比两张图片的内容是否相似,我们可以取神经网络中间层的输出结果来做对比。
假设我们取的是第L层的结果al
那么Jc=(||al(C)-al(G)||^2)/2
这样定义内容代价函数,就可以保证生成的图像G拥有和C相似的内容了。
图片说明

风格代价函数Js

所谓风格可以理解为不同特征之间的搭配。
比如风格图像中,蓝色的天空颜色是蓝色这个特征,和天上有漩涡的形状这个特征,还有漩涡是白色的这个特征
可知蓝色与漩涡一般不在一起,而漩涡和白色常常在一起。那么这种特征之间的关联特征即组成了图像的风格特征。

图片说明

设al(i,j,k)是卷积层第l层的第i,j,k这个位置,
卷积层第l层是个长方体,我们设这个长方体高H,宽W,有nc个信道(深)。
i表示高度为i,j表示宽度为j,k表示深度为k。
al(i,j,k)表示i,j,k这个地方的数值(特征值)
可知我们这个卷积层一共有nc个通道,即nc个卷积核的结果。
那么一共有nc个特征图像,每个特征图像都是H*W大小的。
简单的计算两个特征k和k'之间的距离Gkk'[l][s]。
Gkk'[l][s]=两个信道图像的乘积。
假如在同一个地方数值都大,那么结果就大。
在同一个地方数值都小,那么结果数值就小。
这个结果矩阵也叫做特征矩阵。

最后对比Gs和Gg,即风格图像的特征矩阵和生成的图像的特征矩阵。
如果这两个矩阵距离较小,那么就表面二者图像特征的关联方式很相似。
比如说在有漩涡的地方都是白色。
这样就学习到了特征。

图片说明

二维图像的学习方法向一维和三维的推广

向一维转换如下
图片说明
向三维转换与之前很相似。
但是扩充了思路,我们可以电影中的一段时间的图片拿出来堆叠成一个方块。
然后使用3Dfilter做人物的动作识别。
图片说明