pytorch深度学习基础(九)——深入浅析卷积核

news2024/9/26 1:25:22

深入浅析卷积核

  • 引言
  • 单通道卷积
  • 简单图像
  • 边缘检测
  • 锐化
  • 高斯滤波

引言

在这里插入图片描述

提到卷积,应该多数人都会想到类似上图的这种示例,可以简单的理解成卷积核与图像中和卷积核相同大小的一块区域与卷积核相乘再求和,通过移动区域产生一个有和组成的新的图像,那么卷积核是什么呢,我们来看下面的例子

单通道卷积

首先,我们定义了一个单通道图像的卷积过程,我们用这个来验证卷积核的特性

def Conv2d(X,kernel):
    img_row,img_col = X.shape
    ker_row,ker_col = kernel.shape

    result = torch.zeros(img_row-ker_row+1,img_col-ker_col+1)
    res_row,res_col = result.shape

    for r in range(res_row):
        for c in range(res_col):
            result[r,c] = torch.sum(X[r:r+ker_row,c:c+ker_col]*kernel)
    return result

简单图像

我们建立两个图像,一个是X一个是Y

X = torch.tensor(
       [[1., 0., 0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 0., 1., 0.],
        [0., 0., 1., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 1., 0., 0.],
        [0., 1., 0., 0., 0., 1., 0.],
        [1., 0., 0., 0., 0., 0., 1.]])

Y = torch.tensor(
       [[1., 0., 0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 0., 1., 0.],
        [0., 0., 1., 0., 1., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.]])

他们画出图来效果如下
在这里插入图片描述
那么如果我们要分类,要通过什么分类呢?
我们观察到X和Y都有左斜向下,右斜向下的特征,但是X又多一个两个线交叉的特征
那么我们可以建立三个卷积核

