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

目录

一、卷积、卷积核、多通道、特征图、特征选择概念。

二、编程实现:

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

2.调整经典卷积核参数,测试并总结

3.使用不同尺寸图片,测试并总结

4.尝试彩色图片边缘检测

三、参考:

参考链接:

参考代码:


一、卷积、卷积核、多通道、特征图、特征选择概念。

        卷积:是通过两个函数,f和g生成第三个函数的一种数学运算,其本质是一种特殊的积分变换,表征函数f与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分

        数学表达形式:

        卷积核:g(x)可以称为作用点,所有作用点合起来称为卷积核

        多通道:例如三通道就是RGB三原色的,一幅完整的图像,是由红绿蓝三个通道组成的,他们共同作用产生了完整的图像

        特征图:由图像提取出的特征值组成的方图

        特征选择:从已经有的特征中选择若干有效的特征使图片最优

二、编程实现:

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

运行结果:

原图(图片大小为382x356):

[-1, -1, -1]
[-1, 8, -1]
[-1, -1, -1]

人工智能-作业4:CNN - 卷积_第1张图片

边缘检测:

人工智能-作业4:CNN - 卷积_第2张图片

锐化:

人工智能-作业4:CNN - 卷积_第3张图片

2.调整经典卷积核参数,测试并总结

 调整:

[-10, -10, -10]
[-10, 10, -10]
[-5, -5, -5]

人工智能-作业4:CNN - 卷积_第4张图片

3.使用不同尺寸图片,测试并总结

图片大小改为200x186

人工智能-作业4:CNN - 卷积_第5张图片

边缘检测:

人工智能-作业4:CNN - 卷积_第6张图片

 锐化:

人工智能-作业4:CNN - 卷积_第7张图片

4.尝试彩色图片边缘检测

人工智能-作业4:CNN - 卷积_第8张图片

这里把

im = Image.open(file_path).convert('L')

 改为

im = Image.open(file_path).convert('RGB')

只显示彩色原图,显示到处理过后的图片时就报错,暂未解决

三、参考:

参考链接:

(1条消息) 【2021-2022 春学期】人工智能-作业4:CNN - 卷积_HBU_David的博客-CSDN博客

(1条消息) pytorch之卷积模块、池化、激活函数(可视化)_朴素.无恙的博客-CSDN博客_pytorch卷积核可视化

参考代码:

import numpy as np
import torch
from torch import nn
from torch.autograd import Variable
from PIL import Image
import matplotlib.pyplot as plt
 
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号 #有中文出现的情况,需要u'内容
# https://blog.csdn.net/weixin_40123108/article/details/83510592
file_path = 'deer.jpg'
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()

你可能感兴趣的:(cnn,人工智能,深度学习)