第一种方法:
预处理数据集,并用sklearn来运行KNN、SVM和BP神经网络。
首先,我们使用openCV包定义了两种不同的预处理函数:第一个称为图像特征向量,调整图像大小,然后将图像平坦化为行像素列表。第二个称为提取颜色直方图,使用cv2.normalize从HSV颜色间距中提取3D颜色直方图,然后平坦化结果。
然后,我们构造需要解析的几个参数,因为我们要测试这个部分的准确性,不仅是针对整个数据集的,还要测试具有不同数量标签的子数据集,我们将数据集构造为解析到我们程序中的参数。与此同时,我们还构造了用于k-NN方法的相邻数作为解析参数。
做好这些之后,我们开始提取数据集中的每个图像特征并将其放入数组中。我们使用cv2.imread来读取每个图像,通过从图像名称中提取字符串来拆分标签。在我们的数据集中,我们使用相同的格式设置名称:“类标签”.“图像号”.jpg,因此我们可以轻松地提取每个图像的类标签。然后我们使用之前定义的2个函数来提取2种特征,并附加到数组rawImages和特征中,而我们之前提取的标签则附加到数组标签。
下一步是使用从sklearn包导入的函数train_test_split拆分数据集。具有后缀RI、RL的集合是rawImages和标签对的拆分结果,另一个是特征和标签对的拆分结果。我们使用数据集的85%作为训练集,15%作为测试集。
最后,我们运用KNN、SVM和BP神经网络函数来评估数据。对于KNN,我们使用KNeighborsClassifier;对于SVM,我们使用SVC;对于BP神经网络,我们使用MLPClassifier。
第二种方法:
使用TensorFlow构建CNN。TensorFlow的目的是让你构建一个计算图(使用任何类似Python的语言),然后用C ++来执行图形操作,这比直接用Python来执行相同的计算要高效得多。
TensorFlow还可以自动计算优化图形变量所需的梯度,以便使模型更好地运行。这是因为图形是简单数学表达式的组合,因此可以使用导数的链式规则来计算整个图形的梯度。
TensorFlow图由以下部分组成:
用于将数据输入图表的占位符变量。
要进行优化的变量,以便使卷积网络更好地得以运行。
卷积网络的数学公式。
可用于指导变量优化的成本衡量标准。
一种更新变量的优化方法。
CNN架构由不同层的堆叠形成,其通过可微函数将输入量转换成输出量(例如类别分数)。
所以在我们的实现操作中,第一层是保存图像,然后我们构建了3个具有2×2最大池和修正线性单元(ReLU)的卷积层。
输入是一个具有以下尺寸的四维张量:
图像编号。
每个图像的Y轴。
每个图像的X轴。
每个图像的通道。
输出是另一个四维张量,具有以下尺寸:
然后我们在网络末端构建了2个完全连接的层。输入是形状为[num_images,num_inputs]的2维张量。输出是形状为[num_images,num_outputs]的2维张量。
然而,为了连接卷积层和完全连接层,我们需要一个平坦层,将4维张量减小到2维,从而可以用作完全连接层的输入。
CNN的最后端始终是一个softmax层,它将来自全连接层的输出归一化,使得每个元素被限制在0和1之间,而所有元素总和为1。
为了优化训练结果,我们需要一个成本衡量标准,并尽量减少每次迭代。我们在这里使用的成本函数是交叉熵(从tf.nn.oftmax_cross_entropy_with_logits()调用),并对所有图像分类采用交叉熵的平均值。优化方法是tf.train.AdamOptimizer(),它是Gradient Descent的高级形式。这是一个调整的参数学习率。
第三种方法:
Retrain Inception V3物体识别模型有数百万个参数,可能需要几周才能完全训练。迁移学习是一种技术,可以通过为一组类别(如ImageNet)采用训练有素的模型来快速完成此项工作,并从新类别的现有权重中进行训练。虽然它不如全训练运行得那么好,但对于许多应用来说,这是非常有效的,并且可以在笔记本电脑上运行,只要运行三十分钟即可,无需GPU。对于这部分的实现,我们可以按照下边的说明进行操作:
https://www.tensorflow.org/tutorials/image_retraining
首先,我们需要获得预先训练的模型,删除旧的顶层,并在我们拥有的数据集上训练一个新的模型。在一个没有猫品种的原始ImageNet类中,要对完整的网络进行训练。迁移学习的神奇之处在于,经过训练以区分某些对象的较低层可以重用于许多识别任务,而无需任何更改。然后我们分析磁盘上的所有图像,并计算其中每个图像的瓶颈值(bottleneck values)。点击这里查看bottleneck的详细信息(https://www.tensorflow.org/tutorials/image_retraining)。每个图像在训练过程中被重复使用多次,所以计算每个瓶颈值都需要花费大量的时间,因此可以加快缓存这些瓶颈值,从而不必重复计算。
该脚本将运行4000个训练步骤。每个步骤从训练集中随机选择十个图像,从缓存中发现其瓶颈,并将它们馈送到最后一层以获得预测。然后将这些预测与实际标签进行比较,从而通过反向传播过程更新最终层的权重。