#卷积核
kernel0=torch.tensor(
       [[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
kernel1=torch.tensor(
       [[0., 0., 1.],
        [0., 1., 0.],
        [1., 0., 0.]])
kernel2=torch.tensor(
       [[1., 0., 1.],
        [0., 1., 0.],
        [1., 0., 1.]])

他们三个效果如下
在这里插入图片描述
我们对X卷积

X_kernel0 = Conv2d(X,kernel0)
X_kernel1 = Conv2d(X,kernel1)
X_kernel2 = Conv2d(X,kernel2)
plt.subplot(131)
plt.imshow(X_kernel0,cmap='gray_r')
plt.subplot(132)
plt.imshow(X_kernel1,cmap='gray_r')
plt.subplot(133)
plt.imshow(X_kernel2,cmap='gray_r')

在这里插入图片描述
可以看到三个卷积的特征都有被匹配
那么我们来看Y

X_kernel0_ = Conv2d(Y,kernel0_)
X_kernel1_ = Conv2d(Y,kernel1_)
X_kernel2_ = Conv2d(Y,kernel2_)

plt.subplot(131)
plt.imshow(X_kernel0_,cmap='gray_r')
plt.subplot(132)
plt.imshow(X_kernel1_,cmap='gray_r')
plt.subplot(133)
plt.imshow(X_kernel2_,cmap='gray_r')

在这里插入图片描述
可以看到左上和左下的特征被提取出来了,但是交叉的特征因为Y只有上半部分,所以只有上半部分被匹配上一部分

上面的过程就是卷积核用于提取特征的过程,当然不用担心,这些卷积核只是用于做个案例,实际上深度学习的卷积核的值是由反向传递学习得来,我们不需要担心自己设定卷积核的问题

边缘检测

上面我们在简单的图像中展示了卷积核的作用,下面我们来看一下卷积核在真实图像中是怎样的效果。
我们假设有这样一张兔子的图片
在这里插入图片描述
首先我们用灰度方式读入(下同)

img = cv2.imread('tuzi.jpg', cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap=plt.cm.gray)

在这里插入图片描述

我们想要获得他的边缘,那么就可以使用下面的卷积核
[ − 1 , − 1 , − 1 − 1 , 8 , − 1 − 1 , − 1 , − 1 ] \begin{bmatrix} -1 ,-1, -1 \\ -1 , 8 ,-1 \\ -1 ,-1, -1 \end{bmatrix} 111181111
这里做一下解释,这个核主要是侧重于中心,只要是中心不是和周围的像素完全一样,经过卷积之后就能得到一个正值,正值越大说明差别越明显,即边界,否则会得到负值或0

kernel_0 = torch.tensor([[-1, -1, -1],
                         [-1, 8, -1],
                         [-1, -1, -1]
                        ])
X_kernel_0 = Conv2d(torch.tensor(img), kernel_0)
plt.imshow(X_kernel_0, cmap=plt.cm.gray)

这样我们就得到了兔子的边缘
在这里插入图片描述

锐化

锐化需要以下卷积核
[ 0 , − 1 , 0 − 1 , 5 , − 1 0 , − 1 , 0 ] \begin{bmatrix} 0 ,-1, 0 \\ -1 , 5 ,-1 \\ 0 ,-1, 0 \end{bmatrix} 010151010
这里可以发现,和之前的边缘检测的卷积核相比,他只注重中心上下左右的像素,并且如果周围像素完全相同他也是会得到正值,这样的效果比边缘检测更加温和,并没有一下子把周围相同的像素完全取代,而是增强与周围差距大的像素点,抑制与周围差距小的像素点

kernel_1 = torch.tensor([[0, -1, 0],
                         [-1, 5, -1],
                         [0, -1, 0]
                        ])
X_kernel_1 = Conv2d(torch.tensor(img), kernel_1)
plt.imshow(X_kernel_1, cmap=plt.cm.gray)

在这里插入图片描述

高斯滤波

1 16 [ 1 , 2 , 1 2 , 4 , 2 1 , 2 , 1 ] \frac{1}{16}\begin{bmatrix} 1 ,2, 1 \\ 2 , 4 ,2 \\ 1 ,2, 1 \end{bmatrix} 161 121242121
高斯滤波就是使用符合高斯分布的卷积核,通常用于图像滤波,这里的图片没有高斯噪声,效果不明显,高斯滤波详细内容可以查看
opencv-python常用函数解析及参数介绍(三)——图像滤波

kernel_2 = torch.tensor([[1, 2, 1],
                         [2, 4, 2],
                         [1, 2, 1]
                        ]) / 16
X_kernel_2 = Conv2d(torch.tensor(img), kernel_2)
plt.imshow(X_kernel_2, cmap=plt.cm.gray)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python烟花秀

前言 Python跨年烟花表演,具体源码见:Python跨年烟花代码-Python文档类资源-CSDN下载 烟花的粒子类 class particle: #烟花的粒子类 def __init__(self,canvas,num,sums,x,y,x_speed,y_speed,explosion_speed,color,size,max_life): sel…

第四章必备前端基础知识-第二节2:CSS属性

文章目录一:CSS属性一览表二:常用属性详解(1)字体属性(2)文本属性(3)背景属性一:CSS属性一览表 W3C:元素属性 A: align-content规定弹性容器内…

Android studio版本对用的gradle版本和插件版本(注意事项)

简介 Android Studio 构建系统以 Gradle 为基础,并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。虽然 Android 插件通常会与 Android Studio 的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可独立于…

实体店运营:能提高顾客留存率的店铺陈列方式

今天是大年初一,秦丝祝各位商户老板新年快乐,喜迎开门红,赚个盆满钵满!现在还在营业的实体店应该不多了吧?大部分老板都回家团圆了。忙忙碌碌一整年,好不容易到了年关,好好休息是应该的。但是店…

Go存储引擎相关资料汇总

背景 ​ 最近逛知乎的时候看到了这个问题,“Go语言如何写数据库?”。说来我业余时间在这个领域有一些时间精力的投入了,所以想回答一下。我投入的方向是存储引擎方面,所以这篇文章主要是总结一下我看过的一些比较好的Go存储引擎的…

二维费用背包问题

二维费用背包问题一、问题二、思路1、状态表示2、状态转移3、循环设计4、注意三、代码一、问题 二、思路 这道题归根结底还是背包问题的一种,面对背包问题,我们的思路就是面对前i个物品的时候,我们的第i个物品是选还是不选,如果条…

关于ARM的向量中断控制器NVIC

学习或者了解过ARM的朋友应该都会知道NVIC这么个东西,这个东西也是ARM中非常重要的东西,它是ARM不可分离的部分,搭配着内核共同完成着对中断的响应。 1、那到底NVIC是个啥东西呢? NVIC:简称嵌套向量中断控制器。它管理…

【new操作符做了什么 —— js】

🧁个人主页:个人主页 ✌支持我 :点赞👍收藏🌼关注🧡 文章目录new操作符具体做了什么?🎈创建了一个空的对象✨将空对象的原型,指向于构造函数的原型🍧将空对象…

【操作系统】—— Windows卸载与清除工具“ Geek 与 CCleaner ” (带你快速了解)

📜 “作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴。 🍁 操作系统【带你快速了解】对于电脑来说,如果说…

day23-网络编程01

1.网络编程入门 1.1 网络编程概述【理解】 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计…

微服务框架需要处理哪些问题?

文章目录简述架构选择统一版本管理基础框架包管理业务框架包管理模型分层全局上下文管理数据结构定义上下文的传播前后端数据格式协定统一数据格式字段规范协定异常处理orm配置公共字段处理分页处理字段加解密缓存key的序列化哪些数据进行缓存消息队列key的规范队列的管理注册中…

34.Isaac教程--操作示例应用程序

操作示例应用程序 ISAAC教程合集地址文章目录操作示例应用程序与 Jupyter Notebook 的简单联合控制Shuffle Box with Simulator与 Jupyter Notebook 的简单联合控制 此示例使用 Jupyter Notebook 提供交互式联合控制。 这是处理用于操作组件(包括 LQR 规划器&#…

PowerShell 执行策略

在使用 SAPIEN 的PowerShell Studio时出现如下错误:无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 ERROR: 所在位置 行:1 字符: 2 ERROR: …

python基础——函数编程

python基础——函数编程 文章目录python基础——函数编程一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤一、实验目的 掌握函数编程 二、实验原理 在Python中,定义函数的语法如下: def 函数名([参数列表]): ‘’‘注解’…

【人人都是算法专家】一文搞定AI算法竞赛(全网最详细)

Rocky Ding公众号:WeThinkIn写在前面 【人人都是算法专家】栏目专注于分享Rocky在AI行业中业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习💪 大家好,我是Rocky。 之前Rocky总结过很多关于AI算法竞赛的方法论、经验思考以及细节…

分享123个ASP源码,总有一款适合您

ASP源码 分享123个ASP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 123个ASP源码下载链接:https://pan.baidu.com/s/17G9rpRpCJX_D-6DV0j4uFg?pwd3rx8 提取码&#x…

qt json tree 读取json树状结构并显示

1.介绍 用qt的相关的几个类处理json格式的信息 json内容: { "root":{"sites": [{ "name":"菜鸟教程" , "url":"www.runoob.com" }, { "name":"google" , "url":&quo…

QT环境的搭建安装:VsCode及Qt Creator

前言: vscode的界面美观,并且和QT一样的跨平台,所以可以选择vscode作为开发环境。   QT5.9.X版本成熟,相应教程丰富,并且5.9.9版本具有生成CMake功能,所以本文以QT5.9.9版本为例,给出QT环境的…

美团出品 | YOLOv6 v3.0 is coming(性能超越YOLOv7、v8)

🚀🚀🚀美团出品 | YOLOv6 v3.0 is coming !!✨✨✨ 一、前言简介 🎄🎈 📚 代码地址:美团出品 | YOLOv6 3.0代码下载地址 📚 文章地址:https://a…

仿写Dubbo-Java反射

概念 反射是Java的一个特性,反射允许程序运行时动态获取类的所有信息以及对其进行操作。反射在框架(spring,springboot,mybatis等)中的使用非常的广发,可谓是框架的灵魂。 获取Class对象 在使用反射之前,需要获取到Cla…