基于卷积神经网络的以图搜图算法实现



如果用这个名称去搜索论文,一定有不少。为什么了,因为从原理上来看,卷积神经网络就非常适合找图片的相似的地方。想想看,许多大牛、小牛、微牛的文章都是说如何从mnist中、从CIFA10中、从CIFA100中去找到相似的图片。那么,反过来想一想,如果那么复杂的数据卷积神经网络都能够去处理,那么对于这种相对来说,比较简单的“以图搜图”的需求,应该更容易来解决。这里的神经网络解决这个问题,还是尝试得到一种较为通用的问题解决方法。



        零、数据集的创建



        基于之前的一些项目,我创建这样的数据集: 



        训练数据:


        


深度学习以图搜图技术_卷积神经网络


        

深度学习以图搜图技术_深度学习以图搜图技术_02


       

深度学习以图搜图技术_数据结构与算法_03


       测试数据


       

深度学习以图搜图技术_数据结构与算法_04


      

深度学习以图搜图技术_人工智能_05


      我认为,在本项目中."花纹"这个特征是比较重要的。因为颜色不是重点。在训练的时候,因为图像是可以被选择的,倾向于采用比较小的,能够完全展示一个单元的图像来做训练;在测试的时候,没有具体要求。


       以前对手写体采用的投影的方法,在解决这个问题的时候不适合,因为这些图像没有体现出突出的投影差异;而如果采用"哈希感知"的方法,也是不适合的。因为这些图像中可能存在重复的单元。、


       如果采取之前对手写体的识别方法,结果如下


    交叉训练,特征维度 5 ,神网层数 80


0. 250000,最低正确率 0.000000

交叉训练,特征维度 5,神网层数 100
平均正确率 0. 221591,最低正确率 0.000000

交叉训练,特征维度 5,神网层数 120
平均正确率 0. 267045,最低正确率 0.000000

交叉训练,特征维度 5,神网层数 140
平均正确率 0. 204545,最低正确率 0.000000

交叉训练,特征维度 5,神网层数 160
平均正确率 0. 159091,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 20
平均正确率 0. 306818,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 40
平均正确率 0. 323864,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 60
平均正确率 0. 306818,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 80
平均正确率 0. 295455,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 100
平均正确率 0. 278409,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 120
平均正确率 0. 267045,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 140
平均正确率 0. 193182,最低正确率 0.000000

交叉训练,特征维度 10,神网层数 160
平均正确率 0. 227273,最低正确率 0.000000

交叉训练,特征维度 15,神网层数 20
平均正确率 0. 363636,最低正确率 0. 125000

交叉训练,特征维度 15,神网层数 40
平均正确率 0. 289773,最低正确率 0.000000

交叉训练,特征维度 15,神网层数 60
平均正确率 0. 267045,最低正确率 0.000000

交叉训练,特征维度 15,神网层数 80
平均正确率 0. 284091,最低正确率 0.000000

交叉训练,特征维度 15,神网层数 100
平均正确率 0. 244318,最低正确率 0.000000

交叉训练,特征维度 15,神网层数 120
平均正确率 0. 232955,最低正确率 0.000000

交叉训练,特征维度 15,神网层数 140
平均正确率 0. 284091,最低正确率 0.000000

交叉训练,特征维度 15,神网层数 160
平均正确率 0. 221591,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 20
平均正确率 0. 289773,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 40
平均正确率 0. 278409,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 60
平均正确率 0. 289773,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 80
平均正确率 0. 232955,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 100
平均正确率 0. 329545,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 120
平均正确率 0. 267045,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 140
平均正确率 0. 232955,最低正确率 0.000000

交叉训练,特征维度 20,神网层数 160
平均正确率 0. 238636,最低正确率 0.000000


这个结果是非常的烂了,其原因和前面我提到的应该是哟关系的。


因此,只有gaobor或者类似nns的这种方法,才可能去解决问题。


        一、利用mlp和gabor特征来解决问题;(gabor是否更好了?这里前面给出的就是对比结果)


         在图像处理中,gabor函数是一个用于边缘提出的线性滤波器。其频率和方向非常类似人的视觉系统。因此非常适合纹理表达和分离。在空间域中,一个二维gabor滤波器是一个由正弦平面波调制的高斯核函数。


       生物实验发现gabor滤波器能够很好地近似单细胞的感受野函数等。


        一般来说,gabor滤波的方法是:不同纹理一般具有不同的中心频率和带宽,根据这些频率和带宽可以设计一组gabor滤波器对纹理图像进行过滤,每个gabor滤波器只允许于其频率相应的纹理顺利通过,。从各个滤波器的输出结果中分析和提出纹理特征,用于之后的分类和分割任务。


         具体步骤:


         1、将输入的图像分为3*3和4*4


         2、建立gabor滤波器组,选择4个尺度、6个方向,共24个滤波器;


         那么具体的过程,目前的代码是无法完成的。


        gabor特征只有对于对于实际生活中出现的图像,有比较好的原子区分能力,得到类似cnns的这种结构。


        这里比较关键的一个问题就是“什么事gabor特征,那个数值是需要最后来使用的”。中间我做出了一些解决的方法,效果是有的,但是不是非常好。


        二、训练卷积神经网络来解决问题;


 


        三、小结和反思


        为什么要写这样的一篇文章。因为经过一段时间关于神经网络和卷积神经网络的学习之后,我一直在寻找神经网络的实际应用。相比较于之前研究学习过的其它技术,卷积神经网络具有以下特点:


        1、原理比较复杂;


        2、工具比较难找;


        3、参数调整比较复杂;


        4、调试需要大量时间,因为一次训练就需要大量资源。


        这几点就决定了卷积神经网络的研究需要较多的时间,所以学习也花了很长的时间。那么在使用这个方面,也是只能跑一跑mnist和CIFA10之类的东西。如果想要最终利用于验证码识别的话,还有较长一段路需要来走。这个中间,我就需要有一个自己的项目来填补空白。


        这里我选择的是“以图搜图”的需求。这个需求在现实中,也是比较常见的。之前的思路也只能是类似于手写体识别一样,通过采集投影特征,进行距离运算等。现在,因为对卷积神经网络的初步研究,我认识到了,对于这样的图像来说,哪些特征是最重要的、哪种训练方法是最可行的。


        所以我将这个“自我项目”分为两个部分,一个部分是用gabor+mlp来实现,一个部分是用卷积神经网络来实现。对待于前者,无论是gabor还是mlp都已经有代码积累;而卷积神经网络,目前还没有比较系统的解决方法,并且是否选择lanet5的实现?这些都需要验证!我认为,通过这个自我项目,能够把对神经网络的理解和应用向前推进一大步!


        我计划利用一周的时间将这些完成,如果这些都完成之后,就应该反思积累,哪些是影响整体项目的关键节点,是数据集的建立?是数据结构的细节?还是训练?最后显示的界面如何来做?把这些做好,理清产学研之间的关系,为未来增加效益!


        此外,神经网络的程序往往都比较复杂,如何将这种程序也好,需要对能够允许的代码的充分理解和应用。