如何使用深度AutoViML的多类图像分类器

133 阅读11分钟

使用深度AutoViML的多类图像分类器

图像分类将输入的图像归入各自的标签或类别。大多数图像分类通常只有两个类别,例如catdog 。在多类中,我们有三个或更多的类别,例如lioncheetahleopardtiger

多类图像分类将输入的图像归入三个或更多类别中的一个。在进行多类分类时,预测的图像只属于一个类。一幅图像不能同时属于一个以上的类别。

我们将使用Deep AutoViML 库来建立模型。Deep AutoViML是一个自动机器学习(AutoML)库,使用TensorFlowKeras构建神经网络。

在本教程中,我们将使用Deep AutoViML建立一个模型,对玩剪刀石头布游戏的手的图像进行分类。这些图片有三个类别。rock,paperscissors

前提条件

要继续学习本教程,读者应该。

  • 理解[Python中的图像预处理]。
  • 理解[卷积神经网络]。
  • 知道如何使用[Keras]和[TensorFlow]建立一个图像分类器。
  • 在[Google Colab笔记本]中运行该模型。

开始使用Deep AutoViML

Deep AutoViML将构建图像分类模型的过程自动化。Deep AutoViml使用Keras和Tensorflow库来构建一个深度学习模型。这些模型的速度很快,而且更准确。

Deep AutoViML还可以自动完成NLP任务。在本教程中,我们将专注于图像分类。Deep AutoViML有以下有用的功能。

Deep AutoViML的特点

  1. Deep AutoViML使用Keras预处理层来自动进行图像预处理--图像预处理是图像分类的一个重要阶段。它将图像转换为神经网络可以理解和使用的格式。

最常见的图像预处理活动如下。

  • 图像归一化- 图像归一化将图像的像素强度值的范围转换为用户定义的范围。
  • 图像大小调整- 图像大小调整是改变图像大小的过程。这使得调整后的图像能够适应你正在构建的神经网络。
  • 图像标准化- 改变图像像素以满足所需的标准,使图像能有统一的高度和宽度。
  • 图像缩放- 这个过程将图像转换为用户设定的比例。

这些过程非常重要,要详细了解这些过程,这些过程提供了一个随时可以使用的图像。

  1. Deep AutoViML使用预训练的模型 - 预训练的模型是使用大型数据集进行训练的神经网络模型。然后,这些模型被导入以解决类似的问题。

在本教程中,我们将使用预训练的MobileNet卷积神经网络,它用于图像分类。MobileNet是使用大型图像数据集训练的。这个模型已经被导入到Deep AutoViML中。

  1. Deep AutoViML执行超参数调整--超参数调整是对神经网络的参数进行微调的过程。找到最佳参数会产生一个优化的模型。Deep AutoViML使用Optuna来自动搜索最佳神经网络参数。
  2. Deep AutoViML允许你添加更多的自定义层--使用Deep AutoViML,我们可以向预训练的模型添加更多的层。这使我们能够拥有更多以用户为中心的模型,能够满足用户的需求。
  3. Deep AutoViML自动选择最佳模型。
  4. Deep AutoViML自动保存训练好的模型。

为了使用这个库,我们使用下面的命令来安装它。

!pip install deep_autoviml --upgrade

在安装过程中,我们现在可以使用下面的代码导入deep_autoviml

from deep_autoviml import deep_autoviml as deepauto

使用GPU

GPU比CPU快得多。由于我们要处理的是一个图像分类问题,我们要初始化GPU。我们还将监测其性能。

要使用谷歌Colab的GPU,请按照以下步骤进行。

  1. 点击Runtime 选项。

alt text

  1. 点击Change runtime type

alt text

  1. 然后选择GPU 选项并保存。

alt text

为了管理和监控这个GPU,我们将使用Nvidia-smi

!nvidia-smi

现在让我们使用deep_autovimlNvidia-smi 来建立多类图像分类模型。首先,我们下载图像数据集。

图像数据集

该图像数据集有三个类别。rock,paper, 和scissors 。要获得手势数据集,请点击这里

我们现在需要将该数据集添加到我们的工作目录中。为了将这个数据集下载到我们的工作目录中,我们使用下面的命令。

