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 11 Python
python迭代器与生成器详解
Mar 10 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
详解如何在Apache中运行Python WSGI应用
Jan 02 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
Python解析json代码实例解析
Nov 25 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
python logging模块的使用
Sep 07 Python
PyQt5爬取12306车票信息程序的实现
May 14 Python
python前后端自定义分页器
Apr 13 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 组件化编程技巧
2009/06/06 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
[00:17]DOTA2荣耀之路5:It’s a disastah!
2018/05/28 DOTA
利用Python读取文件的四种不同方法比对
2017/05/18 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
python issubclass 和 isinstance函数
2019/07/25 Python
基于python操作ES实例详解
2019/11/16 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
个人授权委托书模板
2014/09/14 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
python flappy bird小游戏分步实现流程
2022/02/15 Python
使用Redis实现分布式锁的方法
2022/06/16 Redis