摘要
这次任务中,我们实现了使用人工神经网络对十分类的图片类型的判断。并实现了针对一张图片,由图片位于各分类的可能性进行对图片的 10 最近邻查询,返回图片库中国与查询图片最近似的 10 张图片。
关键词:人工神经网络、图像、特征、检索
1.导论
我们小组先构造了不同的神经网络,并用这些神经网络对训练集图片进行训练,得到了可用于对图片进行 10 分类的神经网络。之后比较了不同神经的效果。最后选用效果最好的神经网络对图片获取 10 分类的可能性。最后用 10 最近邻查询来获得十张与查询图片最接近的图片。
2.神经网络部分
2.1 公共框架
2.1.1 序贯模型(Sequential)
神经网络可以有非常复杂的结构,而其中最简单的模型,即网络的线性堆叠称为序贯模型,由于我们需要针对每一张图片做出一个类型的判断,即单输入对应单输出,故可以使用序贯模型来解决。
2.1.1.1 生成器(generator)
对输入的数据进行一定的处理,如进行随机偏移,旋转等操作,以减少过拟合的概率。
2.1.1.2 损失函数(loss)
用以估计预测的结果与真实值的不一致程度。
2.1.1.3 优化器(optimizer)
用以对机器学习模型中边的权值进行调整。
2.1.2 常用层(Core)
2.1.2.1 全连接层(Dense)
即最常用的全连接层,可以理解为一张完全二分图。
2.1.2.2 激活层(Activation)
为神经网络加入非线性因素,对一个层的输出施加激活函数。
2.1.2.3 退出层(Dropout)
为避免神经网络过拟合加入的层,实现方式为随机断开一些已经连接的神经元。
2.2 卷积神经网络框架(CNN)
2.2.1 卷积层(Convolutional)
2.2.1.1 二维卷积层(Conv2D)
二维卷积层,即对图像的空域卷积。该层对二维输入进行滑动窗卷积。
2.2.1.2 二维最大值池化层(MaxPooling2D)
为空域信号施加最大值池化。
2.3 循环神经网络框架(RNN)
2.3.1 循环层(Recurrent)
2.3.1.1 简单循环网络层(SimpleRN )
全连接 RNN 网络,RNN 的输出会被回馈到输入。
2.4 神经网络实现及实验
2.4.1 实验环境
-
操作系统:CentOS Linux release 7.3.1611 (Core)
-
内存:128.0GB
-
中央处理器:Intel(R) Xeon(R) CPU E5 2630 v4@2.20GHz*10
-
图形处理器:NVIDIA GeForce GTX1080
2.4.2 卷积神经网络实现
2.4.2.1 设计架构
本实验中我们组使用了 CNN 神经网络进行图片分类。使用的模型是蓄罐模型由此建立神经网络,每一层神经网络里面加入卷积层 Conv2D(32, (3, 3)),加入激活层 Activation('relu'),加入迟化层 MaxPooling2D(pool_size=(2, 2)),去除冗余数据Dropout(0.2)。这是这是完整的一层神经网络。将神经网络输出传入到分类器中。首先将原来的神经网络数据降维后输入全连接层,最后使用激活层进行输出 Activation('softmax')。
2.4.2.2 训练模型
在训练模型过程中,使用图片生成器 train_generator 给模型提供训练集提供输入。train_generator 会将训练集中的图片随机进行旋转切片等变化,使得模型见过足够多的图片。
验证集的图片与训练集图片不相同,并且每一次验证时也会将验证集合图片进行随机旋转切片等变换,以防止模型因为验证集与训练集样本过小导致的过拟合。
2.4.3 循环神经网络实现
在我们实现的对图片进行分类的 RNN 有如下结构。在 RNN 的实现中,由于 simpleRNN 层只接受一维的向量,故在这里我们不再使用图片生成器,在这里我们使用 numpy读取所有图片,接着用 numpy 的 reshape 将图片转化为一维,最后输入模型。
2.4.4 实验结果
cnn 实现结果
rnn 实验结果
在上述的实验探究后,我们发现在其他条件相同的情况下,增加神经网络的层数可以有效地提升神经网络的最终分类的正确率。而在神经网络层数相同的情况之下,没有对网络进行简化(即没有 dropout)会使得网络过拟合。
在我们的实现中,卷积神经网络的结果要好于循环神经网络,故我们采用效果最好的 2 层卷积+5 层感知机的模型继续下面的实验。
3.图片检索部分
3.1 最近邻检索
3.1.1 概述
对于每一个图片,得到一个 10 维向量,表示属于每个种类的概率。根据欧式距离,得到最近邻。
3.1.2 实现方法
实现最近邻搜索,并没有用 rtree 或者 kdtree,而是用了balltree。与 kdtree 和 rtree 不同的是,kdtree 和 rtree 用矩形分隔,balltree 用超球面分隔。
使用 balltree 的 query()方法得到最近邻。
3.2 GUI 及使用方法
3.2.1 实现方式
由于神经网络部分由 keras 实现,为了使用方便以及防止跨代码的调用,我们决定也使用 Python 来实现 GUI。
最终 GUI 由 pyqt 实现。
3.2.2 使用说明及效果图
运行 Pro2Gui.py 文件,即可得到如下图形界面。在搜索栏中输入 test 文件下中图片的完整名称,点击 search,即可得到10 个和它最相近的图片。
效果图如下: