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的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
Python实现图片拼接的代码
Jul 02 Python
python hook监听事件详解
Oct 25 Python
快速排序的四种python实现(推荐)
Apr 03 Python
关于python导入模块import与常见的模块详解
Aug 28 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
Python上下文管理器全实例详解
Nov 12 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
python实现扫雷游戏的示例
Oct 20 Python
浅析Python中的套接字编程
Jun 22 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 变量定义方法
2009/06/14 PHP
php封装的page分页类完整实例
2016/10/18 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
JS二分查找算法详解
2017/11/01 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
[01:05:36]VP vs TNC Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
Python日期操作学习笔记
2008/10/07 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
详解python的变量缓存机制
2021/01/24 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
HTML5进度条特效
2014/12/18 HTML / CSS
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
公司联欢晚会主持词
2014/03/22 职场文书
作风大整顿心得体会
2014/09/10 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
大学生实习推荐信
2015/03/27 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android