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 列表排序方法reverse、sort、sorted详解
Jan 22 Python
python简单读取大文件的方法
Jul 01 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
python中pika模块问题的深入探究
Oct 13 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
基于Python实现一个春节倒计时脚本
Jan 22 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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开发模式(简写版)
2007/03/15 PHP
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python zip()函数用法实例分析
2018/03/17 Python
python中的print()输出
2019/04/12 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
个人工作表现评价材料
2014/09/21 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
三下乡个人总结
2015/03/04 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python
Django框架模板用法详解
2022/06/10 Python
Apache自带的ab压力测试工具的实现
2022/07/23 Servers