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之折腾一下目录
Oct 24 Python
Python文件操作基本流程代码实例
Dec 11 Python
python编写Logistic逻辑回归
Dec 30 Python
python实现周期方波信号频谱图
Jul 21 Python
Python常用特殊方法实例总结
Mar 22 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
python打造爬虫代理池过程解析
Aug 15 Python
使用python的turtle绘画滑稽脸实例
Nov 21 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
python中for in的用法详解
Apr 17 Python
python绘图模块之利用turtle画图
Feb 12 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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自动生成后台导航网址的最佳方法
2013/08/27 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
javascript制作坦克大战全纪录(1)
2014/11/27 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
js实现进度条的方法
2015/02/13 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
python打开网页和暂停实例
2014/09/30 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
使用Python3制作TCP端口扫描器
2017/04/17 Python
破解安装Pycharm的方法
2018/10/19 Python
python中栈的原理及实现方法示例
2019/11/27 Python
python collections模块的使用
2020/10/16 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
Sixt美国租车:高端豪华车型自驾体验
2017/09/02 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
Java程序员面试题
2016/09/27 面试题
高中毕业生自我鉴定例文
2013/12/29 职场文书
怎样填写就业意向
2014/04/02 职场文书
岗位安全生产责任书
2014/07/28 职场文书
干部个人对照检查材料
2014/08/25 职场文书
Windows server 2016服务器基本设置
2022/08/14 Servers