图像识别中的图像转换

17 Mar 2025 | 5 分钟阅读

加载和转换是在 PyTorch 中进行图像识别的两个主要概念。加载和转换图像是识别过程的起始步骤。

以下步骤是执行加载和转换的分步过程

步骤 1

第一步,我们安装所有需要的库,例如 pip、torchvision、numpy 等。如果所有必需的库已经满足,那么我们导入 torch,然后从 torchvision 导入数据集和转换。为了绘制我们的数据集,我们将导入 matplotlib.pyplot 库,并且我们还将导入 numpy 来执行操作。这些库被导入为

步骤 2

在第二步中,我们使用数据集的 MNIST () 方法加载 MNIST 数据集。在第一个参数中,我们将数据的根目录指定为

在第二个参数中,我们设置 train='true'。我们将这样做以初始化 MNIST 训练数据集。之后,我们设置 download ='true',如果数据文件夹中尚不存在,这将下载一个列表到数据文件夹中。

最后一个参数将是 transform,它等于在 training_dataset 之前初始化的 transform1 参数。此参数指示您希望对图像应用的任何图像操作。

注意:我们的 MNIST 图像是 28*28 灰度图像,这意味着每个图像是一个二维数字数组,宽 28 像素,长 28 像素,并且每个像素的强度范围从 0 到 255。

我们必须将作为数组的图像转换为张量。我们将使用 transforms 的 Compose () 方法,它允许我们将多个转换链接在一起。所以我们的第一个转换,作为组合的第一个参数传递,将 transform.ToTensor()。这将把我们的 numpy 数组(范围从 0 到 255)转换为范围从 0 到 1 的浮点张量。

我们还将借助 transforms 的 normalize() 方法应用 normalize 转换,如下所示

在 normalize() 方法中,我们指定了用于对张量图像的所有通道进行归一化的均值,并且我们还指定了中心偏差。现在,我们调用我们的训练数据集为


Image Transforms in Image Recognition

步骤 3

我们将通过绘制图像来进一步分析此数据集。要绘制张量图像,我们必须将其变回 numpy 数组。我们将在一个函数 def im_convert() 中完成这项工作,该函数包含一个参数,该参数将是我们的张量图像。

在将张量转换为 numpy 数组之前,首先,我们将克隆它。它将创建一个张量的新副本,然后我们使用 detach() 函数,然后我们将使用 numpy 作为

注意:将转换为 numpy 数组的张量的形状具有第一、第二和第三维。第一维代表颜色通道,第二维和第三维代表图像的宽度和高度以及像素。

我们知道 MNIST 数据集中的每个图像都是一个灰度图像,对应于单个颜色通道,其宽度和高度为 28*28 像素。所以,形状应该是 (1, 28, 28)。

步骤 4

为了绘制我们的图像,需要图像的形状为 (28, 28, 1)。因此,我们将通过交换轴 0、1 和 2 来转置我们的图像为

此方法将轴 0 与轴 1 交换,将轴 1 与轴 2 交换。

步骤 5

在下一步中,我们对之前必须归一化的图像进行去归一化。归一化是通过减去均值并除以标准差来完成的。我们将乘以标准差并加上均值,如下所示

为了确保范围在 0 和 1 之间,我们使用 clip() 函数并将 0 和 1 作为参数传递。我们将把 clip 函数应用到最小值为 0,最大值为 1,然后返回图像。

步骤 6

现在,我们绘制我们的 MNIST 数据集以获得更好的可视化效果。我们将从 training_loader() 加载图像开始。训练加载器是我们之前在训练神经网络时用来指定训练批次的。对于每个 epoch,我们都会遍历整个数据集。但是,具有 60,000 张训练图像的一个 epoch 太大,无法一次全部放入计算机。所以我们将它分成更小的批次,使用我们的 train loader 作为

第一个参数是一个数据集,它等于我们的 training_dataset。第二个参数是我们的批次大小,它等于 100。第三个参数,我们将 shuffle 设置为 true。

注意:批次大小为 100 将需要 600 次迭代才能完成一个 epoch,并且每次迭代都会更新神经网络的权重并最小化误差。

步骤 7

在下一步中,我们包装我们的训练加载器。它将创建一个对象,该对象允许我们一次遍历可变的训练加载器的一个元素。我们通过在 dataiter 上调用 next 来一次访问一个元素。next () 函数将获取我们的训练数据的第一批,并且训练数据将分为图像和标签,如下所示

步骤 8

现在,我们将绘制批次中的图像及其对应的标签。这将借助 plt 的 figure 函数完成,并将 fig size 设置为整数元组 25*4,这将指定图形的宽度和高度。

现在,我们从批处理中绘制20个MNIST图像。我们使用add_subplot()方法将一个子图添加到当前图中,并将2、10和idx作为函数的参数传递。这里,2是行数,10是列数,idx是索引。

现在,我们将借助im_show()函数显示我们的图像,并为每个图像图添加标题,如下所示

最后调用 plt.show(),它将给我们预期的结果。


完整代码


Image Transforms in Image Recognition

Image Transforms in Image Recognition

现在,在这些标签图像的帮助下,我们将实现一个神经网络,该神经网络将对新的测试图像进行分类。