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 08 Python
python实现简单的TCP代理服务器
Oct 08 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
python数据结构之链表的实例讲解
Jul 25 Python
聊聊Python中的pypy
Jan 12 Python
python实现抖音视频批量下载
Jun 20 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
Python箱型图处理离群点的例子
Dec 09 Python
python如何处理程序无法打开
Jun 16 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
python中的split、rsplit、splitlines用法说明
Oct 23 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/06/14 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
用Mootools获得操作索引的两种方法分享
2011/12/12 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
js性能优化技巧
2015/11/29 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
trackingjs+websocket+百度人脸识别API实现人脸签到
2018/11/26 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
django接入新浪微博OAuth的方法
2015/06/29 Python
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
python爬取m3u8连接的视频
2018/02/28 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
Python selenium自动化测试模型图解
2020/04/15 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
银行领导证婚词
2014/01/11 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
初中家长评语和期望
2014/12/26 职场文书
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL
JavaScript文档对象模型DOM
2021/11/20 Javascript
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android