pytorch 图像的卷积操作

目录

1.卷积核基本参数说明

 2.卷积相关操作说明

3.卷积操作示例


 

     1.卷积核基本参数说明

         pytorch进行图像卷积操作之前,需要把图像素格式进行分离,比如一个图像为rgb格式,把R,G,B取出来作为一个ndarray,前文讲过,在pytorch中进行图像转Tensor,大小变换,相关处理的库,基本都放在 from torchvision import transforms里面,对于把正常的图像转换为单独的RGB的ndarray,并且归一化,使用 transforms.ToTensor即可一次性完成转换。在训练图像相关模型的时候,主要是训练卷积核的参数,一般的3*3的卷积核结构如代码所示:

import cv2
import osimport numpy as np
import torch
import torchvision
from torchvision import transforms
from PIL import Image
from torch import nn
from matplotlib import pyplot as plt
from torchvision import transforms
#定义卷积核心,bias为False则不要偏置参数
#输入通道为3,输出通道为1,卷积核大小为3*3,偏置为真
cov = nn.Conv2d(3,1,3,bias=True)
print(cov.state_dict())'''
OrderedDict([('weight', tensor([[[[ 0.1062,  0.0600, -0.0675],[-0.0303,  0.0045, -0.0276],[ 0.0114,  0.1434, -0.1323]],[[-0.0622, -0.0029, -0.0695],[-0.0282, -0.0664, -0.0157],[ 0.0037, -0.0900, -0.0588]],[[-0.1231, -0.1717,  0.1089],[ 0.0051,  0.1269, -0.0846],[-0.0662,  0.0817,  0.1689]]]])), ('bias', tensor([0.0631]))])进程已结束,退出代码为 0
'''
 2.卷积相关操作说明

       用transforms.ToTensor把图像分为RGB单独通道且归一化后,就可以对图像进行卷积操作,示例代码如图:

import cv2
import os
import numpy as np
import torch
import torchvision
from torchvision import transforms
from PIL import Image
from torch import nn
from matplotlib import pyplot as plt
from torchvision import transformscov = nn.Conv2d(3,1,3,bias=True)
# print(cov.state_dict())
#初始化卷积核所以参数为0.5
for x in cov.parameters():nn.init.constant_(x,0.5)print(cov.state_dict())
d = torch.ones(3,6,6)
d = torch.unsqueeze(d,0)
print(d)
c = cov(d)
print(c)'''
OrderedDict([('weight', tensor([[[[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000]],[[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000]],[[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000],[0.5000, 0.5000, 0.5000]]]])), ('bias', tensor([0.5000]))])
tensor([[[[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.]],[[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1.]]]])
tensor([[[[14., 14., 14., 14.],[14., 14., 14., 14.],[14., 14., 14., 14.],[14., 14., 14., 14.]]]], grad_fn=<ConvolutionBackward0>)
'''

        从示例代码可以看出,因为我们定义的3通道输入的3*3卷积核心,就生成了3个3*3的核心,3个核心分比对3个通道进行卷积((对应位置直接相乘)然后求和加偏置),得出输出,同理如果定义卷积核输出为三,那么就会定义3*3=9个卷积核每三个卷积核分别对图像进行卷积操作,得出三个输出通道。

3.卷积操作示例

        以一张图像为例打开图像,定义卷积核进行卷积操作:

import cv2
import os
import numpy as np
import torch
import torchvision
from torchvision import transforms
from PIL import Image
from torch import nn
from matplotlib import pyplot as plt
from torchvision import transformscov = nn.Conv2d(3,3,3,bias=True)
for x in cov.parameters():nn.init.constant_(x,0.05)
print(cov.state_dict())img = cv2.imread("E:/test/pythonProject/test.jpg")
img = cv2.resize(img,dsize=(320,240))
print('img.shape',img.shape)
trans = transforms.ToTensor()
timg = trans(img)
print('timg.shape',timg.shape)
cimg = cov(timg)
print('cimg.shape',cimg.shape)timg = timg.permute(1,2,0)
ta = timg.numpy()cimg = cimg.permute(1,2,0)
ca = cimg.data.numpy()cv2.imshow("test",img)
cv2.imshow("ta",ta)
cv2.imshow("cimg",ca)cv2.waitKey()'''
OrderedDict([('weight', tensor([[[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]]],[[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]]],[[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]],[[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500],[0.0500, 0.0500, 0.0500]]]])), ('bias', tensor([0.0500, 0.0500, 0.0500]))])
img.shape (240, 320, 3)
timg.shape torch.Size([3, 240, 320])
cimg.shape torch.Size([3, 238, 318])进程已结束,退出代码为 0
'''

        这里定义的卷积核输入为3通道,输出为3通道,这里三组卷积核,每组卷积核包含三个卷积核,三个卷积核分别对三个通道进行卷积,最后每组输出一个通道,三组输出三个通道图像,因为卷积核参数一样,所以最后卷积输出的RGB值相等,输出灰色图像。

