图像相关层之卷积锐化图片示例

简介: 图像相关层之卷积锐化图片示例

注意:黑白图只有1个通道数,彩色图却含有三个通道数。

学习总结:

  • Conv2d是torch.nn模块封装好的2维卷积模型
  • 相关图层锐化操作等操作不是直接修改卷积核,而是选择通过重新赋值修改Conv2d.weight.data的参数,但需要注意的是修改参数的前提是赋值的维度必须和原Conv2d.weight.data的维度保持一模一样
  • 输入通道数取决于数据当前的通道数,比如一开始输入的图像数据是一张彩色图,那么输入通道数就是3。
  • 关于卷积核和滤波器的关系(重要):卷积核看作是三维的(NI,A,A),输入通道数为 NI (视为卷积核的高),卷积核的长和宽都为 A,输出通道数 NO 可以看作是滤波器(过滤器)的数目,一个滤波器可以看作一个卷积核,那么就有 NO 个卷积核(NI,A,A)进行数据特征提取。注意:输入通道数一定在数据要在执行卷积模型(毕竟构造卷积模型后参数还可以再修改如conv.weight.data)前 和输入数据的通道数保持相同,比如彩色图输入通道数是3。
  • 池化就是在卷积核的基础上进一步提取原始图像数据特征,一般有最大化池化和平均池化
  • 顺手推荐一波深度学习卷积网络画图神器:ConvNetDraw

一、彩色图像输入,灰度输出(代码和结果如下)

1、卷积未池化

1.1 代码一

from PIL import Image
import torch as t
from torch import nn
from torch.autograd import Variable as V
from torchvision.transforms import ToTensor,ToPILImage
to_tensor = ToTensor() # 创建Totensor对象,可以将图片转换为tensor
to_pil = ToPILImage() # 创建ToPILImage对象,可以将tensor转换成图像
image = Image.open('E:/pythonProjecttest/mg.png') # 图片提取
# if image.mode != 'L':
#     image = image.convert('L')
input = to_tensor(image).unsqueeze(0) # 将图片转换为tensor
# 锐化卷积核
# 为修改conv.weight.data重新赋值做准备
kernel = t.ones(3,3,3)/9  # 准备
kernel[1][1][1] = 1 # 准备
conv = nn.Conv2d(3,1,3,1,bias=False) # 设置输入通道数、输出通道数、卷积核大小、步长、...偏置
# print(conv.weight.data.size())
conv.weight.data = kernel.view(1,3,3,3) # 必须和封装的Conv2d函数中的conv.weight.data维度一致 滤波器数目(输出通道);输入通道(卷积的高);卷积长宽
out = conv(V(input))
to_pil(out.data.squeeze(0)).show() # 将tensor转换成图像并显示图片

1.2 代码二

from PIL import Image
import torch as t
from torch import nn
from torch.autograd import Variable as V
from torchvision.transforms import ToTensor,ToPILImage
to_tensor = ToTensor() # 创建Totensor对象,可以将图片转换为tensor
to_pil = ToPILImage() # 创建ToPILImage对象,可以将tensor转换成图像
image = Image.open('E:/pythonProjecttest/mg.png') # 图片提取
if image.mode != 'L': # 彩色图转换为黑白图
    image = image.convert('L')
input = to_tensor(image).unsqueeze(0)
# 锐化卷积核
# 为修改conv.weight.data重新赋值做准备
kernel = t.ones(3,3)/9
kernel[1][1] = 1
conv = nn.Conv2d(1,1,3,1,bias=False) # 设置输入通道数、输出通道数、卷积核大小、步长、...偏置
# print(conv.weight.data.size())
conv.weight.data = kernel.view(1,1,3,3) # 必须和封装的Conv2d函数中的conv.weight.data维度一致
out = conv(V(input))
to_pil(out.data.squeeze(0)).show() # 将tensor转换成图像并显示图片

2、池化未卷积

