Pytorch----卷积神经网络(CNN,图像边缘检测 , Sobel滤波器 , Scharr滤波器)--入门级小实例(逐行注释)---学习笔记
题目:对任意图片进行简单卷积操作,并提取图片的边缘信息
文章目录
- 小练习~卷积实例
- 小练习~边缘特征提取实例
- 关于边缘检测的原理
- Sobel滤波器
- Scharr滤波器
本次使用图片:
小练习~卷积实例
首先将图片读取进来->转为灰度图->转为numpy数组:
# 读图
image = Image.open('../data/cat.png')
# 转为灰度图
image = image.convert("L")
# 转为numpy数组
image_np = np.array(image)
此时得到的numpy数组维度为二维,可以使用shape输出图片大小(719,719) 。
将 (719,719) 变成(11719*719)的张量,方便后面卷积操作。
h , w = image_np.shape
image_tensor = torch.from_numpy(image_np.reshape(1,1,h,w)).float()
# torch.from_numpy ()方法把数组转换成张量,
此时进行shape输出得到四维张量 torch.Size([1, 1, 719, 719])。
设置卷积核的大小,定义卷积层。
kersize = 5 # 5*5的卷积核大小ker = torch.ones(kersize, kersize, dtype=torch.float32) * -1 # 元素全部设置为 -1
conv2d = torch.nn.Conv2d(1, 1, (kersize, kersize), bias=False) # 设置卷积网络
ker = ker.reshape((1, 1, kersize, kersize))# 将ker变成四维张量
conv2d.weight.data = ker # 初始化权重
将数据放进去卷积,然后压缩一下维度:
这里的squeeze()函数就是压缩维度,可以去掉其中为1的维度。
image_out = conv2d(image_tensor)
image_out = image_out.data.squeeze()去维度之前和之后:torch.Size([1, 1, 715, 715])
torch.Size([715, 715])
这样的二维数据就可以拿去画图了:
plt.axis('off') # 不显示坐标轴
plt.imshow(image_out, cmap=plt.cm.gray) # cmap表示给图上黑白色
plt.show()
完整代码:
## 普通卷积## 普通卷积from PIL import Image
import torch
import matplotlib.pyplot as plt
import numpy as np
from torch import nnimage = Image.open('../data/cat.png')
image = image.convert("L")
image_np = np.array(image)h, w = image_np.shape
image_tensor = torch.from_numpy(image_np.reshape(1, 1, h, w)).float()kersize = 5ker = torch.ones(kersize, kersize, dtype=torch.float32) * -1
print(ker)
conv2d = torch.nn.Conv2d(1, 1, (kersize, kersize), bias=False)
ker = ker.reshape((1, 1, kersize, kersize))
conv2d.weight.data = kerimage_out = conv2d(image_tensor)
image_out = image_out.data.squeeze()
plt.axis('off')
plt.imshow(image_out, cmap=plt.cm.gray)
plt.show()
可以看到结果:
…额 有点吓人。
小练习~边缘特征提取实例
在刚才的程序中,我们使用了卷积核维度5*5。
现在用于边缘检测,我们初始化用于边缘检测的卷积核。
只需要加一行代码
ker[2, 2] = 24
关于边缘检测的原理
其实就是设置了特殊的卷积核(滤波器)达到了检测边缘的目的。
可以看一下上面这张图, 设置的卷积核(滤波器)设计的非常巧妙 一列1 一列0 一列-1(称为垂直边缘检测)。
这就导致颜色相同的区域与这个卷积核做卷积得到的数据近0。而越接近0颜色就越浅。
区域内颜色相差越大,得到的数字也就越大,颜色就会越深。
最后就会描绘出图像边缘。
一行1 一行 0 一行-1 就是水平边缘检测。
Sobel滤波器
,其增加了中间一行的权重,加强处理图像中央的元素点。
Scharr滤波器
。也是一种垂直边缘检测,反转90度就变成了水平边缘检测。
本题中用到的 全是-1 仅仅中间是24这个情况。。没懂。不过查阅资料发现有点类似于 拉普拉斯算子卷积核的情况。
先不管这个为什么设置中间为24了 ,后面懂了再回来补吧。
另外:
我们也可以直接将普通卷积操作和边缘检测卷积操作两个合并到一起,在卷积层设置的时候输出通道数改成2,然后再绘图的时候绘制到一起,看下面代码里的注释。
完整代码:
from PIL import Image
import torch
import matplotlib.pyplot as plt
import numpy as np
# 在Image转Tensor过程中,图片的格式会由: H * W * C的格式转为: C * H * W格式。
from torch import nn# 读图
image = Image.open('../data/cat.png')
# 转为灰度图
image = image.convert("L")
# 转为numpy数组
image_np = np.array(image)# plt.figure(figsize=(6,6)) # 绘图并指定长和高
# # 参数cmap将标量数据映射到图片 cmap = plt.cm.gray 返回线性灰度色图
# # cmap参数接受一个值(每个值代表一种配色方案),并将该值对应的颜色图分配给当前图窗。
# # 如果将当前图窗比作一幅简笔画,则cmap就代表颜料盘的配色,用所提供的颜料盘自动给当前简笔画上色,就是cmap所做的事。
# plt.imshow(image_np,cmap=plt.cm.gray)
# plt.axis("off") # 不显示坐标轴
# plt.show()# print(image_np.shape) # 得到 结果 (719, 719)
# 将上述数组转换成 1*1*719*719的张量
h , w = image_np.shape
image_tensor = torch.from_numpy(image_np.reshape(1,1,h,w)).float() # torch.from_numpy ()方法把数组转换成张量,# print(image_tensor.shape) # 得到torch.Size([1, 1, 719, 719])
kersize = 5
ker = torch.ones(kersize,kersize,dtype=torch.float32)*-1ker[2,2] = 24ker = ker.reshape((1,1,kersize,kersize)) # 边缘卷积核conv2d = torch.nn.Conv2d(1,2,(kersize,kersize),bias=False) # 设置卷积核
# print(ker)
# print(conv2d.weight.data.shape) # 权重维度 2*1*5*5 输出通道数,输入通道数,卷积核长宽
conv2d.weight.data[0] = ker
print(conv2d.weight.data) # 第一个维度的权重用于进行边缘提取,第二个卷积核是随机数image_out = conv2d(image_tensor)
print(image_out.shape)
image_out = image_out.data.squeeze() # 数组的维度压缩,去掉其中为1的维度
print(image_out.shape) # 要注意此时的 image_out里面有两个 715*715的图 torch.Size([2, 715, 715]) 三维张量
print(image_out)plt.figure(figsize=(18,6)) # 表示输出的长和宽
plt.subplot(1,3,1) # 1行 2列 然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1,最后那个参数指定显示的区域编号
plt.imshow(image_out[0],cmap=plt.cm.gray) # 拿出来第0个 就是秒轮廓的那个
plt.axis('off')plt.subplot(1,3,2) # 写第二个图
plt.imshow(image_out[1],cmap=plt.cm.gray)
plt.axis('off')plt.subplot(1,3,3)
plt.imshow(image_np,cmap=plt.cm.gray)
plt.axis('off')
plt.show()
Pytorch----卷积神经网络(CNN,图像边缘检测 , Sobel滤波器 , Scharr滤波器)--入门级小实例(逐行注释)---学习笔记相关推荐
- 卷积神经网络(CNN)——图像卷积
一.为什么要对图像做卷积? 神经网络中的多层感知机(MLP)十分适合处理表格数据,其中行对应样本,列对应特征.正如我们之前使用 MLP 对 Fashion-MNIST 数据集进行训练和预测的那样,输入 ...
- 卷积神经网络CNN——图像卷积与反卷积(后卷积,转置卷积)
https://blog.csdn.net/fate_fjh/article/details/52882134
- 4. 卷积神经网络CNN
文章目录 4. 卷积神经网络CNN 4.1 概念 4.1.1 概念 4.1.2 用途 4.2 结构介绍 4.2.1 结构简介 4.2.2 卷积层 1) 基本概念 2) 前期准备 3) 参数共享 4) ...
- 卷积神经网络 CNN 简述
文章目录 所解决的问题 需要处理的数据量太大 很难保留图像特征 基本原理 卷积层 -- 提取图像特征 池化层 -- 数据降维(避免过拟合) 全连接层 -- 输出结果 实际应用 图像分类.检索 目标检测 ...
- 卷积神经网络、比较MLPS和CNNS、滤波器、CNN各层的作用、在Pytorch可视化CNN
1.33.卷积神经网络 1.33.1.卷积 和 神经网络 1.33.1.1.比较MLPS和CNNS 1.33.1.2.计算机如何看图像? 1.33.1.3.建立自己的滤波器 1.33.2.完整的卷积神 ...
- CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)
CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...
- 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】
卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...
- 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】
卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...
- 卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)
卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习) 分享一些公式计算张量(图像)的尺寸,以及卷积神经网络(CNN)中层参数的计算. 以AlexNet网络为例,以下是该网络的参数结构图. A ...
最新文章
- NET(C#)连接各类数据库-集锦
- 调试异常 Free Heap block xxxxxxxx modified at xxxxxxxx after it was freed
- Bochs调试及相关仿真工具的使用方法
- VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
- MFC(六)(对话框)
- pythonweb开发面试_python 高级岗位面试要求
- linux c之gcc -g file.c -o file提示warning: no newline at end of file
- 减治求有重复元素的全排列
- Sublime Text 3总是出现“1 missing dependency was just installed.”
- Dialogue and Conversational Agents
- 主板声卡坏了会不会有电流声_不同领域适使用不同类型声卡,千万别选错了~~~...
- 黑客入侵Windows XP的几个常用方法
- 银行考试计算机也需要考金融知识吗,银行招聘考试科技岗考试科目及考试内容...
- html中设置粗斜体,HTML基础 b i 字体加粗 斜体
- CentOS 7.1结合openstack L版本详解
- GAN的介绍和简单代码的实现
- 【TV Picture Quality - 02】TV常见信号接口
- Zookeeper(2) - 配置详解与启动原理
- 注册制掀起的激荡风云
- 2.11 header footer hgroup address元素
热门文章
- 鼠标指针在微信界面消失怎么办?
- flex布局小案例——制作骰子
- 如何测试一个纸杯-----利用引导词整理测试思路
- h5 微信支付 php,用h5做出微信的支付过程的实现步骤
- 沐风:企业网络营销赚钱关键设计
- mysql myisam转innodb_转:MySQL从MyISAM引擎转换到InnoDB引擎需要注意的地方
- 百度编辑支持word内容和截图的复制黏贴
- 图像的压缩算法--尺寸压缩、格式压缩和品质压缩
- Dubbo封装异常处理Filter报AppResponse represents an concrete business response解决方案
- PIC反汇编 MPLAB HEX