!wget --no-check-certificate \
  https://www.kaggle.com/drgfreeman/rockpaperscissors.zip

该命令下载数据集并将数据集添加到工作目录中。该数据集将以zip 的格式出现。

解压缩数据集

要解压数据集,我们使用下面的命令。

!unzip rockpaperscissors.zip

在解压数据集之后,让我们创建一个traintest 文件夹。train 文件夹将有训练集,test 文件夹将有测试集。

为了创建这些文件夹,我们使用下面的命令。

!mkdir rockpaperscissors/train
!mkdir rockpaperscissors/test

让我们用下面的代码把训练集移到这个文件夹里。

!mv rockpaperscissors/paper rockpaperscissors/train/paper
!mv rockpaperscissors/rock rockpaperscissors/train/rock
!mv rockpaperscissors/scissors rockpaperscissors/train/scissors

添加测试图像

为了将测试集的图像添加到test 文件夹中,我们使用下面的命令。

!mv rockpaperscissors/rps-cv-images rockpaperscissors/test

现在我们通过删除不必要的文件来清理这个目录。

清理目录

为了清理这个目录,我们使用下面的命令。

!rm rockpaperscissors/README_rpc-cv-images.txt
!rm rockpaperscissors/test/README_rpc-cv-images.txt

这个命令将从我们的目录中删除这两个文件。

显示图像

为了显示一些图片,我们使用IPython.display Python模块。要导入这个模块,我们使用下面的代码。

from IPython.display import Image, display

我们将显示一些图像,使用下面的代码。

display(Image('rockpaperscissors/train/scissors/KNNsNhduqSfuqEK5.png'))

输出结果显示如下。

First image

上面的图片显示了一个scissors 的手势。

display(Image('rockpaperscissors/test/paper/9zuFLFklb0ibEelE.png'))

Second image

上面的图片显示了一个paper 的手势。

display(Image('rockpaperscissors/test/rock/JOaPrPIINVvoI9l4.png'))

Third image

上面的图片显示了一个rock 的手势。

导入库

我们导入重要的库,如下所示。

import matplotlib.pyplot as plt
import numpy as np

import warnings
warnings.filterwarnings('ignore')

导入的库有以下功能。

  1. matplotlib- Matplotlib是一个可视化库。我们使用Matplotlib来绘制图表和不同的图形。
  2. numpy- Numpy将输入的图像转换为数组。它对数组进行数学运算。
  3. warnings- 它显示运行我们的模型时出现的警告。在我们的案例中,我们已经决定忽略这些警告。

安装完这些库后,让我们指定数据集目录。

数据集目录

添加数据集目录将使模型能够知道数据集的位置。为了添加该目录,我们使用下面的代码。

image_dir = '/content/rockpaperscissors/'

接下来,让我们指定图像的大小和图像类的数量。

图像大小

我们指定图像的高度和宽度。要添加图像尺寸,使用下面的代码。

img_height = 224
img_width = 224
img_channels = 3

从上面的代码中,我们将图像高度设置为224,图像宽度设置为224。这是Deep AutoViML所期望的默认图像尺寸。Deep AutoViML内部使用预训练的MobileNet。

MobileNet 模型使用244×244像素的图像。img_channels = 3 代表图像类别的数量(石头、布、剪刀)。

接下来,让我们初始化神经网络。

初始化神经网络

我们使用下面的代码来初始化神经网络。

keras_model_type =  "image"
keras_options = {"early_stopping": True, 'lr_scheduler': 'rlr', "epochs": 3}
model_options = {'tuner':"optuna", "max_trials":2, 'cat_feat_cross_flag':True,
 'image_directory': image_dir, 'image_height': img_height,
 'image_width':img_width, 'image_channels':img_channels }

从上面的代码片段来看,神经网络有以下参数。

  1. keras_model_type- Deep AutoViML使用Keras库模型来构建神经网络。由于我们正在建立一个图像分类模型,我们将模型的类型设置为image 分类器。这将自动使用MobileNet模型来训练神经网络。
  2. keras_options- 它改变了Keras模型的选项。Keras模型有一些选项,如early_stoppinglr_scheduler ,和epochs