from PIL import Image
import torch as t
from torch import nn
from torch.autograd import Variable as V
from torchvision.transforms import ToTensor,ToPILImage
to_tensor = ToTensor() # 创建Totensor对象,可以将图片转换为tensor
to_pil = ToPILImage() # 创建ToPILImage对象,可以将tensor转换成图像
image = Image.open('E:/pythonProjecttest/mg.png') # 图片提取
if image.mode != 'L': # 彩色图转换为黑白图
    image = image.convert('L')
input = to_tensor(image).unsqueeze(0)
# 锐化卷积核
# kernel = t.ones(3,3)/9
# kernel[1][1] = 1
# conv = nn.Conv2d(1,1,(3,3),1,bias=False) # 设置输入通道数、输出通道数、卷积核大小、步长、...偏置
# conv.weight.data = kernel.view(1,1,3,3) 
# out = conv(V(input))
# 池化层
pool = nn.AvgPool2d(2,2)
out = pool(V(input))
to_pil(out.data.squeeze(0)).show() # 显示图片

3、卷积及池化

from PIL import Image
import torch as t
from torch import nn
from torch.autograd import Variable as V
from torchvision.transforms import ToTensor,ToPILImage
to_tensor = ToTensor() # 创建Totensor对象,可以将图片转换为tensor
to_pil = ToPILImage() # 创建ToPILImage对象,可以将tensor转换成图像
image = Image.open('E:/pythonProjecttest/mg.png') # 图片提取
if image.mode != 'L': # 彩色图转换为黑白图
    image = image.convert('L')
input = to_tensor(image).unsqueeze(0)
# 锐化卷积核
kernel = t.ones(3,3)/9
kernel[1][1] = 1
conv = nn.Conv2d(1,1,3,1,bias=False) # 设置输入通道数、输出通道数、卷积核大小、步长、...偏置
conv.weight.data = kernel.view(1,1,3,3) 
out = conv(V(input))
# 池化层
pool = nn.AvgPool2d(2,2)
out = pool(out)
to_pil(out.data.squeeze(0)).show() # 显示图片

二、彩色图像输入,彩色输出(代码和结果如下)

1、卷积未池化

from PIL import Image
import torch as t
from torch import nn
from torch.autograd import Variable as V
from torchvision.transforms import ToTensor,ToPILImage
to_tensor = ToTensor() # 创建Totensor对象,可以将图片转换为tensor
to_pil = ToPILImage() # 创建ToPILImage对象,可以将tensor转换成图像
image = Image.open('E:/pythonProjecttest/mg.png') # 图片提取
# if image.mode != 'L':
#     image = image.convert('L')
input = to_tensor(image).unsqueeze(0)
# 锐化卷积核
kernel = t.ones(3,3,3,3)/9
kernel[1][1][1][1] = 1
conv = nn.Conv2d(3,3,3,1,bias=False) # 设置输入通道数、输出通道数、卷积核大小、步长、...偏置
conv.weight.data = kernel.view(3,3,3,3) 
out = conv(V(input))
to_pil(out.data.squeeze(0)).show() # 显示图片

2、池化未卷积

from PIL import Image
import torch as t
from torch import nn
from torch.autograd import Variable as V
from torchvision.transforms import ToTensor,ToPILImage
to_tensor = ToTensor() # 创建Totensor对象,可以将图片转换为tensor
to_pil = ToPILImage() # 创建ToPILImage对象,可以将tensor转换成图像
image = Image.open('E:/pythonProjecttest/mg.png') # 图片提取
# if image.mode != 'L': # 彩色图转换为黑白图
#     image = image.convert('L')
input = to_tensor(image).unsqueeze(0)
# 锐化卷积核
# kernel = t.ones(3,3)/9
# kernel[1][1] = 1
# conv = nn.Conv2d(1,1,3,1,bias=False) # 设置输入通道数、输出通道数、卷积核大小、步长、...偏置
# conv.weight.data = kernel.view(1,1,3,3) 
# out = conv(V(input))
# 池化层
pool = nn.AvgPool2d(2,2)
out = pool(V(input))
to_pil(out.data.squeeze(0)).show() # 显示图片

