pytorch 把图片数据转化成tensor的操作


Posted in Python onMarch 04, 2021

摘要:

在图像识别当中,一般步骤是先读取图片,然后把图片数据转化成tensor格式,再输送到网络中去。本文将介绍如何把图片转换成tensor。

一、数据转换

把图片转成成torch的tensor数据,一般采用函数:torchvision.transforms。通过一个例子说明,先用opencv读取一张图片,然后在转换;注意一点是:opencv储存图片的格式和torch的储存方式不一样,opencv储存图片格式是(H,W,C),而torch储存的格式是(C,H,W)。

import torchvision.transforms as transforms
import cv2 as cv
img = cv.imread('image/000001.jpg')
print(img.shape)  # numpy数组格式为(H,W,C)
transf = transforms.ToTensor()
img_tensor = transf(img) # tensor数据格式是torch(C,H,W)
print(img_tensor.size())

pytorch 把图片数据转化成tensor的操作

注意:使用torchvision.transforms时要注意一下,其子函数 ToTensor() 是没有参数输入的,以下用法是会报错的

img_tensor = transforms.ToTensor(img)

必须是先定义和赋值转换函数,再调用并输入参数,正确用法:

img = cv.imread('image/000001.jpg')
transf = transforms.ToTensor()
img_tensor = transf(img)

再转换过程中正则化

在使用 transforms.ToTensor() 进行图片数据转换过程中会对图像的像素值进行正则化,即一般读取的图片像素值都是8 bit 的二进制,那么它的十进制的范围为 [0, 255],而正则化会对每个像素值除以255,也就是把像素值正则化成 [0.0, 1.0]的范围。通过例子理解一下:

import torchvision.transforms as transforms
import cv2 as cv
img = cv.imread('image/000001.jpg')
transf = transforms.ToTensor()
img_tensor = transf(img)
print('opencv', img)
print('torch', img_tensor)

pytorch 把图片数据转化成tensor的操作

pytorch 把图片数据转化成tensor的操作

三、自行修改正则化的范围

使用transforms.Compose函数可以自行修改正则化的范围,下面举个例子正则化成 [-1.0, 1.0]

transf2 = transforms.Compose(
  [
    transforms.ToTensor(),
    transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
  ]
)
img_tensor2 = transf2(img)
print(img_tensor2)

pytorch 把图片数据转化成tensor的操作

计算方式就是:

C=(C-mean)/ std

C为每个通道的所有像素值,彩色图片为三通道图像(BGR),所以mean和std是三个数的数组。

使用transforms.ToTensor()时已经正则化成 [0,0, 0,1]了,那么(0.0 - 0.5)/0.5=-1.0,(1.0 - 0.5)/0.5=1.0,所以正则化成 [-1.0, 1.0]

补充:Python: 记录一个关于图片直接转化为pytorch.tensor和numpy.array的不同之处的问题

img = Image.open(img_path).convert("RGB")
img2 = torchvision.transforms.functional.to_tensor(img)
print(img2)
img1 = np.array(img)
print(img1)

输出是这样的:

pytorch 把图片数据转化成tensor的操作

不仅shape不一样,而且值也是不一样的。

解释如下:

tensor = torch.from_numpy(np.asarray(PIL.Image.open(path))).permute(2, 0, 1).float() / 255
tensor = torchvision.transforms.functional.to_tensor(PIL.Image.open(path)) # 两种方法是一样的

PIL.Image.open()得到HWC格式,直接使用numpy 去转换得到(h,w,c)格式,而用to_tensor得到(c,h,w)格式且值已经除了255。

byte()相当于to(torch.uint8),tensor.numpy()是把tensor 转化为numpy.array格式。

在这里需要注意的是PIL和OPENCV的图像读取得到的格式都是HWC格式,一般模型训练使用的是CHW格式, H为Y轴是竖直方向,W为X轴水平方向。

且torchvision.transforms.functional.to_tensor()对所有输入都是有变换操作。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
Python、Javascript中的闭包比较
Feb 04 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
python是否适合网页编程详解
Oct 04 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
PyTorch中反卷积的用法详解
Dec 30 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 #Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 #Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 #Python
python 求两个向量的顺时针夹角操作
Mar 04 #Python
python 制作磁力搜索工具
Mar 04 #Python
python抢购软件/插件/脚本附完整源码
Mar 04 #Python
Python 求向量的余弦值操作
Mar 04 #Python
You might like
PHP HTML代码串 截取实现代码
2009/06/29 PHP
PHP 编程安全性小结
2010/01/08 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
JQuery优缺点分析说明
2010/06/09 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
jquery把int类型转换成字符串类型的方法
2016/10/07 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
vuex实现的简单购物车功能示例
2019/02/13 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
Python卸载模块的方法汇总
2016/06/07 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Python面向对象魔法方法和单例模块代码实例
2020/03/25 Python
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
简单的JAVA编程面试题
2013/03/19 面试题
停车位租赁协议书
2014/09/24 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS