1、在计算机视觉领域中,数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。
2、卷积核的大小一般是奇数,这样的话它是按照中间的像素点中心对称的,所以卷积核一般都是3×3,5×5或者7×7。有中心了,也有了半径的称呼,例如5×5大小的核的半径就是2。卷积核所有的元素之和一般要等于1,这是为了原始图像的能量(亮度)守恒。其实也有卷积核元素相加不为1的情况。如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0(小于0时)或255(大于255时)即可。对于负数,也可以取绝对值。
3、多通道例如输入一张三通道的图片,这时有多个卷积核进行卷积,并且每个卷积核都有三通道,分别对这张输入图片的三通道进行卷积操作。每个卷积核,分别输出三个通道,这三个通道进行求和,得到一个featuremap,有多少个卷积核,就有多少个featuremap。
4、特征图的数量 = 卷积核的数量,用一个三通道的卷积核与RGB图像做运算,得到一个H×M大小的特征图矩阵,同理,用2个三通道的卷积核与RGB图像做运算,得到H×M×2大小的特征图(增加成三维的了),用k个三通道的卷积核与RGB图像做运算,得到H×M×k大小的特征图矩阵(但还是看做三维)。
5、选择尽可能少的子特征,模型的效果不会显著下降,并且结果的类别分布尽可能的接近真实的类别分布。
二、探究不同卷积核的作用,研究背后的原理。1、什么都不做:原图:
[[0,0,0]
[0,1,0]
[0,0,0]] 得到的图像和原图是一样的,因为只有中心的值是1,邻域点的权值都是0,对滤波后的取值没有任何影响。
2、图像锐利:如果核的中心值是负数,就是在强调边缘,在锐化边缘
三、编程实现:- 经典卷积核,实现灰度图的边缘检测、锐化、模糊。
import numpy as np import torch from torch import nn from torch.autograd import Variable import torch.nn.functional as F from PIL import Image import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 #有中文出现的情况,需要u'内容 file_path = 'C:\Users\响指\Desktop\课程设计\winxp.webp' im = Image.open(file_path).convert('L') # 读入一张灰度图的图片 im = np.array(im, dtype='float32') # 将其转换为一个矩阵 print(im.shape[0], im.shape[1]) plt.imshow(im.astype('uint8'), cmap='gray') # 可视化图片 plt.title('原图') plt.show() im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1]))) conv1 = nn.Conv2d(1, 1, 3, bias=False) # 定义卷积 sobel_kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], dtype='float32') # 定义轮廓检测算子 sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3)) # 适配卷积的输入输出 conv1.weight.data = torch.from_numpy(sobel_kernel) # 给卷积的 kernel 赋值 edge1 = conv1(Variable(im)) # 作用在图片上 x = edge1.data.squeeze().numpy() print(x.shape) # 输出大小 plt.imshow(x, cmap='gray') plt.show()
锐化:
边缘检测:
模糊:
2、调整经典卷积核参数,测试并总结。
浮雕:
3、探索更多类型卷积核
三维卷积(3D Convolution)
卷积有三个维度(高度、宽度、通道),沿着输入图像的3个方向进行滑动,最后输出三维的结果,如下图:
1x1卷积(1 x 1 Convolution)
当卷积核尺寸为1x1时的卷积,也即卷积核变成只有一个数字。如下图:
反卷积(转置卷积)(Deconvolution / Transposed Convolution)
卷积是对输入图像提取出特征(可能尺寸会变小),而所谓的“反卷积”便是进行相反的操作。但这里说是“反卷积”并不严谨,因为并不会完全还原到跟输入图像一样,一般是还原后的尺寸与输入图像一致,主要用于向上采样。从数学计算上看,“反卷积”相当于是将卷积核转换为稀疏矩阵后进行转置计算,因此,也被称为“转置卷积”
如下图,在2x2的输入图像上应用步长为1、边界全0填充的3x3卷积核,进行转置卷积(反卷积)计算,向上采样后输出的图像大小为4x4
5、尝试彩色图片边缘检测
【总结】本次课程的收获,编程实践的心得体会。通过学习卷积相关知识,了解不同卷积核对图片的不同的处理及相关原理。对机器学习的兴趣加深了很多。