让我们来解释一下这些模型。

  • early_stopping - 早期停止是一个参数,用于避免模型在训练期间过度拟合。我们将其设置为 。True
  • lr_scheduler- 它用于确定神经网络在每个 epoch/迭代期间的速率。
  • epochs - 决定了模型的总迭代次数。我们将迭代次数设置为 。3
  1. model_options- 它设置输入图像的关键属性。它还设置了超参数调整技术。

这些技术是。

  • tuner - 它设置了超参数调谐技术。我们将使用Optuna来自动搜索最佳神经网络参数。
  • max_trials - 它是在超参数调谐过程中由 测试的最大组合数。Optuna
  • image_directory - 它指定了图像目录。
  • image_height - 它指定了图像的高度。
  • image_channels - 它指定了图像类别的数量。

在初始化神经网络后,让我们将神经网络拟合到我们的数据集上。

拟合神经网络

拟合神经网络允许模型从训练图像中学习。这将使模型获得有用的洞察力,它将用来进行预测。

为了适应神经网络,我们使用下面的代码。

model = deepauto.fit("", "", keras_model_type=keras_model_type,
 project_name='rock_paper_scissors_classifier',
 save_model_flag=False, model_options=model_options,
 keras_options=keras_options, use_my_model='', verbose=0)

我们使用deepauto.fit 函数来适应神经网络。在该函数中,我们将project_name 作为rock_paper_scissors_classifier 。其他的函数值是在初始化过程中设置的参数。我们还使用save_model_flag 来指定我们是否要保存我们的模型。

当代码被执行时,它将模型的建立过程自动化。然后它产生不同的输出来显示进展。第一个输出显示了使用rock-paper-scissors 数据集的模型训练。该输出还显示了用于加速该过程的GPU数量。

这个输出显示在下面的图片中。

Training process

从上面的图片来看,我们正在使用1个物理GPU和1个逻辑GPU。这些模型从给定的图像目录下的图像中学习。

神经网络对训练数据集进行了3次迭代。它在每次迭代后都会打印出准确率分数。最终的准确度得分是0.96875

接下来的输出显示了一些图像。

Displayed images

Deep AutoViML还自动绘制了Model Training vs Validation lossModel Training vs Validation Accuracy 图。这些图显示在下面。

Diagrams

左边的图显示了Model Training vs Validation loss 。从图像中,我们可以看到train_lossval_loss 随着时间的推移而减少。这表明我们的模型随着训练过程的继续而改进。

右图显示了Model Training vs Validation Accuracy 。我们可以看到train_accuracyval_accuracy 随着时间的推移而增加。这表明我们的模型随着训练过程的继续而改进。

模型类型和神经网络的层数

这个输出显示了模型类型和神经网络的层数。它还显示了模型的摘要和参数。这些参数被分为可训练参数和不可训练参数。

这个输出表示神经网络的结构。

Neural network layers

从上面的图片来看,模型的类型是顺序的。顺序模型允许层与层之间相互构建。它还显示了模型的总参数(2,261,827)。

可训练参数(3,843)是神经网络将训练的参数。不可训练的参数(2,257,984)已经被训练过了。

我们从预训练的MobileNet中导入不可训练的参数。非训练参数的数量比可训练参数的数量多。这就节省了训练时间。

最后,Deep AutoViML自动进行一些预测。它对测试集中的一些图像进行分类。它打印出图像的actual labelpredicted label

actual label 显示了实际的图像类别。predicted label 显示模型预测的类别。如果actual labelpredicted label 匹配,模型将作出正确的预测。

这个输出显示在下面的图片中。

Model predictions

从上面的图片中,该模型对6张图片进行了分类。对于所有的图像,actual labelpredicted label 匹配。这表明,我们的模型能够做出正确的预测。

我们还实现了多类图像分类。该模型能够将一幅图像归入三个类别中的一个。

总结

在本教程中,我们使用Deep AutoViML进行了一个多类图像分类器。我们讨论了用于建立强大的深度学习模型的Deep AutoViML功能。

使用这些特征,我们能够建立一个多类图像分类模型。最后的模型能够对玩剪刀石头布游戏的手的图像进行分类。