视频链接:https://www.bilibili.com/video/BV1F4411y7o7?from=search&seid=3587805958032707341.
1 计算机视觉
- 分类
- 目标检测
- 我们希望神经网络能够处理大的图片,因此用到了卷积运算
2 边缘检测示例
- 卷积运算是卷积神经网络最基本的组成部分
- 使用边缘检测作为小的示例来观察卷积是如何来进行运算的:
下图中,图像的垂直边缘检测和水平边缘检测:
如何在图像中检测到这些边缘呢?例子如下:
对于一个66的灰度图像,他是一个661的矩阵,并不是663的,因为没有RGB三通道
为了检测上述图片中的垂直边缘,可以构造一个33的矩阵,在卷积网络的术语中它被称为过滤器,有些论文中它会被称为核,而不是过滤器。对这个66的图像来进行卷积运算, 表示卷积运算
这个卷积运算的输出是一个44的矩阵,可以将它看成一个44的图像
4*4的矩阵如何得到的?
先使用过滤器覆盖在原图像的左上角位置,然后对应位置相乘然后所有加起来就得到44卷积的第一个值
然后第二值是33过滤器向右移动一步,再进行对应位置相乘求和
接下来同理。对于要得到下一行的值,需要把过滤器下移,然后重复从左到右进行元素乘法然后加起来
直到最后计算完:
在编程中,不同的语言卷积操作都有相应的函数,而不是*。比如Python中是conv_forward;tensorflow中是tf.nn.conv2d
- 为什么上边的卷积可以做垂直边缘检测呢,可以看下边的例子:
66的图像可以堪称左白右黑色图片,中间的蓝色竖线可以看作是一条白到黑的过度线,当使用33的过滤器进行卷积运算之后,得到的44的图片,中间白色区域就是对应于原图中的垂直边缘线。由于66图片很小,所以检测出的边缘比较宽,图片大的话就是比较小。
3 更多边缘检测内容
- 本视频将学习如何区分正边(由亮到暗)和负边(由暗到亮),也就是边缘过渡。
其它边缘检测的例子:
水平边缘滤波器
中间的10是过滤带,是因为图片太小;如果图片特别大的时候,就不会出现这些过滤带了
事实上,对于这个3*3的滤波器来说,视频中只使用了其中的一种数字组合,但在历史上的计算机视觉的文献中,曾经也争论过怎样的数字组合才是最好的,你也可以使用下边这些:
Sobel滤波器:优点:增加了中间一行元素的权重,也就是处在图像中央的像素点,这使得结果的鲁棒性会更高一些
Scharr滤波器:它由着和之前完全不同的特性,实际上它也是一种垂直边缘检测,如果将其反转90°就能得到对应的水平边缘检测
随着深度学习的发展,当你真正想检测出一些比较复杂图片的边缘的时候,不一定使用研究者们给出的这九个数字,但是可以从这九个数字中获益匪浅,把这矩阵中的九个数字当成9个参数,并在之后可以使用反向传播算法,目标就是去理解这9个参数
4 Padding
之前学的66的图片经过33的卷积之后会变成44的图片,,因为33在66的位置覆盖只有44个
如果我们有一个n*n的图像, 用一个f*f的过滤器做卷积,会得到一个**(n-f+1)(n-f+1)**的图像。这样的话会有两个缺点:(1)输出缩小:每次做卷积操作,图像就会缩小,做了几次之后图像就会变得非常小了,你可能不想让你的图像或着特征变得非常小。(2)图像边缘位置信息丢失:角落边的像素,这个像素只被一次输出所使用,但是如果是中间的像素点的话,就会有许多ff的区域与它重叠,所以那些在角落或者边缘区域的像素点,在输出中采用较少,这意味着你丢掉了图像边缘位置的许多信息。
为了解决上述两个问题,可以在进行卷积操作之前使用Padding操作。
比如把66的图像Padding(一般用0去填充)成88的,经过33的卷积操作之后,它会变成66的图像。如果 p表示Padding,输出就变成了(n+2p-f+1)*(n+2p-f+1)。
至于填充多少个像素,通常有两个选择,分别叫Valid卷积和Same卷积
- Valid卷积:意味着不填充
- Same卷积:Pad so that output size is the same as the input size,意味着你填充之后你的输出大小和输入大小是一样的,即n+2p-f+1=n,即p=f-1/2
- 习惯上,f通常是奇数(两个原因:(1)能保证same卷积(2)过滤器有中心点,可以方便的指出它的位置)
4 卷积步长
- 卷积步长是构建神经网络中的另一基本操作
对于一个77图像,使用33卷积核来进行卷积,设置stride=2
输入和输出的维度:
nn:输入图像维度
ff:卷积核维度
p:padding
s:stride
输出图像维度:(n+2p-f)/s+1 * (n+2p-f)/s+1
如果商不是整数,那么我们进行一些向下取整,即向下取最接近的整数,这个原则的实现方式就是你只在蓝框完全包括在图像或者填充完的图像内部时,才对它进行运算,如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作。这是一个惯例,你的3*3过滤器必须完全处于图像中或者填充之后的图像区域内,才能输出相应的结果。