这里注意:

cimg = cimg.permute(1,2,0)

这个函数是进行维度调换,理解不了,可以先把他转为numpy,再用cv2.merge((r,g,b))函数进行融合,cv2.split(imgt) 可以把图像重新分为 r g b 的numpy.ndarray结构,如代码所示:

t = cimg.data.numpy()r = t[0]
g = t[1]
b = t[2]imgt = cv2.merge((r,g,b))
r,g,b = cv2.split(imgt)
print(r.shape,g.shape,b.shape)cv2.imshow("imgt",imgt)
cv2.waitKey()'''
(238, 318) (238, 318) (238, 318)
'''

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

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

相关文章

Linux 下 socket 编程介绍及 TCP 客户端与服务端创建示例

目录 socket 编程接口TCP 服务端TCP 客户端更多内容 本文介绍了 Linux 下的 socket 编程&#xff0c;及总结了使用 socket 接口实现 TCP 服务端和客户端的示例代码。 socket 编程接口 socket() 函数&#xff1a;用于创建一个新的 socket 描述符&#xff1a; int socket(int …

Linux内核MMC框架

1.mmc的概念 1.MMC MultiMedia Card&#xff0c;多媒体存储卡&#xff0c; 但后续泛指一个接口协定&#xff08;一种卡式&#xff09;&#xff0c;能符合这接口的内存器都可称作mmc储存体,工作电压&#xff1a;高电压为2.7&#xff5e;3.6 V&#xff0c;低电压为1.65&#xf…

【微服务】微服务中常用认证加密方案总结

目录 一、前言 二、登录认证安全问题 3.1 认证方式选择 三、常用的加密方案 3.1 MD5加密算法 3.1.1 md5特点 3.1.2 md5原理 3.1.3 md5使用场景 3.2 AES加密算法 3.2.1 AES简介 3.2.2 AES加解原理 3.2.3 AES算法优缺点 3.2.4 AES算法使用场景 3.3 RSA加密算法 3.3…

Flutter Dio进阶:使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新

Flutter笔记 使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

金融业被网络攻击了怎么办,如何治理和风险控制?

近年来&#xff0c;网络罪犯的人数和复杂程度都在增加&#xff0c;网络罪犯的目标锁定变得更具策略性&#xff0c;更加专注于最大效率和获利。随着有关全球网络犯罪的数据持续涌入&#xff0c;可以看出金融服务企业已然成为头号锁定目标。虽然金融服务企业在网络安全人员、工具…

图论例题解析

1.图论基础概念 概念 &#xff08;注意连通非连通情况&#xff0c;1节点&#xff09; 无向图&#xff1a; 度是边的两倍&#xff08;没有入度和出度的概念&#xff09; 1.完全图&#xff1a; 假设一个图有n个节点&#xff0c;那么任意两个节点都有边则为完全图 2.连通图&…

【MySQL】SQL 优化

MySQL - SQL 优化 1. 在 MySQL 中&#xff0c;如何定位慢查询&#xff1f; 1.1 发现慢查询 现象&#xff1a;页面加载过慢、接口压力测试响应时间过长&#xff08;超过 1s&#xff09; 可能出现慢查询的场景&#xff1a; 聚合查询多表查询表数据过大查询深度分页查询 1.2 通…

错误笔记:Anaconda 错误(闪退、无法安装等) + Pycharm 错误(无法启动)+ python 报错

Anaconda 错误 1、导航器启动中发生-- 闪退 方法一&#xff1a; Windows下&#xff1a; 1&#xff09;使用管理员运行&#xff1a;conda prompt 2&#xff09;执行命令 conda update anaconda-navigator 方法二&#xff1a; 重置Anaconda配置&#xff1a;anaconda-navigator…

