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 Web框架Flask中使用七牛云存储实例
Feb 08 Python
详解Python的Django框架中的templates设置
May 11 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
python实现连续图文识别
Dec 18 Python
对python判断ip是否可达的实例详解
Jan 31 Python
Python切片操作去除字符串首尾的空格
Apr 22 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
Python循环结构的应用场景详解
Jul 11 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 Python
python实现坦克大战
Apr 24 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写的AES加密解密类分享
2014/06/20 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
vue中的非父子间的通讯问题简单的实例代码
2017/07/19 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
使用Python的内建模块collections的教程
2015/04/28 Python
python连接MySQL数据库实例分析
2015/05/12 Python
python实现数独算法实例
2015/06/09 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python调用支付宝支付接口流程
2019/08/15 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
python求前n个阶乘的和实例
2020/04/02 Python
EJB的基本架构
2016/09/22 面试题
学习方法演讲稿
2014/05/10 职场文书
2014年征兵标语
2014/06/20 职场文书
护林防火标语
2014/06/27 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
学校运动会报道稿
2014/09/23 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
python glom模块的使用简介
2021/04/13 Python
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js