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设置socket代理的方法
Jan 14 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
用matplotlib画等高线图详解
Dec 14 Python
Python实现动态添加属性和方法操作示例
Jul 25 Python
Python实现计算对象的内存大小示例
Jul 10 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
python线程信号量semaphore使用解析
Nov 30 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
python中子类与父类的关系基础知识点
Feb 02 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 Python
python实现学员管理系统(面向对象版)
Jun 05 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 作用域解析运算符(::)
2010/07/27 PHP
PHP禁止页面缓存的代码
2011/10/23 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
php提高网站效率的技巧
2015/09/29 PHP
PHP赋值的内部是如何跑的详解
2019/01/13 PHP
php如何把表单内容提交到数据库
2019/07/08 PHP
一个用js实现的页内搜索代码
2007/05/23 Javascript
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
详解Python的Django框架中的中间件
2015/07/24 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Python3计算三角形的面积代码
2017/12/18 Python
深入了解Python中pop和remove的使用方法
2018/01/09 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
python实现五子棋小游戏
2020/03/25 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
python中什么是面向对象
2020/06/11 Python
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
行政部总经理岗位职责
2014/01/04 职场文书
魅力教师事迹材料
2014/01/10 职场文书
给校长的一封检讨书
2014/09/20 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
离婚协议书范本
2015/01/26 职场文书
公司借款担保书
2015/09/22 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python