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 相关文章推荐
详解django中自定义标签和过滤器
Jul 03 Python
python抽取指定url页面的title方法
May 11 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
python os模块简单应用示例
May 23 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
详解Python的三种拷贝方式
Feb 11 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
基于Python实现全自动下载抖音视频
Nov 06 Python
golang中的空接口使用详解
Mar 30 Python
Django + Taro 前后端分离项目实现企业微信登录功能
Apr 07 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获取远程图片并把它保存到本地的代码
2008/04/07 PHP
PHP 变量定义和变量替换的方法
2009/07/30 PHP
两种php实现图片上传的方法
2016/01/22 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
vue基于element的区间选择组件
2018/09/07 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
TensorFlow Session会话控制&amp;Variable变量详解
2018/07/30 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
python通过http下载文件的方法详解
2019/07/26 Python
python实现简易学生信息管理系统
2020/04/05 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
美术毕业生求职信
2014/02/25 职场文书
学习心理学的体会
2014/11/07 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python