PyTorch深度学习中卷积神经网络(CNN)的讲解及图像处理实战(超详细 附源码)

简介: PyTorch深度学习中卷积神经网络(CNN)的讲解及图像处理实战(超详细 附源码)

需要源码和图片集请点赞关注收藏后评论区留言私信~~~

一、卷积神经网络简介

卷积神经网络是深度学习中最常用的一种网络结构,它作为一种深度神经网络结构,擅长处理图像相关的问题,能够将目标图像降维并提取特征,以进行分类识别等运算

二、卷积神经网络核心思想

1:局部感知

图像的局部像素之间往往存在着较强的相关性,局部感知正是利用了这一特性,每次只针对图像的局部信息进行感知,得到特征图,而后在更深层次的网络中继续对所得特征图的局部信息进行高维感知,以此从局部到整体来获取图像信息,使用局部感知时,神经元只和下一层的部分神经元进行连接,每一个局部感知区域都对应着一个卷积核,此外剧本感知大大降低了网络的参数。

2:权值共享

类似于局部感知,同样从像素相关性和参数缩减方面进行考虑。它实现的是多层像素共享一个卷积核的功能,之所以可以这样处理图像,是因为像素相关性高的局部区域往往具有相同的纹理特征,可以用同一个卷积核来学习这部分特征

3:下采样

在实际工作中,通常需要下采样技术对各层特征图进行压缩处理,减少后续网络的权重参数,减少过拟合问题,便于提起图像的高维特征

三、卷积神经网络结构

1:输入层

2:卷积层

基于图像的空间局部相关性分别抽取图像局部特征,通过将这些局部特征进行连接,形成整体特征

单通道与多通道卷积层示意图如下

3:激励层

用于将卷积层的输出结果进行非线性映射

4:池化层

其功能在于降低数据量,减少参数数量,从而预防网络过拟合。分为最大池化与平均池化

5:全连接层

与传统神经网络相同,使用一个或多个神经元来输出预测数据

四、CNN处理图像实战

原图片如下

转换为灰度图效果如下 转换时只需要在imshow中指定输出的颜色格式即可变换

将图像背景转换为蓝色

转换为黄色

BrBG颜色效果如下

五、代码

