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转换摩斯密码示例
Feb 16 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
python语音识别实践之百度语音API
Aug 30 Python
在Python 字典中一键对应多个值的实例
Feb 03 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
python实现低通滤波器代码
Feb 26 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python os.listdir()乱码解决方案
Jan 31 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(2)
2006/10/09 PHP
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
简单通用的JS滑动门代码
2008/12/19 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
javascript模拟命名空间
2015/04/17 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
大学生全国两会报告感想
2014/03/17 职场文书
艺术节主持词
2014/04/02 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
2014年护理部工作总结
2014/11/14 职场文书
加入学生会自荐书
2015/03/05 职场文书
离职信范文
2015/06/23 职场文书
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers