pytorch学习—图像的加载/读取方式

pytorch学习—图像的加载/读取方式(转)

使用pytorch制作图像数据集时,需要将存储在磁盘、硬盘的图像读取到内存中,涉及到图像I/O问题。

在python中,图像处理主要采用的库:skimage, opencv-python, Pillow (PIL)。 这三个库均提供了图像读取的方法。

三种主流图像处理库的比较:

函数/方法返回值图像像素格式像素值范围图像矩阵表示
skimageio.imread(xxx)numpy.ndarrayRGB[0, 255](H X W X C)
cv2cv2.imread(xxx)numpy.ndarrayBGR[0, 255](H X W X C)
Pillow(PIL)Image.open(xxx)PIL.Image.Image对象根据图像格式,一般为RGB[0, 255]

  • 操作系统:ubuntu18.04
  • 显卡:GTX1080ti
  • python版本:2.7(3.7)
  • pycharm
  • pytorch1.0, opencv-python 3.4.3,skimage, numpy,PIL
  • QQ群加入深度学习交流群 获取更多环境配置细节和学习资料

实验内容

读取图像

准备一张测试图像,1200*1200 彩色24bit

在这里插入图片描述

显示图像:
从左到右分别为skimage, cv2, PIL 读取之后显示的图像。PIL读取的图像为PIL.Image.Image对象,无法用matplotlib直接显示,需要先转为numpy.ndarray对象。
图1,图3显示正常,图像显示不正常,因为opencv读取的图像为BGR格式,matplotllib使用RGB方式显示,图像通道顺序不一致。

image.png

图像转为torch.Tensor对象

在深度学习中,原始图像需要转换为深度学习框架自定义的数据格式,在pytorch中,需要转为torch.Tensor。
pytorch提供了torch.Tensornumpy.ndarray转换为接口:

方法名作用
torch.from_numpy(xxx) numpy.ndarray转为torch.Tensor
tensor1.numpy()获取tensor1对象的numpy格式数据

torch.Tensor 高维矩阵的表示: (nSample)x C x H x W

numpy.ndarray 高维矩阵的表示: H x W x C
因此在两者转换的时候需要使用numpy.transpose( ) 方法 。

Code


# ------------np.ndarray转为torch.Tensor------------------------------------
# numpy image: H x W x C
# torch image: C x H x W
# np.transpose( xxx,  (2, 0, 1))   # 将 H x W x C 转化为 C x H x W
tensor_skimage = torch.from_numpy(np.transpose(img_skimage, (2, 0, 1)))
tensor_cv = torch.from_numpy(np.transpose(img_cv, (2, 0, 1)))
tensor_pil = torch.from_numpy(np.transpose(img_pil_1, (2, 0, 1)))

torch.Tensor转numpy.ndarray

# np.transpose( xxx,  (2, 0, 1))   # 将 C x H x W 转化为 H x W x C
img_skimage_2 = np.transpose(tensor_skimage.numpy(), (1, 2, 0))
img_cv_2 = np.transpose(tensor_cv.numpy(), (1, 2, 0))
img_pil_2 = np.transpose(tensor_pil.numpy(), (1, 2, 0))

plt.figure()
for i, im in enumerate([img_skimage_2, img_cv_2, img_pil_2]):
ax = plt.subplot(1, 3, i + 1)
ax.imshow(im)
plt.pause(0.01)

显示:


image.png

opencv图像BGR->RGB操作

opencv默认读取的图像为BGR形式,可以使用opencv提供的方法:cv2.cvtColor( ) 进行图像颜色空间转换

# opencv 读取的图像为BGR
# 首先需要转为RGB
img_cv = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)
# 转torch.Tensor
tensor_cv = torch.from_numpy(img_cv)
# tensor转numpy
img_cv_2 = tensor_cv.numpy()
plt.figure()
plt.title('cv')
plt.imshow(img_cv_2)
plt.show()

显示:


image.png

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我会尽力回答你的问题。关于PyTorch读取加载图像数据的问题,我可以给你一些基本的介绍。 PyTorch提供了一个叫做torchvision的库,可以帮助我们方便地读取加载图像数据。它提供了很多常用的数据集,例如MNIST、CIFAR-10等,同时也支持自定义数据集的读取。 下面是一个简单的例子,展示了如何使用torchvision读取MNIST数据集: ```python import torch import torchvision import torchvision.transforms as transforms # 定义数据预处理方式 transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) # 加载MNIST数据集 trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True, num_workers=2) ``` 在这个例子中,我们首先定义了一个数据预处理方式,使用了transforms.ToTensor()将图片转换为tensor,并使用transforms.Normalize()进行归一化操作。接着,使用torchvision.datasets.MNIST()加载MNIST数据集,并使用torch.utils.data.DataLoader()将数据集封装成一个可迭代的数据加载器。通过设置batch_size和num_workers参数,我们可以控制每次加载的数据量和数据加载的并行程度。 需要注意的是,这里的数据加载器返回的是一个batch的数据,因此我们需要在训练过程中对每个batch的数据进行处理。具体的训练过程可以参考PyTorch官方文档或其他相关教程。 希望这个简单的例子能够帮助你了解如何使用PyTorch读取加载图像数据。如果你有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值