PyTorch图像识别中的图像转换(实例分析)

加载和转换是在PyTorch中进行图像识别必不可少的两个主要概念。图像的加载和转换是识别过程的开始。
有以下步骤是逐步进行加载和转换的过程:
步骤1:
第一步, 我们安装所有必需库, 例如pip, torchvision, numpy等。如果已经满足所有必需库的要求, 则导入Torch, 然后导入数据集并从Torchvision进行转换。为了绘制数据集, 我们将导入matplotlib.pyplot库, 还将导入numpy以执行操作。这些库被导入为:

import torchimport matplotlib.pyplot as pltimport numpy as npfrom torchvision import datasets, transforms

第2步:
在第二步中, 我们使用数据集的MNIST()方法加载MNIST数据集。在第一个参数中, 我们指定数据的根目录如下
training_dataset=datasets.MNIST(root='./data')

在第二个参数中, 我们设置train =’ true’ 。我们将执行此操作以初始化MNIST训练数据集。在那之后, 我们设置download =’ true’ , 这将把列表下载到数据文件夹中(如果尚未存在)。
Training_dataset=datasets.MNIST(root='./data', train=True, download=True)

最后一个参数将是transform, 它等于将在training_dataset之前初始化的transform1参数。该参数指示你希望对图像进行的任何图像处理。
training_dataset=datasets.MNIST(root='./data', train=True, download=True, transform=transform1)

注意:我们的MNIST图像是28 * 28灰度图像, 这意味着每幅图像都是二维数组, 其数组为28像素宽和28像素长, 并且每个像素的强度范围为0到255。 我们必须将数组中的图像转换为张量。我们将使用Compose()转换方法, 使我们可以将多个转换链接在一起。因此, 我们的第一个转换(作为composited的第一个参数传递)将是transform.ToTensor()。这会将介于0到255之间的numpy数组转换为介于0到1之间的浮点张量。
transform1=transforms.Compose([transforms.ToTensor()])

我们还将借助transforms的normalize()方法来应用normalize转换:
transform1=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, ), (0.5, ))])

在normalize()方法中, 我们指定了用来标准化张量图像所有通道的均值, 并且还指定了中心偏差。现在, 我们将训练数据集称为:
training_dataset

PyTorch图像识别中的图像转换(实例分析)

文章图片
第三步:
我们将通过绘制进一步分析该数据集中的图像。要绘制张量图像, 我们必须将其更改回numpy array。我们将在函数def im_convert()中完成此工作, 该函数包含一个将成为张量图像的参数。
def im_convert(tensor):

在将张量转换为numpy数组之前, 我们将对其进行克隆。它将创建张量的新副本, 然后我们使用detach()函数, 然后将numpy用作:
image=tensor.clone().detach().numpy()

注意:将转换为numpy数组的张量具有第一, 第二和第三维的形状。第一维表示颜色通道, 第二维和第三维表示图像和像素的宽度和高度。 我们知道MNIST数据集中的每个图像都是对应于单个彩色通道的灰度, 其宽度和高度为28 * 28像素。因此, 形状将为(1、28、28)。
步骤4:
为了绘制图像, 要求图像的形状为(28, 28, 1)。因此, 通过将轴零, 一和二交换为:
image=image.transpose(1, 2, 0)

此方法将轴0与轴1交换, 轴1与轴2交换。
步骤5:
在下一步中, 我们对图像进行归一化, 而之前我们必须对其进行归一化。通过减去平均值并除以标准偏差来完成归一化。我们将乘以标准偏差, 然后将平均值相加为:
image=image*(np.array((0.5, 0.5, 0.5))+np.array((0.5, 0.5, 0.5)))

为了确保介于0和1之间的范围, 我们使用了clip()函数并传递了零和一作为参数。我们将clip函数应用到最小值0和最大值1并返回图像。
image=image.clip(0, 1)return image

步骤6:
现在, 我们绘制MNIST数据集以实现更好的可视化。我们将从从training_loader()加载图像开始。训练加载器是我们以前在训练神经网络时用来指定训练批次的工具。对于每个时期, 我们都对整个数据集进行了一次遍历。但是, 一个具有六万张训练图像的时期太大了, 无法同时容纳所有计算机。因此, 我们将使用火车装载机将其分成较小的批次:
training_loader=torch.utils.data.DataLoader(dataset=training_dataset, batch_size=100, shuffle=True)

第一个参数是一个数据集, 它等于我们的training_dataset。第二个参数是批处理大小, 等于100。第三个参数, 我们将shuffle设置为true。
注意:批处理大小为100, 将需要600次迭代才能完成一个纪元, 并且每次迭代将更新神经网络的权重并使错误最小化。 步骤7:
下一步, 我们包装火车装载机。它将创建一个对象, 该对象使我们可以一次通过一个可变的训练加载器。我们通过在dataiter上调用next来一次访问一个元素。 next()函数将获取我们的第一批训练数据, 并且该训练数据将被分为以下图像和标签:
dataiter=iter(training_loader)images, labels=dataiter.next()

步骤8:
现在, 我们将批量绘制图像及其相应的标签。这将借助于plt的图形功能来完成, 并且将无花果的大小设置为等于整数25 * 4的元组, 这将指定图形的宽度和高度。
fig=plt.figure(figsize=(25, 4))

现在, 我们从批次中绘制20个MNIST图像。我们使用add_subplot()方法向当前图形添加一个子图, 并将2、10和idx作为函数的参数传递。这里有两个没有行, 十个没有列, idx是索引。
ax=fig.add_subplot(2, 10, idx+1)

现在, 我们将在im_show()函数的帮助下显示图像, 并为每个图像绘图指定一个标题:
plt.imshow(im_convert(images[idx])) ax.set_title([labels[idx].item()])

最后调用plt.show(), 它将为我们提供预期的结果。
完整的代码
import torchimport matplotlib.pyplot as pltimport numpy as npfrom torchvision import datasets, transforms transform1=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5, ), (0.5, ))])training_dataset=datasets.MNIST(root='./data', train=True, download=True, transform=transform1)training_loader=torch.utils.data.DataLoader(dataset=training_dataset, batch_size=100, shuffle=True)def im_convert(tensor):image=tensor.clone().detach().numpy()image=image.transpose(1, 2, 0)print(image.shape)image=image*(np.array((0.5, 0.5, 0.5))+np.array((0.5, 0.5, 0.5)))image=image.clip(0, 1)return imagedataiter=iter(training_loader)images, labels=dataiter.next()fig=plt.figure(figsize=(25, 4))for idx in np.arange(20):ax=fig.add_subplot(2, 10, idx+1)plt.imshow(im_convert(images[idx]))ax.set_title([labels[idx].item()])plt.show()

PyTorch图像识别中的图像转换(实例分析)

文章图片
PyTorch图像识别中的图像转换(实例分析)

文章图片
【PyTorch图像识别中的图像转换(实例分析)】现在, 借助这些标签图像, 我们将实现一个神经网络, 对新的测试图像进??行分类。

    推荐阅读