计算机视觉(CV)
Computer Vision是深度学习应用的主要方向之一。
C
V
问
题
{
图
像
分
类
(
I
m
a
g
e
C
l
a
s
s
i
f
i
c
a
t
i
o
n
)
目
标
检
测
(
O
b
j
e
c
t
D
e
t
e
c
t
i
o
n
)
神
经
风
格
转
换
(
N
e
u
r
a
l
S
t
y
l
e
T
r
a
n
s
f
e
r
)
CV问题\left\{ \begin{aligned} &图像分类(Image Classification)& \\ &目标检测 (Object Detection)& \\ &神经风格转换 (Neural Style Transfer) \\ \end{aligned} \right.
CV问题⎩⎪⎨⎪⎧图像分类(ImageClassification)目标检测(ObjectDetection)神经风格转换(NeuralStyleTransfer)使用传统神经网络处理机器视觉的一个主要问题是输入层维度很大。这会造成两个后果,一是神经网络结构复杂,数据量相对不够,容易出现过拟合;二是所需内存、计算量较大。解决这一问题的方法就是使用卷积神经网络(CNN)。
边缘检测
对于计算机视觉,神经网络由浅层到深层,分别可以检测出图片的边缘特征 、局部特征(例如眼睛、鼻子等)、整体面部轮廓。
最常检测的图片边缘有两类:一是垂直边缘(vertical edges),二是水平边缘(horizontal edges)。
*表示卷积操作。python中,卷积用conv_forward()表示;tensorflow中,卷积用tf.nn.conv2d()表示;keras中,卷积用Conv2D()表示。
垂直边缘检测和水平边缘检测的滤波器算子如下所示:
还有其它常用的滤波器(filters),例如Sobel filter和Scharr filter。这两种滤波器的特点是增加图片中心区域的权重。
在深度学习中,想检测图片的各种边缘特征,而不仅限于垂直边缘和水平边缘,滤波器的数值一般需要通过模型训练得到,类似于标准神经网络中的权重W一样由梯度下降算法反复迭代求得。CNN的主要目的就是计算出这些滤波器的数值。确定得到了这些滤波器算子后,CNN浅层网络也就实现了对图片所有边缘特征的检测。
Padding
如果原始图片尺寸为n x n,滤波器尺寸为f x f,则卷积后的图片尺寸为(n-f+1) x (n-f+1),这样会带来两个问题: 1.卷积运算后,输出图片尺寸缩小 2.原始图片边缘信息对输出贡献得少,输出图片丢失边缘信息为此,可以使用padding方法,即把原始图片尺寸进行扩展,扩展区域补零,用p来表示每个方向扩展的宽度。若要保证卷积前后图片尺寸不变,则p应满足:
p
=
f
−
1
2
p= \frac{f-1}{2}
p=2f−1没有padding操作,
p
=
0
p=0
p=0,我们称之为“有效卷积(Valid convolutions)”;有padding操作,
p
=
f
−
1
2
p= \frac{f-1}{2}
p=2f−1,我们称之为“相同卷积(Same convolutions)”。
卷积步长
步长表示滤波器在原图片中水平方向和垂直方向每次的步进长度。相关系数(cross-correlations)与卷积(convolutions)之间是有区别的。实际上,真正的卷积运算会先将filter绕其中心旋转180度,然后再将旋转后的filter在原始图片上进行滑动计算。而相关系数的计算过程则不会旋转。目前为止我们介绍的CNN卷积实际上计算的是相关系数,而不是数学意义上的卷积。
单层卷积网络
卷积神经网络的单层结构如下所示:
相比之前的卷积过程,CNN的单层结构多了激活函数ReLU和偏移量b。 每个滤波器组有3x3x3=27个参数,还有1个偏移量b,则每个滤波器组有27+1=28个参数,两个滤波器组总共包含28x2=56个参数。 选定滤波器组后,参数数目与输入图片尺寸无关所以,就不存在由于图片尺寸过大,造成参数过多的情况。例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由滤波器组决定,数目相对来说要少得多,这是CNN的优势之一。
简单卷积网络示例
一个简单的CNN网络模型: CNN有三种类型的layer:
{
卷
积
层
(
C
O
N
V
)
池
化
层
(
P
O
O
L
)
全
连
接
层
(
F
C
)
\left\{ \begin{aligned} &卷积层(CONV)& \\ &池化层(POOL)& \\ &全连接层(FC) \\ \end{aligned} \right.
⎩⎪⎨⎪⎧卷积层(CONV)池化层(POOL)全连接层(FC)
池化层
池化层(Pooling layers)是CNN中用来减小尺寸,提高运算速度的。只保留区域内的最大值(特征),减小noise影响,让各特征更具有健壮性。Pooling layers的做法比convolution layers简单许多,没有卷积运算,仅仅是在滤波器算子滑动区域内取最大值,即max pooling。 注意 超参数p很少在pooling layers中使用。
为什么使用卷积
相比标准神经网络,CNN的优势之一就是参数数目要少得多。参数数目少的原因有两个:
参数共享:一个特征检测器(例如垂直边缘检测)对图片某块区域有用,同时也可能作用在图片其它区域。
连接的稀疏性:因为滤波器算子尺寸限制,每一层的每个输出只与输入部分区域内有关。
除此之外,由于CNN参数数目较小,所需的训练样本就相对较少,从而一定程度上不容易发生过拟合现象。而且,CNN比较擅长捕捉区域位置偏移。也就是说CNN进行物体检测时,不太受物体所处图片位置的影响,增加检测的准确性和系统的健壮性。