部分源码如下

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
import pylab
############################################get_ipython().run_line_magic('matplotlib', 'inline')
im = Image.open(r'C:\Users.jpg').convert('L')   # 读入一张灰度图的图片
im = np.array(im, dtype='float32')    # 将其转换为一个矩阵
am = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(im)
print(am)
# 可视化图片
plt.imshow(im.astype('uint8'), cmap='gray')
pylab.show()
# 将图片矩阵转化为 pytorch tensor,并适配卷积输入的要求
print(am.shape)
im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
am = torch.from_numpy(am.reshape((1, 1, am.shape[0], am.shape[1])))
print(im)
print(am)
# 使用 nn.Conv2d
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))         # 作用在图片上
#edge2 = conv1(Variable(am))
edge1 = edge1.data.squeeze().numpy()      # 将输出转换为图片的格式
#edge2 = edge2.data.squeeze().numpy()
plt.imsh
# 使用 F.conv2d
sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')   # 定义轮廓检测算子
sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))         # 适配卷积的输入输出
weight = Variable(torch.from_numpy(sobel_kernel))
edge2 = F.conv2d(Variable(im), weight)          # 作用在图片上
edge2 = edge2.data.squeeze().numpy()          # 将输出转换为图片的格式
pw()
# 使用 nn.MaxPool2d
pool1 = nn.MaxPool2d(2, 2)
print('before max pool, image shape: {} x {}'.format(im.shape[2], im.shape[3]))
small_im1 = pool1(Variable(im))
small_im1 = small_im1.data.squeeze().numpy()
print('after max pool, image shape: {} x {} '.format(small_im1.shape[0], small_im1.shape[1]))
pl)
# F.max_pool2d
print('before max pool, image shape: {} x {}'.format(im.shape[2], im.shape[3]))
small_im2 = F.max_pool2d(Variable(im), 2, 2)
small_im2 = small_im2.data.squeeze().numpy()
print('after max pool, image shape: {} x {} '.format(small_im1.shape[0], small_im1.shape[1]))
ow()
#输入数据
cs = np.array([[0,0,0,1,0,1,2],[0,1,1,1,1,0,0],[0,1,1,2,2,0,1],[0,0,1,2,2,1,1],[0,0,0,1,1,0,1],[0,0,2,1,2,1,0],[1,0,1,2,0,0,1]],dtype='float32')
cs = torch.from_numpy(cs.reshape((1, 1, cs.shape[0], cs.shape[1])))
conv1 = nn.Conv2d(1, 1, 3, bias=False)
# 定义卷积核
0,0,0,0]],[[0,0,0,0,0,0,0],[0,2,1,2,0,1,0],[0,1,2,0,0,1,0],[0,0,1,0,2,1,0],[0,2,0,1,2,0,0],[0,1,0,0,1,0,0],[0,0,0,0,0,0,0]],[[0,0,0,0,0,0,0],[0,0,0,1,2,0,0],[0,0,2,1,0,0,0],[0,1,0,0,0,1,0],[0,2,0,0,0,2,0],[0,1,1,2,1,0,0],[0,0,0,0,0,0,0]]],dtype='float32')
cs = torch.from_numpy(cs.reshape(1,cs.shape[0],cs.shape[1],cs.shape[2]))
conv2 = nn.Conv2d( in_channels=3, out_channels=2, kernel_size=3, stride=2, padding=0,bias=True)
# 定义卷积核
conv2_kernel = np.array([[[[-1, 0, 1], [0, 0, 0], [1, -1, 1]],[[-1,1,1],[0,1,0],[1,0,0]],[[1,-1,1],[-1,1,0],[0,1,0]]],[[[0, 0, 1], [1, -1, 1], [0, 0, 1]],[[1,0,1],[-1,0,-1],[0,-1,0]],[[0,1,1],[-1,-1,0],[1,1,0]]]], dtype='float32')
# 适配卷积的输入输出
conv2_kernel = conv2_kernel.reshape((2, 3, 3, 3))
pylab.show()
# 定义偏置项
'''
conv2_bias = np.array([1,0])
conv2.weight.data = torch.from_numpy(conv2_kernel)
conv2.bias.data = torch.from_numpy(conv2_bias)
final2 = conv2(Variable(cs))
print(final2)
'''

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
1天前
|
机器学习/深度学习 数据采集 监控
基于CNN卷积神经网络的步态识别matlab仿真,数据库采用CASIA库
**核心程序**: 完整版代码附中文注释,确保清晰理解。 **理论概述**: 利用CNN从视频中学习步态时空特征。 **系统框架**: 1. 数据预处理 2. CNN特征提取 3. 构建CNN模型 4. 训练与优化 5. 识别测试 **CNN原理**: 卷积、池化、激活功能强大特征学习。 **CASIA数据库**: 高质量数据集促进模型鲁棒性。 **结论**: CNN驱动的步态识别展现高精度,潜力巨大,适用于监控和安全领域。
|
17天前
|
机器学习/深度学习 数据采集 算法
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
60 19
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于CNN卷积神经网络的MQAM调制识别matlab仿真
**理论**: 利用CNN自动识别MQAM调制信号,通过学习星座图特征区分16QAM, 64QAM等。CNN从原始数据提取高级特征,优于传统方法。 - **CNN结构**: 自动特征学习机制,适配多种MQAM类型。 - **优化**: 损失函数指导网络参数调整,提升识别准确度。 - **流程**: 大量样本训练+独立测试评估,确保模型泛化能力。 - **展望**: CNN强化无线通信信号处理,未来应用前景广阔。
|
13天前
|
机器学习/深度学习 PyTorch 算法框架/工具
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
图神经网络是一类用于处理图结构数据的神经网络。与传统的深度学习模型(如卷积神经网络CNN和循环神经网络RNN)不同,
|
17天前
|
机器学习/深度学习 数据采集 算法
Python基于卷积神经网络CNN模型和VGG16模型进行图片识别项目实战
Python基于卷积神经网络CNN模型和VGG16模型进行图片识别项目实战
|
2天前
|
机器学习/深度学习 自然语言处理 开发者
深度学习在自然语言处理中的应用与挑战
随着人工智能技术的快速发展,深度学习已成为自然语言处理(NLP)领域的核心动力。本文将探讨深度学习模型如何革新了语言理解、机器翻译和情感分析等NLP任务,并讨论在实现更高水平的语言智能方面所面临的数据偏差、模型泛化能力和伦理问题等挑战。通过案例分析和最新研究趋势的回顾,本文旨在为读者提供深度学习在NLP领域的应用全景及其未来发展的可能性。
11 1
|
19小时前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的应用与挑战
【7月更文挑战第26天】本文深入探讨了深度学习技术在图像识别领域的应用和面临的挑战。文章首先概述了深度学习的基本原理,随后详细阐述了其在图像处理中的具体应用场景,包括面部识别、自动驾驶车辆的视觉系统等。进一步,文章分析了当前深度学习在图像识别方面遇到的主要挑战,如数据偏见、模型泛化能力不足以及对抗性攻击的防御问题。最后,提出了针对这些挑战的潜在解决策略,并展望了深度学习在图像识别领域的未来发展方向。
13 6
|
2天前
|
机器学习/深度学习 自然语言处理 语音技术
深度学习在自然语言处理中的应用与挑战
【7月更文挑战第25天】随着人工智能技术的飞速发展,深度学习已经成为解决复杂问题的重要工具。特别是在自然语言处理(NLP)领域,深度学习技术的应用已经取得了显著的进展。本文将探讨深度学习在NLP中的主要应用场景、面临的挑战以及未来的发展方向。
|
21小时前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的应用与挑战
随着人工智能技术的飞速发展,深度学习已成为图像识别领域的核心技术之一。通过模拟人脑处理信息的方式,深度学习模型能够实现对复杂图像数据的高效处理和识别。本文将从深度学习的基本概念出发,探讨其在图像识别中的应用实例,分析当前面临的主要挑战,并展望未来的发展趋势。
|
2天前
|
机器学习/深度学习 算法 Serverless
计算图是如何定义的 在深度学习中的应用有哪些
计算图是如何定义的 在深度学习中的应用有哪些
12 3