一、前言
使用预训练卷积神经网络 (CNN) 作为特征提取器来训练图像类别分类器。
卷积神经网络 (CNN) 是深度学习领域的一种强大的机器学习技术。CNN使用大量不同图像进行训练。从这些大型集合中,CNN可以学习各种图像的丰富特征表示。这些要素制图表达通常优于手工制作的要素,例如 HOG、LBP 或 SURF。在不投入时间和精力进行训练的情况下,利用 CNN 的强大功能的一种简单方法是使用预训练的 CNN 作为特征提取器。
来自花卉数据集[5]的图像使用从图像中提取的CNN特征训练的多类线性SVM分类。这种图像类别分类方法遵循使用从图像中提取的特征训练现成分类器的标准做法。例如,使用特征袋进行图像类别分类示例使用特征袋框架内的 SURF 特征来训练多类 SVM。这里的区别在于,不使用 HOG 或 SURF 等图像特征,而是使用 CNN 提取特征。
二、下载图像数据
类别分类器将在花卉数据集中的图像上进行训练。
三、加载图像
使用 加载数据集以帮助您管理数据。由于对图像文件位置进行操作,因此图像在读取之前不会加载到内存中,因此可以有效地用于大型图像集合。
下面,可以看到数据集中包含的某个类别的示例图像。
该变量现在包含与每个图像关联的图像和类别标签。标签是从图像文件的文件夹名称自动分配的。用于汇总每个类别的图像数。
因为上面每个类别包含的图像数量不相等,我们先调整一下,让训练集中的图像数量平衡。
四、加载预训练网络
有几个预训练网络已经流行起来。其中大多数是在 ImageNet 数据集上训练的,该数据集有 1000 个对象类别和 1 万张训练图像。“ResNet-1”就是这样一种模型,可以使用神经网络工具箱中的函数加载。
在 ImageNet 上训练的其他流行网络包括 AlexNet、GoogLeNet、VGG-16 和 VGG-19 ,可以使用从深度学习工具箱加载。用于可视化网络。由于这是一个大型网络,因此请调整显示窗口以仅显示第一部分。
第一层定义输入维度。每个 CNN 都有不同的输入大小要求。此示例中使用的图像需要 224 x 224 x 3 的图像输入。
中间层构成了CNN的大部分。这些是一系列卷积层,穿插着整流线性单元(ReLU)和最大池化层。在这些层之后是 3 个全连接层。最后一层是分类层,其属性取决于分类任务。在此示例中,加载的 CNN 模型经过训练以解决 1000 路分类问题。因此,分类图层具有来自 ImageNet 数据集的 1000 个类。
请注意,CNN 模型不会用于原始分类任务。它将被重新用于解决花卉数据集上的不同分类任务。
五、准备训练和测试映像集
将集拆分为训练数据和验证数据。从每组图像中选择 30% 的图像作为训练数据,其余 70% 的图像用于验证数据。随机化拆分以避免结果偏差。训练集和测试集将由CNN模型处理。
六、CNN 的预处理图像
如前所述,只能处理 224 x 224 的 RGB 图像。为避免将所有图像重新保存为此格式,请使用 即时调整大小并将任何灰度图像转换为 RGB。当用于网络训练时,也可用于额外的数据增强。
七、使用 CNN 提取训练特征
CNN的每一层都会对输入图像产生响应或激活。但是,CNN中只有少数层适合图像特征提取。网络开头的图层捕获基本图像要素,例如边缘和斑点。要看到这一点,请可视化第一个卷积层的网络过滤器权重。这有助于建立一种直觉,即为什么从CNN中提取的特征在图像识别任务中如此有效。
请注意,网络的第一层如何学习用于捕获 blob 和边缘要素的筛选器。然后,这些“原始”特征由更深的网络层处理,这些网络层将早期特征组合在一起,形成更高级别的图像特征。这些更高级别的特征更适合识别任务,因为它们将所有原始特征组合成更丰富的图像表示。
可以使用该方法轻松地从更深的图层之一中提取要素。选择要选择的深层是一种设计选择,但通常从分类图层之前的图层开始是一个不错的起点。在 中,此层被命名为 'fc1000'。让我们使用该层提取训练特征。
八、使用 CNN 特征训练多类 SVM 分类器
接下来,使用 CNN 图像特征训练多类 SVM 分类器。通过将函数的“学习器”参数设置为“线性”,使用快速随机梯度下降求解器进行训练。这有助于在使用高维 CNN 特征向量时加快训练速度。