Pytorch 实现sobel算子的卷积操作详解


Posted in Python onJanuary 10, 2020

卷积在pytorch中有两种实现,一种是torch.nn.Conv2d(),一种是torch.nn.functional.conv2d(),这两种方式本质都是执行卷积操作,对输入的要求也是一样的,首先需要输入的是一个torch.autograd.Variable()的类型,大小是(batch,channel, H,W),其中batch表示输入的一批数据的数目,channel表示输入的通道数。

一般一张彩色的图片是3,灰度图片是1,而卷积网络过程中的通道数比较大,会出现几十到几百的通道数。H和W表示输入图片的高度和宽度,比如一个batch是32张图片,每张图片是3通道,高和宽分别是50和100,那么输入的大小就是(32,3,50,100)。

如下代码是卷积执行soble边缘检测算子的实现:

import torch
import numpy as np
from torch import nn
from PIL import Image
from torch.autograd import Variable
import torch.nn.functional as F
 
 
def nn_conv2d(im):
  # 用nn.Conv2d定义卷积操作
  conv_op = nn.Conv2d(1, 1, 3, bias=False)
  # 定义sobel算子参数
  sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')
  # 将sobel算子转换为适配卷积操作的卷积核
  sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))
  # 给卷积操作的卷积核赋值
  conv_op.weight.data = torch.from_numpy(sobel_kernel)
  # 对图像进行卷积操作
  edge_detect = conv_op(Variable(im))
  # 将输出转换为图片格式
  edge_detect = edge_detect.squeeze().detach().numpy()
  return edge_detect
 
def functional_conv2d(im):
  sobel_kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32') #
  sobel_kernel = sobel_kernel.reshape((1, 1, 3, 3))
  weight = Variable(torch.from_numpy(sobel_kernel))
  edge_detect = F.conv2d(Variable(im), weight)
  edge_detect = edge_detect.squeeze().detach().numpy()
  return edge_detect
 
def main():
  # 读入一张图片,并转换为灰度图
  im = Image.open('./cat.jpg').convert('L')
  # 将图片数据转换为矩阵
  im = np.array(im, dtype='float32')
  # 将图片矩阵转换为pytorch tensor,并适配卷积输入的要求
  im = torch.from_numpy(im.reshape((1, 1, im.shape[0], im.shape[1])))
  # 边缘检测操作
  # edge_detect = nn_conv2d(im)
  edge_detect = functional_conv2d(im)
  # 将array数据转换为image
  im = Image.fromarray(edge_detect)
  # image数据转换为灰度模式
  im = im.convert('L')
  # 保存图片
  im.save('edge.jpg', quality=95)
 
if __name__ == "__main__":
  main()

原图片:cat.jpg

Pytorch 实现sobel算子的卷积操作详解

结果图片:edge.jpg

Pytorch 实现sobel算子的卷积操作详解

以上这篇Pytorch 实现sobel算子的卷积操作详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python多重继承新算法C3介绍
Sep 28 Python
Python smallseg分词用法实例分析
May 28 Python
解决python中无法自动补全代码的问题
Dec 04 Python
使用Django2快速开发Web项目的详细步骤
Jan 06 Python
bluepy 一款python封装的BLE利器简单介绍
Jun 25 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 Python
如何利用Matlab制作一款真正的拼图小游戏
May 11 Python
Python进度条的使用
May 17 Python
Python学习之时间包使用教程详解
Mar 21 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
Jan 10 #Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 #Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 #Python
Ubuntu16.04安装python3.6.5步骤详解
Jan 10 #Python
Pytorch 保存模型生成图片方式
Jan 10 #Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 #Python
python如何获取apk的packagename和activity
Jan 10 #Python
You might like
三个类概括PHP的五种设计模式
2012/09/05 PHP
php提交表单发送邮件的方法
2015/03/20 PHP
PHP合并数组+号和array_merge的区别
2015/06/25 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
记录几个javascript有关的小细节
2007/04/02 Javascript
JavaScript Chart 插件整理
2010/06/18 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
JS和JQ的event对象区别分析
2014/11/24 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
js实现上传按钮并显示缩略图小轮子
2020/05/04 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
Python中协程用法代码详解
2018/02/10 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
什么是python的列表推导式
2020/05/26 Python
Python中常见的数制转换有哪些
2020/05/27 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
团队精神演讲稿
2013/12/31 职场文书
企业文化口号
2014/06/12 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python