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

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

注意:黑白图只有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() # 显示图片


相关文章
常用图像卷积核类型小结
卷积操作的主要目的就是对图像进行降维以及特征提取; 1.卷积核往往是行数和列数均为奇数的矩阵,这样中心较好定位; 2.卷积核元素的总和体现出输出的亮度,若元素总和为1,卷积后的图像与原图像亮度基本一致;若元素总和为0,则卷积后的图像基本上是黑色,其中较亮的部分往往就是提取出图像的某种特征; 3.滤波实际上就是Same模式的卷积操作,也就是说滤波后图像的大小不变,各种滤镜和照片的风格化就是使用不同的滤波器对图像进行操作。因此卷积核、滤波器本质上都是一个东西; 4.高通滤波器(High Pass Filter, HPF)表示仅允许图像中高频部分(即图片中变化较剧烈的部分)通过,往往用于对图像
|
6月前
|
计算机视觉 索引
【OpenCV】—ROI区域图像叠加&图像混合
【OpenCV】—ROI区域图像叠加&图像混合
|
6月前
[3D&Halcon] 3D重要算子及简单处理点云模型求高度示例讲解
[3D&Halcon] 3D重要算子及简单处理点云模型求高度示例讲解
546 0
|
机器学习/深度学习 Python
如何对图片进行卷积计算
如何对图片进行卷积计算
159 0
|
自然语言处理 算法 测试技术
参数减半、与CLIP一样好,视觉Transformer从像素入手实现图像文本统一
参数减半、与CLIP一样好,视觉Transformer从像素入手实现图像文本统一
126 0
|
机器学习/深度学习 PyTorch 算法框架/工具
【Pytorch神经网络实战案例】09 使用卷积提取图片的轮廓信息(手动模拟Sobel算子)
【Pytorch神经网络实战案例】09 使用卷积提取图片的轮廓信息(手动模拟Sobel算子)
223 0
|
机器学习/深度学习 编解码 人工智能
图像基础二(下)
图像基础二(下)
184 0
图像基础二(下)
|
自然语言处理 计算机视觉 C++
图像基础二(上)
图像基础二(上)
158 0
图像基础二(上)
|
机器学习/深度学习
卷积模型分类图片
卷积层是一组平行的特征图(feature map),它通过在输入图像上滑动不同的卷积核并运行一定的运算而组成。此外,在每一个滑动的位置上,卷积核与输入图像之间会运行一个元素对应乘积并求和的运算以将感受野内的信息投影到特征图中的一个元素。这一滑动的过程可称为步幅 ,步幅是控制输出特征图尺寸的一个因素。卷积核的尺寸要比输入图像小得多,且重叠或平行地作用于输入图像中,一张特征图中的所有元素都是通过一个卷积核计算得出的,也即一张特征图共享了相同的权重和偏置项。
|
Python
【16】查看中间层特征矩阵并保存图像与参数
【16】查看中间层特征矩阵并保存图像与参数
118 0