C语言第三十四弹---动态内存管理(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、动态内存经典笔试题分析 1.1、题目1 1.2、题目2 1.3、题目3 1.4、题目4 2、柔性数组 2.1、柔性数组的特点 2.2、柔性数组的使用 2.3、…

【c++】计算树的深度和节点数

在C语言中&#xff0c;计算给定树的层数&#xff08;深度&#xff09;和节点总数通常需要使用递归方法。首先&#xff0c;我们需要定义树的节点结构。这里假设我们处理的是一棵二叉树&#xff0c;每个节点有两个子节点&#xff08;左子节点和右子节点&#xff09;。 下面是一个…

5.STL源码解析-算法、仿函数、适配器

算法 STL算法总览 仿函数与适配器 C标准模板库&#xff08;STL&#xff09;是C程序员的得力工具&#xff0c;提供了许多强大而高效的数据结构和算法。在STL中&#xff0c;仿函数&#xff08;Functor&#xff09;和适配器&#xff08;Adapter&#xff09;是两个重要的概念…

C语言文件操作(fputs() 和 puts() 有两个小区别)

fputs() 和 puts() 有两个小区别&#xff1a; 1.puts() 只能向标准输出流输出&#xff0c;而 fputs() 可以向任何流输出。 2.使用 puts() 时&#xff0c;系统会在自动在其后添加换行符&#xff1b;而使用 fputs() 时&#xff0c;系统不会自动添加换行符。 那么这是不是意味着使…

【C++精简版回顾】17.io流,流中提供的函数

1.流含义 2.流类 3.流对象 4.流对象的函数 举例&#xff1a; 要求&#xff1a;数据结构中经常需要对齐输出数据&#xff0c;应该怎么做&#xff1f; 1.头文件 #include<iomanip> 2.创建表格头 cout << setiosflags(ios::left) << setw(8) << "姓名…

BUGKU 网站被黑

打开环境&#xff0c;什么都没发现&#xff0c;使用蚁剑扫描一下&#xff0c;发现shell.php&#xff0c;打开 使用BP抓包&#xff0c;进行爆破 得到密码&#xff1a;hack 进去得到flag

GEE高阶应用python wxee——如何利用来自 GOES-16 和 MODIS 的数据来可视化火灾随时间的进展分析

火灾进展 wxee 是专为处理气象数据而设计的,但它对遥感数据也很有用。在本示例中,我们将了解 wxee 如何利用来自 GOES-16 和 MODIS 的数据来可视化火灾随时间的进展情况。 安装和设定 #!pip install wxeeimport ee import wxeeee.Authenticate() wxee.Initialize(project=x…

每日一类:QLabel深入解析

QLabel是Qt中用于显示文本或图像的控件&#xff0c;属于Qt Widgets模块。它是展示静态内容的理想选择&#xff0c;支持富文本格式&#xff0c;使得文本可以包含不同的字体、颜色和链接。QLabel也可以用来显示图像&#xff0c;包括动态图像。此外&#xff0c;它还支持文本和图像…

【Java面试题】SpringBoot与Spring的区别

主要区别体现几个方面&#xff1a; 1.操作简便性 SpringBoot提供极其快速和简化的操作&#xff0c;使得Spring开发者能更快速上手。它通过提供spring的运行配置&#xff0c;以及为通用spring项目提供许多非功能性特性&#xff0c;进一步简化了开发过程。 2.框架扩展性 Spri…

算法学习——差分

在了解差分之前&#xff0c;我们首先需要知道前缀和的概念。 前缀和简单介绍&#xff1a; 对于一个数组A&#xff0c;要求出A[0]~A[i]的和&#xff0c;我们通常的做法是遍历一边&#xff0c;加起来。但是要求m组这样的和&#xff0c;我们就要花费O(mn)的时间复杂度。显然不合…

【考研数学】汤家凤1800题什么水平?

我觉得汤家凤基础武忠祥强化这个组合非常的不错 汤家凤老师的讲课风格 汤家凤老师的基础课程是大家公认的讲的详细&#xff0c;并且非常照顾基础不好的学生&#xff0c;会把基础知识点掰开揉碎的讲给大家听&#xff0c;在上课过程中&#xff0c;还会把知识点写在A4纸上&#…

试了下新型的360AI搜索

360AI搜索 试了下&#xff0c;感觉还是挺不错的。 比如问这个问题&#xff1a; ERROR 1698 (28000): Access denied for user rootlocalhost 它的回答&#xff1a; 对于ERROR 1698 (28000): Access denied for user rootlocalhost的问题&#xff0c;这通常是由于MySQL密码为…