人工智能 作业4:CNN – 卷积

1.概念描述

卷积:卷积可以简单的理解为状态的叠加,在卷积神经网络中,卷积的作用就是将相邻的多个不同的状态输入,经过叠加后进行输出为一个状态。常用于图片的特征提取。

卷积核:卷积核在某些情况下也可以叫做滤波器,可以理解为卷积过程中的“模式”,通过改变卷积核来改变对不同状态的特征偏向,它能决定卷积的偏向和效果。

多通道:输入的一层代表一个通道,多通道即为多层输入,同时需要相同通道数的卷积核进行卷积。

特征图:图像经过卷积过程得到的结果。

特征选择:不同视觉神经细胞对边界、运动和颜色等不同信息具有 强弱不同的选择性,特征选择是指从原始特征中挑选出一组最有代表性、分类性能好的特征,可以使用不同的卷积核来进行不同偏向的特征选择。

2.不同卷积核的作用和原理

2.1锐化


首先观察两个图片


观察上面两张图,可以看到,中心点分别由234变为373,74变为14,也就是两点之间的对比度大大增强,从而达到锐化的效果。

2.2边缘检测

将当前的像素值减去前一个像素值,得到这个函数在这两个位置的差别或者斜率,相当于求导或斜率,也就突出了变化的边缘效果。

2.3模糊


模糊就是一个点和周围的点对比度变小,这个卷积核就是由周围的点和中间的点的颜色共同决定卷积后的颜色,观察这个卷积核,可以看到就是求出周围的点的加权平均,距离越近起的作用就越大,以此来达到模糊的目的。

3.编程实现

完整程序代码

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 = 'tu1.png'
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([[-1, -1, -1],
                         [-1, 8, -1],
                         [-1, -1, -1]], 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()

3.1经典卷积核,实现灰度图的边缘检测、锐化、模糊

修改卷积核的数值来实现不同的效果。

3.1.1边缘检测

sobel_kernel = np.array([[-1, -1, -1],
                         [-1, 8, -1],
                         [-1, -1, -1]], dtype='float32')  # 卷积核

3.1.2锐化

sobel_kernel = np.array([[0, -1, 0],
                         [-1, 5, -1],
                         [0, -1, 0]], dtype='float32')  # 卷积核

3.1.3高斯模糊

sobel_kernel = np.array([[0.0625, 0.125, 0.0625],
                         [0.125, 0.25, 0.125],
                         [0.0625, 0.125, 0.0625]], dtype='float32')  # 卷积核

3.2调整经典卷积核参数

以高斯模糊为例,我们将调整卷积核的参数,将中间像素点的权重调低,将周围像素点的权重调高,可以看到图像的模糊程度更加明显。
图像的卷积效果会随着卷积核的参数改变而改变,调整周围像素点的比重可以让此像素点更大程度地“融入周围环境”,也就更加模糊了。

3.3使用不同尺寸图片

使用不同尺寸的图片进行操作,可以看到当图像分辨率不同时,卷积的效果也不同。

3.4探索更多类型卷积核

3.4.1反色

在使用边缘检测卷积核调整参数时,将中间的8改为了1,误打误撞的实现了类似于反色的效果。

不得不说,这效果还是有一点惊悚的。

3.4.2浮雕

使用如下卷积核可以实现类似于浮雕的效果。

sobel_kernel = np.array([[-1, -1, 0],
                         [-1, 0, 1],
                         [0, 1, 1]], dtype='float32')  # 卷积核

3.5尝试彩色图片边缘检测

使用三通道模式进行卷积,可以将彩色图片进行边缘检测,使用之前的代码进行修改时,注意各个函数的参数的意义,比较乱。
需要注意的是,很多png格式的图片并不是只有RGB三通道,而是RGBA四通道,导致不能获得正常的结果。发现问题所在后,为了转化图片,四处查找方法,又安装opencv(cv2),这个问题前前后后困扰了我一个多小时…
直接使用jpg格式或者在程序中将图片的第四维去掉即可。
整个程序经过了无数次的修改,比较乱,就不上源代码了,可以在参考文章中找到相似功能的代码。
效果图:

4.总结

前面的过程非常顺畅,也让我对于使用不同卷积核处理图像有了一定的了解,后面的彩色图片着实是让我这个python小白花费了大量的时间,好在最后结果还算不错。
希望大家在做实验之前一定要搞懂函数的功能和每个参数的意义,以及卷积的过程,不然可能会遇到很多奇奇怪怪的问题和阻力。

5.参考文章

【2021-2022 春学期】人工智能-作业4:CNN – 卷积

OpenCV的初步简单讲解——高斯模糊与卷积核,通俗易懂

Image Kernels

卷积核实现的不同效果及其原理

Pytorch学习(四)三通道图片CNN图片轮廓检测

Py之cv2:cv2库(OpenCV,opencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年5月12日
下一篇 2022年5月12日

相关推荐