📜  图像识别中的图像转换

📅  最后修改于: 2020-11-11 00:58:17             🧑  作者: Mango

图像识别中的图像转换

加载和转换是在PyTorch中进行图像识别必不可少的两个主要概念。图像的加载和转换是识别过程的开始。

有以下步骤是逐步进行加载和转换的过程:

步骤1:

第一步,我们安装所有必需库,例如pip,torchvision,numpy等。如果已经满足所有必需库的要求,则导入Torch,然后导入数据集并从Torchvision进行转换。为了绘制数据集,我们将导入matplotlib.pyplot库,还将导入numpy以执行操作。这些库被导入为:

import torch
import matplotlib.pyplot as plt
import numpy as np
from 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()。这会将我们的numpy数组从0到255转换为一个从0到1的float张量。

transform1=transforms.Compose([transforms.ToTensor()])

我们还将借助transforms的normalize()方法将normalize转换应用于:

transform1=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,))])

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

training_dataset

第三步:

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

def im_convert(tensor):

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

image=tensor.clone().detach().numpy()

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

我们知道MNIST数据集中的每个图像都是对应于单个彩色通道的灰度,其宽度和高度为28 * 28像素。因此,形状将为(1、28、28)。

第四步:

为了绘制图像,要求图像的形状为(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 torch
import matplotlib.pyplot as plt
import numpy as np
from 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 image
dataiter=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()


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