文章目录
一、卷积神经网络
1.计算机视觉
计算机视觉的任务是图像分类,目标检测,神经网络转换。所谓的神经网络转换是指将一张图片以另一种风格呈现出来:
处理机器视觉有一个特点,那就是输入层的维度很大,可以达到300万甚至更大,这使得神经网络的结构很复杂,且因为训练数据相对不足导致过/欠拟合,也因此造成所需内存及计算量增大。
2.边缘检测
最常见的图片边缘检测有两类,分别是水平和垂直边缘检测。图片的边缘检测可以用过滤波器进行卷积来实现。下图就是通过卷积得到的图片。
假设有一个
6
×
6
×
1
6\times 6\times 1
6×6×1的灰度图片,以垂直检测为例,要使用右边的滤波器(卷积核)矩阵,这个矩阵尺寸为
3
×
3
3\times 3
3×3,.得出来的矩阵就是
(
6
−
3
+
1
)
×
(
6
−
3
+
1
)
=
4
×
4
(6-3+1)\times(6-3+1)=4\times 4
(6−3+1)×(6−3+1)=4×4的。具体的卷积方法如下,另外,这个方法其实是相关系数的计算方法,真正的卷积方法需要将过滤器矩阵180度旋转,但使用相关系数不仅可以提高计算速度,且过滤矩阵经由梯度下降法得到,这相当于包含了旋转操作:
以第一格为例,其结果就是
3
∗
1
+
0
∗
0
+
1
∗
−
1
+
1
∗
1
+
5
∗
0
+
8
∗
−
1
+
2
∗
1
+
7
∗
0
+
2
∗
−
1
3*1+0*0+1*-1+1*1+5*0+8*-1+2*1+7*0+2*-1
3∗1+0∗0+1∗−1+1∗1+5∗0+8∗−1+2∗1+7∗0+2∗−1,就是将卷积核的左上角对准位置的所有占格的积之核。
典型的垂直检测例子:
图片边缘只有两种情况:由明到暗或者由暗到明,这两种情况所得到的矩阵取绝对值可以获得以个相同的值(如果只是明暗完全替换)
水平滤波器矩阵:
除此之外,还有其他的滤波器如sobel滤波器,scharr滤波器。事实上,想检测各种边缘特征就需要自行建立滤波器,其中的数值通过梯度下降法获得。有了合适的滤波器,CNN浅层网络就相当于实现了变匀检测。
3.padding
由上图可知使用图片卷积时会造成图片尺寸缩小,此外,处于图片边缘的像素在卷积过程中极少用到,这使得边缘像素对卷积输出的影响不大,相当于一定程度地丢失了边缘像素的信息。
解决这个问题可以用padding的方法,即把原始图片进行扩展补0。假设扩展层数为p,原始图片尺寸为
n
×
n
n\times n
n×n,滤波器的尺寸为
f
×
f
f\times f
f×f,则应满足
p
=
f
−
1
2
p=\frac{f-1}{2}
p=2f−1才能保证图片的尺寸不变。这种操作称为“same convolutions”。
4.stride
stride就是过滤器在原图片种每次卷积操作的行进步长,默认为1,改变步长可以改变输出图片的尺寸。假设步长为s,则输出图片的尺寸为
5.CNN神经网络的原理
对于RGB图片来说,图片是
6
×
6
×
3
6\times 6\times 3
6×6×3,其中最后一个维度称为通道,实际上图片就是将三个通道的数字相加得到像素值的,卷积操作也是将需要卷积的通道卷积后再合并。事实上并不是每一个通道都需要卷积操作的,可以只对一个通道取水平边缘检测其他通道卷积核矩阵参数置0。也可以对不同的层使用不同的滤波器。
一个实例单层卷积神经网络如上图所示,最后将两个卷积得出的矩阵拼起来作为下一层的输入。可以看到,滤波器在其中起到的作用类似于参数w,卷积运算就是原来的乘积运算,其他与神经网络一致。
标记符号总结,其中样本数为m:
以一个简单的CNN网络为例,这个图片是一张
39
×
39
×
3
39\times 39\times 3
39×39×3的图片,在第一层有十个过滤器,每一个都是
3
×
3
3\times 3
3×3,步长为1padding为0,最后会得到第二层
37
×
37
×
10
37\times 37\times 10
37×37×10,10个滤波器得到了10个不同的平面。一直迭代到
a
[
3
]
a^{[3]}
a[3],就是
7
×
7
×
40
7\times 7\times 40
7×7×40,将这些色素排列成一行,就是
1960
×
1
1960\times 1
1960×1,然后连接一个激活判断函数决定输出。一般来说
n
H
n_H
nH和
n
W
n_W
nW逐渐减小而
n
c
n_c
nc逐渐增大。
CNN除了卷积层(convolution)神经网络之外,还有池化层神经网络(pooling)及对全连接层(Fully connected)。其中,池化层的做法比卷积层要简单许多,因为这种做法得到的二维层是由滤波器在其滑动区域内取最大值得来的,或者计算滑动区域的平均值得来的。
对比标准神经网络,CNN的优势是参数数目要少很多,这是因为滤波器对图片的多个区域有用,且因为滤波器的影响,输入图片的每个区域对于输出的影响不同。
2.深度卷积模型案例研究
本章介绍典型的CNN案例。典型的CNN模型有LeNet-5,AlexNet和VGG模型等。
1.传统神经网络
首先是LeNet-5模型。典型的LeNet-5模型样例如图所示
其中层机构是CONV layer->POOL layer->CONV layer->POOL layer->FC layer->FC layer->y。这格模型大约包含6万个参数。虽然图中现实的池化层采用的是avg pool,但实际上可以根据需要使用max pool。
然后是AlexNet模型,典型样例如图所示:
这个模型与LeNet-5模型结构类似,但要更复杂一些,包含约6千万个参数。
VGG-16模型的结构如图所示,这个模型共包含约1亿三千万个参数,具体设置:
2.残差网络
为了解决梯度爆炸和梯度消失问题,我们可以考虑跳远连接,一层网络获得激活后跳至下一层或更深层,隔层相连,将弱化每层之间的联系。这种网络就叫做残差网络。
残差网络由许多残差块组成,单个残差块如图所示,其中,
a
[
l
]
a^{[l]}
a[l]的输入可以跳到
a
[
l
+
1
]
a^{[l+1]}
a[l+1]后面的输入层。
建立隔层链接后,具体的迭代式如下,可以看到,在
l
+
2
l+2
l+2层的激活函数输入多出一个
a
[
l
]
a^{[l]}
a[l]。
多个残差块组成的神经网络就是残差网络,这种模型结构对于层数很多的神经网络效果很好,对比普通神经网络,其实际性能不会偏离理论性能。
假设当经过一个大规模神经网络训练后,发生了梯度消失,参数w和b约为0,取ReLU函数作为激活函数,输出值
a
[
l
]
a^{[l]}
a[l],对于
a
[
l
+
2
]
a^{[l+2]}
a[l+2]来说,有
a
[
l
+
2
]
=
g
(
z
[
l
+
2
]
+
a
[
l
]
)
=
a
[
l
]
a^{[l+2]}=g(z^{[l+2]}+a^{[l]})=a^{[l]}
a[l+2]=g(z[l+2]+a[l])=a[l],就相当于忽略了中间的两层神经元,这样做的好处是因为对于一个大规模神经网络来说,选择好的参数是身份困难的,忽略这部分神经网络可以稳定神经网络的性能。
不过有时
a
[
l
]
a^{[l]}
a[l]与
a
[
l
+
2
]
a^{[l+2]}
a[l+2]的维度不同,通常通过引入训练了参数的矩阵
W
s
W_s
Ws来卷积
a
[
l
]
a^{[l]}
a[l]
残差网络的结构,与普通神经网络相比多出了许多跳远线。
3.网络中的网络
网络中的网络指只用
1
×
1
1\times 1
1×1的卷积过滤器,某矩阵与过滤器卷积都会得到原矩阵。将这种过滤器用于卷积神经网络中,就相当于将卷积神经网络转化为全连接神经网络,比如说对于一个6632的图片,采用这种过滤器处理后的矩阵每一格都相当于原图对应每个通道中定位的像素通过神经网络处理后得出的结果。如果过滤器不止一个,则有n个过滤器,经过处理的神经网络就有n层。
这种过滤器可以用来调整通道数。
4.inception网络
inception网络中对于单层的神经网络可以使用不同尺寸的过滤器,也就是说,这个网络得到的输出由多个不同过滤器得到的输出堆叠起来,这样做的好处是不需要选择合适的过滤器,只需要训练参数即可选择效果最好的模块。在堆叠过程中要注意将不同过滤器得到的输出转化为相同的长和宽。
但这样明显会大幅度增加计算量,这就需要
1
×
1
1\times 1
1×1卷积过滤器减少通道达到降低计算量的目的。引入这个卷积过滤器后,一个模块的工作流程如下:
多个模块组成整个神经网络,其中的一些隐藏层可以作为输出点以防止过拟合。
5.数据扩充
常见的数据扩充方法是对原数据进行镜像,随机截取部分以及颜色转换(改变RGB数值)。
不同的神经网络所需要的数据量是不同的物体检测,图像识别,语音识别所需要的数据量依次增加,如果数据量不够就需要手工工程,比如上述扩充方法
除此之外,还有一些办法提高结果性能,比如训练多个模型求平均值,或者在多个相似的测试版本上运行得出最好的结果,但这两种方法成本较大,一般不用于实际开发。
3.目标检测
1.对象定位
假设对一幅图片进行softmax分类,分类分别是行人,汽车,摩托车和背景四类,分别对应向量{1,0,0,0}至{0,0,0,1}。当然,也有可能是概率输出。
实际上对于对象定位问题,除了包含上述前三项之外,还包含了五个个位置坐标,其中(bx,by)表示中心点,bh代表高,bw代表宽,pc代表这个区域是目标的概率,如果pc为0,则代表没有检测到目标,其他参数可以忽略。一般设定最上角为(0,0),右下角为(1,1)。
对于有没有检测到目标,其代价函数也是不同的,使用平方误差形式:
2.特征点检测
除了使用矩形框进行目标检测外,也可以使用特征点进行定位。
比如说上图的人脸上的64个特征点用于判断是否是人脸或者表情分类。特征点也可用于检测人体姿势。
3.对象检测
对象检测的流程是先根据样本建立神经网络,然后利用滑动窗算法,这个算法的流程是选择一个大小合适的窗口,从左到右,从上到下滑动截图,每个窗口截到的图片送到神经网络去进行识别判断。
滑动窗算法的原理简单,但缺点也明显,首先是滑动窗大小和步长需要认为设定,其次是效率相对低下。
滑动窗算法可以利用卷积方式实现加,简单地说就是用
1
×
1
1\times 1
1×1矩阵,将第四步的400个神经元当成
1
×
1
×
400
1\times 1\times 400
1×1×400的卷积层处理,经过过滤器变成
1
×
1
×
4
1\times 1\times 4
1×1×4的卷积层。这个卷积层与softmax的输出相似。
假设我们使用
14
×
14
×
3
14\times 14\times 3
14×14×3的图片训练模型,当我们用
16
×
16
×
3
16\times 16\times 3
16×16×3图片检测时,若步长为2,则最后得到的输出层有4个结果。窗口的速度与池化层大小有关,步长为n则池化层大小为
n
×
n
n\times n
n×n。
4.YOLO算法与交并比
YOLO算法可以用来解决如图中的不能完全涵盖目标的情况,这种算法可以生成更准确的目标区域。
首先将原始图片分割成
n
×
n
n\times n
n×n的网络格,比如说
3
×
3
3\times 3
3×3网络(网格越小越好),这些输入经过特定的卷积网络后得到输出为
3
×
3
×
8
3\times 3\times 8
3×3×8的向量,这个向量同前文所述向量一致,如下:
其中Pc用于判断目标的中心是否在网格中,另外,整幅图片被归一化为每个网格的长和宽以1为单位,但bh,bw可以大于1,因为目标图片可以超网格限制。
YOLO算法的好处是可以清楚知道在哪一个格子里含有对象,这在反向传播的过程中可以增加训练速度。但这个算法要求每一个网格里最多只有一个对象吗,因此需要更小的网格。
在使用YOLO算法时,可能会出现多个网格空间判断中心点在其内的情况,这时需要非最大值抑制法。这个方法需要用到交并比。
交并比(IoU)是一种用来评价目标检测的准确性的算法。
I
o
U
=
I
U
IoU=\frac{I}{U}
IoU=UI,其中I是两幅图片的并集,U是准确的图片所在框(图中的红框)。我们一般设置0.5为阈值来规范定位算法的准确度。
非最大值抑制法的流程是现在所有网格上进行对象检测网络,得出了部分pc>1的的网格,选取pc值最大且有一定距离的几个网格,计算所有其他pc>1的网格与它们的IoU值,若IoU>0.5,则相当于是相似部分网格,这些网格将不选中为网格。最后去掉所有不被选中的网格,剩下的网格就是所需的网格。
如上图,如果遇到多个对象重叠的情况,就需要用到Anchor Boxes,上图就有两个boxes,因此,输出向量的数量就要翻一倍,以容纳两个对象的信息。注意Anchor Boxes的形状需要人工选择,对每个Anchor Boxes可以使用最大值抑制。
总结,YOLO算法的计算过程:先对于每个网格调用图像预测网络,获取多个预测的边界框,排除低pc的预测,对于每个类别(行人、汽车、摩托车)分别使用非最大值抑制生成最终预测。
4.RPN网络
滑动算法因为要遍历图片的每个角落,会大幅度增加训练时间,可以使用Region Proposals的方法。这个方法会先用图像分割算法,找出可能存在对象的色块,将这些色块放进分类器。Region Proposals的方法一直在研究进步:R-CNN: 滑动窗的形式,一次只对单个区域块进行目标检测,运算速度慢。Fast R-CNN: 利用卷积实现滑动窗算法。Faster R-CNN: 利用卷积对图片进行分割。不过即使是Faster R-CNN算法还是没有YOLO算法快。
4.人脸识别和神经网络迁移
人脸验证与人脸识别是有差别的,人脸验证是指验证一张图片中的人脸与模板是否是同一个人,人脸识别是指验证一张图片中的人脸是不是多个模板中的一个。
1.one-shot学习
one-shot的意思是每个人都只有一张图片作为训练数据,训练一个有n个分类的CNN模型,很明显,这样的模型性能不会太好,且一旦有新人加入就要重组神经网络。
我们可以使用相似函数,这个函数用
d
(
i
m
g
1
,
i
m
g
2
)
d(img1,img2)
d(img1,img2)表示,若
d
(
i
m
g
1
,
i
m
g
2
)
<
τ
d(img1,img2)<\tau
d(img1,img2)<τ(
τ
\tau
τ 是一个超参数),则认为两张图相似,是同一个人。
2.siamese 网络
一张图片通过CNN网络得到全连接层的输入,这个输入可以看成是图片的原始关键特征,前面这个网络结构就叫做siamese 网络。我们可以利用两张图片的原始关键特征来计算相似度,假设这两个特征向量为 x 1 , x 2 x^1,x^2 x1,x2,则可以用这两个向量的范数来表示相似度: d ( x 1 , x 2 ) = ∣ ∣ f ( x 1 ) − f ( x 2 ) ∣ ∣ 2 d(x^1,x^2)=\mid\mid f(x^1)-f(x^2)\mid \mid^2 d(x1,x2)=∣∣f(x1)−f(x2)∣∣2。如果是用一个人,则这个范数值会很小。
3.tirplet损失
tirplet损失是一种损失函数,这种损失函数需要靶目标(anchor),正例(postive)和反例(negative)。由上节可知我们需要
∣
∣
f
(
A
)
−
f
(
P
)
∣
∣
2
\mid\mid f(A)-f(P)\mid \mid^2
∣∣f(A)−f(P)∣∣2尽可能地小而
∣
∣
f
(
A
)
−
f
(
N
)
∣
∣
2
\mid\mid f(A)-f(N)\mid \mid^2
∣∣f(A)−f(N)∣∣2尽可能大,根据这个数学性质,我们定义:
其中
α
\alpha
α是超参数margin,用于防止出现三个例子都为0的情况。
显然,要用梯度下降方法训练这个模型需要每个人不止一张照片,一般是10张左右才能满足要求。此外,A、P、N的选取不适宜用随机选取,因为这样容易导致d(A,P)大而D(A,N)小,这样难以让模型抓住关键区别。应当人为地选择d(A,P)较小而D(A,N)较大得图片组。选图实例:
4.面部验证和二分类
除了利用siamese网络计算代价函数解决问题外,还可以将两个原始特征向量合在一起经过神经网络进行分类。
因为siamese网络的结构和参数是保持不变的,这就相当于一个二分类问题。其输出函数是:
或者是
这个式子利用了
χ
\chi
χ分布的算法,叫
χ
\chi
χ方公式。
需要注意的是,在实际的测试中可以考虑将每个模板的原始特征向量保存下来,代替图片储存,这样可以节省储存空间以及增加训练速度。
4.神经网络学习内容
神经网络逐层都干了些什么?通过检查该层激活函数输出最大的图像获得信息。首先是第一层,这一层检测到的是图像的边缘等简单信息。随着神经网络的迭代,获得的图片特征越来越复杂,涉及的区域也越来越大:
5.神经网络转移
神经风格迁移就是将一幅图片的风格迁移到另一幅图片中,如图:
我们用C代表内容图片,S代表风格图片,G代表生成图片。其代价函数是:
其中
α
\alpha
α和
β
\beta
β是超参数,用来调整权重。神经风格迁移的流程是首先随机初始化一幅图,再使用梯度下降方法令这幅图的像素点值改变以降低代价函数值,最后得出结果。这两个代价函数的计算公式如下:
首先是内容代价函数。上文可以知道,随着CNN层数增加,原始图片提取的特征由简单到复杂,如果在计算相似度函数的siamese网络结构层数太小,则图片G和C在像素上会很接近,迁移效果太弱。如果层数太大,则会出现迁移效果太强,使G上出现了C中的物体。因此层数不能太多也不能太小。
我们可以通过比较G和C在某一层的激活函数值来比较两图的相似度,通过相似度选择l层数。设激活函数值为
a
[
l
]
(
C
)
a^{[l](C)}
a[l](C)和
a
[
l
]
(
G
)
a^{[l](G)}
a[l](G),则代价函数为:
然后是风格代价函数。这里将图片的风格定义为第l层激活项的相关系数。这么定义的理由是,对于第l层隐藏层,这层的两个通道之间的相关系数代表着原始图片有没有同时包含这两个特征(隐藏层的通道提取原始图片的特征),如果通道A和通道B相关性不高,则意味着原始图片有A的地方没有B。这就反映了图片的风格。
定义风格矩阵:
这是一种不标准的相关函数计算法。其中,i代表隐藏层的高度,j代表宽度,这个式子的含义就是计算不同通道对应激活函数积的和。若两个通道的相似度高,则
G
k
k
′
[
l
]
G^{[l]}_{kk'}
Gkk′[l]会比较大。
G
k
k
′
[
l
]
(
S
)
G^{[l](S)}_{kk'}
Gkk′[l](S)代表图片S第l层的风格,
G
k
k
′
[
l
]
(
G
)
G^{[l](G)}_{kk'}
Gkk′[l](G)同理,用定义可以给出代价函数:
此外,还可以添加更多隐藏层的风格,方法是使代价函数为多层激活函数输出差的和,其中
λ
\lambda
λ为权重:
6.从一维到三维推广
一维卷积是两个函数间的卷积,函数有连续和离散两种,不在叙述。
三维的卷积,这里介绍的卷积方法与二维是一致的,将过滤器对准卷积所得像素,计算所有过滤器与原三维立体像素点的乘积的和。比如说一个
14
×
14
×
14
×
1
14\times 14\times 14\times 1
14×14×14×1的图片,用16个
5
×
5
×
5
×
1
5\times 5\times 5\times 1
5×5×5×1的过滤器卷积,输出
10
×
10
×
10
×
16
10\times 10\times 10\times 16
10×10×10×16的图,规则与2D是一样的。