Pytorch图像处理,显示与保存

  • A+
所属分类:深度学习
摘要这一篇主要介绍关于Pytorch中进行图像处理的一些操作, 包括图像的处理(大小裁剪, 归一化, 转换为tensor), 接着介绍pytorch中的make_grid和save_image的使用.

简介

这一篇文章我们主要会介绍在使用Pytorch的时候, 我们的数据集是图像的时候的一些操作. 之前也是零散的写过一些pytorch中图像的处理, 如Pytorch中图片数据集处理方式,我们在这里集中的描述一下.

这里主要会介绍以下的内容:

  • 图像的标准化, 为什么要使用0.5来作为标准化的值.
  • 使用ImageFolder来完成图片数据集的导入.
  • 使用make_grid来完成图像的显示.
  • 使用save_image来完成图像的保存.

Pytorch图像处理

图像的标准化

我们通常会使用如下的方式对图像进行处理, 我们会控制图像的大小, 转换为tensor, 同时进行标准化.

  1. trans = transforms.Compose([
  2.     transforms.Resize(64),
  3.     transforms.ToTensor(),
  4.     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
  5. ])

下面简单说明以下为什么标准化里的参数都是0.5, 这可以保证标准化之后的图像的像素值在-1到1之间. 这是因为: For example, the minimum value 0 will be converted to (0-0.5)/0.5=-1, the maximum value of 1 will be converted to (1-0.5)/0.5=1.

我们可以使用下面的方式将像素值进行还原: image = ((image * std) + mean)

参考资料: Understanding transform.Normalize( )

图像的导入

接着就是图像进行导入, 在pytorch中图像的导入也是十分方便的, 我们可以使用如下的方式进行图像的导入.

  1. # 注意这里文件夹的路径
  2. dataset = datasets.ImageFolder('./data', transform=trans) # 数据路径
  3. dataloader = torch.utils.data.DataLoader(dataset,
  4.                                      batch_size=16, # 批量大小
  5.                                      shuffle=True# 乱序
  6.                                      num_workers=2 # 多进程
  7.                                      )

我们需要注意文件夹的路径的设置.

  1. root/dog/xxx.png
  2. root/dog/xxy.png
  3. root/dog/xxz.png
  4. root/cat/123.png
  5. root/cat/nsdf3.png
  6. root/cat/asd932_.png

就是他只需要写到root目录, 然后把每一类图片分别放在对应的文件夹内. 我们不能直接将图片放在root目录下, 不然就会出现如下的报错: RuntimeError: Found 0 images in subfolders of: ./data

上面报错解决链接: RuntimeError: Found 0 images in subfolders of: ./data

使用make_grid显示图像

接着我们说明以下make_grid的使用方式, 他可以方便的进行图片的显示, 下面简单说一下使用的方式, 具体的使用方式可以参考官方的文档: TORCHVISION.UTILS

make_grid可以使得图像按照网格进行排列, 我们下面来看一个例子. 也讲一下其中的参数的作用.

首先定义show函数, 用来显示图片. 图像的大小可以在这里进行修改(figsize).

  1. def show(img):
  2.     """
  3.     用来显示图片的
  4.     """
  5.     plt.figure(figsize=(12, 8))
  6.     npimg = img.numpy()
  7.     plt.imshow(np.transpose(npimg, (1,2,0)), interpolation='nearest')

接着我们先随便看一个例子

  1. show(make_grid(test_pic, nrow=6, padding=2, normalize=Truerange=None, scale_each=False, pad_value=0))
Pytorch图像处理,显示与保存

我们可以通过修改nrow来修改每一行的图片的数量, 同时padding表示图片之间的间距, pad_value表示图片之间填充的颜色. 我们可以分别来看下面的两个例子.

  1. show(make_grid(test_pic, nrow=8, padding=1, normalize=Truerange=(-1, 1), scale_each=False, pad_value=0.5))
Pytorch图像处理,显示与保存

下面的padding就比较大, 可以很明显的看出区别来.

  1. # padding: 图片与图片之间的空隙
  2. # pad_value: 填充的颜色
  3. show(make_grid(test_pic, nrow=8, padding=100, normalize=Truerange=(-1, 1), scale_each=False, pad_value=0.9))
Pytorch图像处理,显示与保存

使用save_image保存图像

关于save_image的主要参数和上面的make_grid是一样的, 这里就不多做介绍, 就直接看一下例子.

  1. save_image(test_pic, 'test.png', nrow=6, padding=2, normalize=Truerange=(-1,1), scale_each=False, pad_value=0)

最终保存的图片如下所示.

Pytorch图像处理,显示与保存
  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: