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实现端口转发器的方法
Mar 13 Python
详解 Python 读写XML文件的实例
Aug 02 Python
python实现批量修改文件名代码
Sep 10 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
Python操作Jira库常用方法解析
Apr 10 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 11 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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
记录mysql性能查询过程的使用方法
2013/05/02 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
javascript入门·对象属性方法大总结
2007/10/01 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
js实现华丽的九九乘法表效果
2017/03/29 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
使用Python生成随机密码的示例分享
2016/02/18 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
浅述python2与python3的简单区别
2018/09/19 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
python多线程扫描端口(线程池)
2019/09/04 Python
python数据化运营的重要意义
2019/11/25 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
python3.4中清屏的处理方法
2020/07/06 Python
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
校园新闻广播稿
2014/01/10 职场文书
四好少年事迹材料
2014/01/12 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
村干部培训班主持词
2014/03/28 职场文书
小露珠教学反思
2014/04/30 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
师范大学生求职信
2014/06/13 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
导游词之镇江焦山
2019/11/21 职场文书
导游词之泰山玉皇顶
2019/12/23 职场文书