pytorch 图像预处理之减去均值,除以方差的实例


Posted in Python onJanuary 02, 2020

如下所示:

pytorch 图像预处理之减去均值,除以方差的实例

#coding=gbk
'''
GPU上面的环境变化太复杂,这里我直接给出在笔记本CPU上面的运行时间结果

由于方式3需要将tensor转换到GPU上面,这一过程很消耗时间,大概需要十秒,故而果断抛弃这样的做法

img (168, 300, 3)
sub div in numpy,time 0.0110
sub div in torch.tensor,time 0.0070
sub div in torch.tensor with torchvision.transforms,time 0.0050
tensor1=tensor2
tensor2=tensor3


img (1079, 1349, 3)
sub div in numpy,time 0.1899
sub div in torch.tensor,time 0.1469
sub div in torch.tensor with torchvision.transforms,time 0.1109
tensor1=tensor2
tensor2=tensor3


耗时最久的是numpy,其次是转换成torch.tensor,最快的是直接使用torchvision.transforms
我现在在GPU上面跑的程序GPU利用率特别低(大多数时间维持在2%左右,只有很少数的时间超过80%)
然后设置打印点调试程序时发现,getitem()输出一张图像的时间在0.1秒的数量级,这对于GPU而言是非常慢的
因为GPU计算速度很快,CPU加载图像和预处理图像的速度赶不上GPU的计算速度,就会导致显卡大量时间处于空闲状态
经过对于图像I/O部分代码的定位,发现是使用numpy减去图像均值除以方差这一操作浪费了太多时间,而且输入图像的分辨率越大,
所消耗的时间就会更多
原则上,图像预处理每个阶段的时间需要维持在0.01秒的数量级

所以,

'''

import numpy as np
import time
import torch
import torchvision.transforms as transforms
import cv2
# img_path='/ssddata2/wyx/detection/ead_stage12/stage12_img/WL_00387.jpg'
img_path='F:\\2\\00004.jpg'
PIXEL_MEANS =(0.485, 0.456, 0.406)  #RGB format mean and variances
PIXEL_STDS = (0.229, 0.224, 0.225)

#输入文件路径,输出的应该是转换成torch.tensor的标准形式

#方式一  在numpy中进行减去均值除以方差,最后转换成torch.tensor
one_start=time.time()
img=cv2.imread(img_path)
img=img[:,:,::-1]
img=img.astype(np.float32, copy=False)
img/=255.0
img-=np.array(PIXEL_MEANS)
img/=np.array(PIXEL_STDS)
tensor1=torch.from_numpy(img.copy())
tensor1=tensor1.permute(2,0,1)
one_end=time.time()
print('sub div in numpy,time {:.4f}'.format(one_end-one_start))

del img

#方式二 转换成torch.tensor,再减去均值除以方差
two_start=time.time()
img=cv2.imread(img_path)
img=img[:,:,::-1]
print('img',img.shape,np.min(img),np.min(img))
tensor2=torch.from_numpy(img.copy()).float()
tensor2/=255.0
tensor2-=torch.tensor(PIXEL_MEANS)
tensor2/=torch.tensor(PIXEL_STDS)
tensor2=tensor2.permute(2,0,1)
two_end=time.time()
print('sub div in torch.tensor,time {:.4f}'.format(two_end-two_start))

del img

#方式三 转换成torch.tensor,再放到GPU上面,最后减去均值除以方差
# three_start=time.time()
# img=cv2.imread(img_path)
# img=img[:,:,::-1]
# tensor3=torch.from_numpy(img.copy()).cuda().float()
# tensor3-=torch.tensor(PIXEL_MEANS).cuda()
# tensor3/=torch.tensor(PIXEL_STDS).cuda()
# three_end=time.time()
# print('sub div in torch.tensor on cuda,time {:.4f}'.format(three_end-three_start))

# del img

#方式四 转换成torch.tensor,使用transform方法减去均值除以方差
four_start=time.time()
img=cv2.imread(img_path)
img=img[:,:,::-1]
transform=transforms.Compose(
  [transforms.ToTensor(),transforms.Normalize(PIXEL_MEANS, PIXEL_STDS)]
)
tensor4=transform(img.copy())
four_end=time.time()
print('sub div in torch.tensor with torchvision.transforms,time {:.4f}'.format(four_end-four_start))

del img

if torch.sum(tensor1-tensor2)<=1e-3:
  print('tensor1=tensor2')
if torch.sum(tensor2-tensor4)==0:
  print('tensor2=tensor3')
# if tensor3==tensor4:
#   print('tensor3=tensor4')

以上这篇pytorch 图像预处理之减去均值,除以方差的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python转换摩斯密码示例
Feb 16 Python
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
Jun 10 Python
python3实现短网址和数字相互转换的方法
Apr 28 Python
进一步探究Python中的正则表达式
Apr 28 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
Jan 12 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
解读! Python在人工智能中的作用
Nov 14 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
基于python3的socket聊天编程
Feb 17 Python
Python和Bash结合在一起的方法
Nov 13 Python
Linux下升级安装python3.8并配置pip及yum的教程
Jan 02 #Python
pytorch实现focal loss的两种方式小结
Jan 02 #Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 #Python
基于torch.where和布尔索引的速度比较
Jan 02 #Python
Python魔法方法 容器部方法详解
Jan 02 #Python
python 图像的离散傅立叶变换实例
Jan 02 #Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 #Python
You might like
PHP 伪静态隐藏传递参数名的四种方法
2010/02/22 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
php+ajax简单实现全选删除的方法
2016/12/06 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
基于JQuery 选择器使用说明介绍
2013/04/18 Javascript
JavaScript中Function详解
2015/02/27 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
微信小程序表单弹窗实例
2018/07/19 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
python Flask实现restful api service
2017/12/04 Python
Python+tkinter模拟“记住我”自动登录实例代码
2018/01/16 Python
Python重新加载模块的实现方法
2018/10/16 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
2019/01/08 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
物业管理专业个人的自我评价
2013/11/19 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
大学新生军训自我鉴定
2014/03/18 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
副总经理岗位职责范本
2015/04/08 职场文书