计算机视觉
计算机视觉可以应用到许多问题中,比如图片分类器,物体检测,图片风格转化。目前计算机视觉发展得非常迅速,这些问题都能够得以解决。
以前使用神经网络对图像进行分类,使用的图像都比较小,比如64*64*3,特征向量长度有12288,这个特征向量已经很大了。我们更希望能对大的图像进行分类,但是图像大小是1000*1000*3,特征向量长3000000,对应的神经网络就非常大,这就很容易出现过拟合现象。幸运的是,卷积神经网络可以解决这一问题。
边缘检测
图像边缘是指图像中明暗变化的区域。
上图右侧明亮的地方表示原图的边缘,分别是垂直边缘和水平边缘。
边缘检测的方法是对图像进行卷积操作,图像与一个过滤器(或者称为核)进行卷积,得到新的矩阵表示图像的边缘检测结果。
上图是卷积操作的其中一步,中间的“*”表示卷积操作,左边的矩阵表示图像(灰度图),中间的矩阵是过滤器。把过滤器移动到图像上作为掩膜,计算卷积值,3×1+1×1+2×1+0×0+5×0+7×0+1×−1+8×−1+2×−1=−53×1+1×1+2×1+0×0+5×0+7×0+1×−1+8×−1+2×−1=−5,-5就是这个区域的值。接着移动过滤器
计算新区域的卷积值为-4。计算完第一行后,向下移动过滤器,继续计算第二行
最后得到的结果是
来看一个特殊的例子,
上图下方的方块可以直观地表现出图像的边缘部分。原图中间部分是黑白的分界线,进行垂直边缘检测后,得到的结果中间是白色,两边是灰色,说明原图中间部分是边缘。
把过滤器垂直翻转,重新进行卷积运算,得到的结果是
结果的中间黑色的部分才表示原图的边缘。所以一般把卷积的结果再取绝对值。
水平边缘检测和垂直边缘检测一样,只是过滤器不一样。水平边缘检测的过滤器是在水平方向上取值,比如
水平边缘检测例子:
过滤器有许多种,有Sobel过滤器、Scharr过滤器等。
过滤器的参数不同,可以实现不同的过滤器,实现不同的边缘检测,比如45°、70°边缘检测。
编程语言实现的卷积操作函数有许多,在python中是conv_forward,在tensorflow中是tf.nn.conv2d,在keras中是Conv2D。
Padding
上述所说的卷积操作会缩小图片的大小,本来是6××6的图片,卷积之后变成4××4的图片。缩小图片会丢掉图片边界的边缘信息。而且,深度网络通常有100多层,图片每经过一层,便会缩小,最后得到一幅非常小的图片,这不符合实际需求。我们可以使用Padding来使得卷积后图片不变小。
Padding就是在卷积之前扩大原来的图片
扩大6××6的图片1个像素,然后使用3××3的过滤器进行卷积,最后得到与原图一样大小的6××6的图片。可以使用0来填充添加的像素。
假设原图大小为n××n,过滤器大小为f××f,卷积后的图片大小为(n−f+1)×(n−f+1)(n−f+1)×(n−f+1)。设原图Padding后四周添加p个像素,原图变为(n+2p)×(n+2p)(n+2p)×(n+2p)则Padding卷积的图片大小为(n+2p−f+1)×(n+2p−f+1)(n+2p−f+1)×(n+2p−f+1)。为了保证卷积后的图片与原图一样大,则2p−f+1=02p−f+1=0,p