3、卷积及池化

from PIL import Image
import torch as t
from torch import nn
from torch.autograd import Variable as V
from torchvision.transforms import ToTensor,ToPILImage
to_tensor = ToTensor() # 创建Totensor对象,可以将图片转换为tensor
to_pil = ToPILImage() # 创建ToPILImage对象,可以将tensor转换成图像
image = Image.open('E:/pythonProjecttest/mg.png') # 图片提取
# if image.mode != 'L': # 彩色图转换为黑白图
#     image = image.convert('L')
input = to_tensor(image).unsqueeze(0)
# 锐化卷积核
kernel = t.ones(3,3,3,3)/9
kernel[1][1][1][1] = 1
conv = nn.Conv2d(3,3,3,1,bias=False) # 设置输入通道数、输出通道数、卷积核大小、步长、...偏置
conv.weight.data = kernel.view(3,3,3,3) # 卷积核必须数量一致
out = conv(V(input))
# 池化层
pool = nn.AvgPool2d(2,2)
out = pool(out)
to_pil(out.data.squeeze(0)).show() # 显示图片


相关文章
|
消息中间件 存储 供应链
进程间通信方式-----消息队列通信
【10月更文挑战第29天】消息队列通信是一种强大而灵活的进程间通信机制,它通过异步通信、解耦和缓冲等特性,为分布式系统和多进程应用提供了高效的通信方式。在实际应用中,需要根据具体的需求和场景,合理地选择和使用消息队列,以充分发挥其优势,同时注意其可能带来的复杂性和性能开销等问题。
|
算法
HSV颜色模型
HSV颜色模型
2419 0
HSV颜色模型
|
机器学习/深度学习 决策智能
双边滤波方法原理与代码实践(附完整代码)
双边滤波方法原理与代码实践(附完整代码)
2275 0
|
7月前
|
Linux
Linux系统之cat命令基本使用
Linux系统之cat命令基本使用
1293 10
Linux系统之cat命令基本使用
|
存储 负载均衡 Java
Nifi 架构 | 学习笔记
快速学习 Nifi 架构
626 0
Nifi 架构  |  学习笔记
|
小程序 开发者
注册小程序账号&安装开发者工具
该内容是一份指南,描述了如何注册并激活微信小程序账号的步骤。首先,访问网址后点击“前往注册”。接着,按照提示依次填写个人信息。完成注册后,检查邮件进行激活。选择主体类型为个人,并填写相关主体信息。之后,使用微信扫描二维码验证。成功后,获取小程序的App ID并保存。下载并安装微信开发者工具,扫码登录。最后,通过开发者工具创建新的小程序项目,填写项目信息,包括之前获取的App ID,选择不使用云服务,然后点击新建以开始项目。
704 0
|
中间件 测试技术 应用服务中间件
压力测试和JMeter使用分析
压力测试和JMeter使用分析
压力测试和JMeter使用分析
|
人工智能 算法
图像伪造照妖镜!北大发布多模态LLM图像篡改检测定位框架FakeShield
北京大学研究团队提出了一种名为FakeShield的多模态框架,旨在解决图像伪造检测与定位(IFDL)中的黑箱问题及泛化能力不足。FakeShield不仅能评估图像真实性,生成篡改区域的掩码,还能提供像素级和图像级的篡改线索及详细文本描述,增强检测的可解释性。通过使用GPT-4o增强现有数据集,创建多模态篡改描述数据集(MMTD-Set),并引入领域标签引导的可解释伪造检测模块(DTE-FDM)和多模态伪造定位模块(MFLM),FakeShield在多种篡改技术的检测与定位上表现优异,为图像真实性维护提供了有力工具。
1012 14
|
Linux Windows
Nomachine 最简安装与使用指南
这是一篇2022年Nomachine软件的极简安装与使用指南,包括Windows和Linux系统下的安装步骤,以及如何在Windows系统上通过Nomachine远程控制Linux系统的方法。
Nomachine 最简安装与使用指南

热门文章

最新文章