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脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 Python
python每隔N秒运行指定函数的方法
Mar 16 Python
Python常用小技巧总结
Jun 01 Python
python压缩文件夹内所有文件为zip文件的方法
Jun 20 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
Python用for循环实现九九乘法表
May 31 Python
Python实现的爬虫刷回复功能示例
Jun 07 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
flask入门之表单的实现
Jul 18 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
详解python程序中的多任务
Sep 16 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+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
PDO::prepare讲解
2019/01/29 PHP
浅谈php调用python文件
2019/03/29 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
jQuery使用技巧简单汇总
2013/04/18 Javascript
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Pandas 同元素多列去重的实例
2018/07/03 Python
Django 内置权限扩展案例详解
2019/03/04 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
如何解决python多种版本冲突问题
2020/10/13 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
Django URL参数Template反向解析
2020/11/24 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
如何查找网页漏洞
2016/06/22 面试题
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
干部行政关系介绍信
2014/01/17 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
查摆剖析材料范文
2014/09/30 职场文书