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

作者:WYXHAHAHA123 时间:2022-04-20 13:43:45 

如下所示:

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')

来源:https://blog.csdn.net/WYXHAHAHA123/article/details/87924745

标签:pytorch,图像预处理,均值,方差
0
投稿

猜你喜欢

  • 《Python学习手册》学习总结

    2021-09-17 08:55:01
  • 深入了解Golang中Slice切片的使用

    2023-09-25 08:59:08
  • Python开发自定义Web框架的示例详解

    2023-05-23 19:43:43
  • Python中的复杂数据类型(list、tuple)

    2023-06-07 10:10:19
  • 在Python中使用__slots__方法的详细教程

    2022-10-30 09:46:10
  • php中mysql连接方式PDO使用详解

    2023-11-06 02:46:43
  • python打印异常信息的两种实现方式

    2023-11-17 15:37:41
  • 值得收藏的10道python 面试题

    2022-04-22 12:10:33
  • Python Numpy教程之排序,搜索和计数详解

    2021-10-31 05:30:21
  • Web页面空间利用率的思考

    2009-07-03 12:45:00
  • Python文件读写及常用文件的打开方式

    2023-04-21 10:50:38
  • Python+Flask编写一个简单的行人检测API

    2023-09-26 17:55:19
  • Python实现高效求解素数代码实例

    2023-04-29 16:06:32
  • 你喜欢篮球吗?Python实现篮球游戏

    2023-10-26 00:28:36
  • python中wx将图标显示在右下角的脚本代码

    2022-10-27 02:26:53
  • 关于生成目录树结构的类

    2007-09-13 12:19:00
  • python实现录屏功能(亲测好用)

    2022-01-12 19:54:34
  • Mootools 1.2教程(17)——手风琴插件

    2008-12-11 13:39:00
  • Python中的装饰器用法详解

    2022-02-09 04:03:33
  • ORACLE常见错误代码的分析与解决(二)

    2010-08-02 13:31:00
  • asp之家 网络编程 m.aspxhome.com