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 相关文章推荐
linux下安装easy_install的方法
Feb 10 Python
python转换摩斯密码示例
Feb 16 Python
一个计算身份证号码校验位的Python小程序
Aug 15 Python
python脚本实现分析dns日志并对受访域名排行
Sep 18 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
新手常见6种的python报错及解决方法
Mar 09 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
python文件转为exe文件的方法及用法详解
Jul 08 Python
将python安装信息加入注册表的示例
Nov 20 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
Python reques接口测试框架实现代码
Jul 28 Python
Python利用zhdate模块实现农历日期处理
Mar 31 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使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
php实现的双色球算法示例
2017/06/20 PHP
js form action动态修改方法
2008/11/04 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
vue中axios处理http发送请求的示例(Post和get)
2017/10/13 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
详解Python验证码识别
2016/01/25 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
对numpy中轴与维度的理解
2018/04/18 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
Python更新所有已安装包的操作
2020/02/13 Python
python实现随机加减法生成器
2020/02/24 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
经典c++面试题三
2015/07/08 面试题
青年教师师德演讲稿
2014/08/26 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
学校施工安全责任书
2015/01/29 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android