siamese(孪生) 网络

本文转载来源 https://blog.csdn.net/qq_15192373/article/details/78404761#comments

siamese 网络, 是05年Yann Lecun提出来的。它的特点是它接收两个图片作为输入,而不是一张图片作为输入。


文献资料:

摘抄自caffe github的issue697

Siamese nets are supervised models for metric learning [1].   译:孪生网络是一种监督学习,用于度量学习。


[1] S. Chopra, R. Hadsell, and Y. LeCun. Learning a similarity metric discriminatively, with application to face verification. In Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on, volume 1, pages 539–546. IEEE, 2005. http://yann.lecun.com/exdb/publis/pdf/chopra-05.pdf


Speaking of metric learning, I remember that @norouzi had proposed and open sourced a method that learned a Hamming distance metric to distinguish similar and dissimilar images [2].   译:说到度量学习,我记得@norouzi 曾经提出一个开源方法,该方法可以学习Hamming 距离度量,来分辨相似和不相似的图片。


[2] Mohammad Norouzi, David J. Fleet, Ruslan Salakhutdinov, Hamming Distance Metric Learning, Neural Information Processing Systems (NIPS), 2012.


下面介绍原始的孪生网络


                             


扫描二维码关注公众号,回复: 5489785 查看本文章

目的:比较两幅图片是否相似,或者说相似度是多少

输入:两幅图片

输出:一个相似度数值

         其实我觉得,用“计算相似度”这个词有点不合适,我觉得应该翻译为匹配程度。因为文献所采用的训练数据中,如果两张图片匹配,输出值标注为y=1,如果两张图片不匹配,那么训练数据标注为y=-1,也就是说,这个训练数据的标注方法,根本就不是一个相似度数值,而是一个是否匹配的数值。我们打个比方,有三样物体:钢笔、铅笔、书包,那么在训练数据中,就把钢笔和铅笔标注为y=1,而不是用一个相似度数值来衡量,比我钢笔和铅笔的相似度我们把它标注为y=0.9……,所以说用于用相似度这个词有点不合理,即使我们最后计算出来的值是一个-1~1之间的数……


下面介绍改进的的孪生网络


         2015年CVPR的一篇关于图像相似度计算的文章:《Learning to Compare Image Patches via Convolutional Neural Networks》,本篇文章对经典的算法Siamese Networks 做了改进。

        先在这里解释下为什么作者要把它称之为:2-channel networks。理解了2-channel这个词,有助于我们后面理解算法。Siamese 网络,我们可以看到这个网络有两个分支组成,因为我们是要比较两张图片patch1、patch2的相似度。

Siamese 网络(2-branches networks)的大体思路:

1. 让patch1、patch2分别经过网络,进行提取特征向量(Siamese 对于两张图片patch1、patch2的特征提取过程是相互独立的)

2. 然后在最后一层对两个两个特征向量做一个相似度损失函数,进行网络训练。


paper所提出的算法(2-channel networks) 的大体思路:

1. 把patch1、patch2合在一起,把这两张图片,看成是一张双通道的图像。也就是把两个(1,64,64)单通道的数据,放在一起,成为了(2,64,64)的双通道矩阵,

2. 然后把这个矩阵数据作为网络的输入,这就是所谓的:2-channel。


     这样,跳过了分支的显式的特征提取过程,而是直接学习相似度评价函数。最后一层直接是全连接层,输出神经元个数直接为1,直接表示两张图片的相似度。当然CNN,如果输入的是双通道图片,也就是相当于网络的输入的是2个feature map,经过第一层的卷积后网,两张图片的像素就进行了相关的加权组合并映射,这也就是说,用2-channel的方法,经过了第一次的卷积后,两张输入图片就不分你我了。而Siamese网络是到了最后全连接的时候,两张图片的相关神经元才联系在一起。2015年CVPR文章几个重要创新写在下面:


------------------------------------分割线(以下是patch选取)---------------------------------

Patch的选取

        假设我们输入的是大小为64*64的一张图片,那么Central-surround two-stream network的意思就是把图片64*64的图片,处理成两张32*32图片,然后再输入网络,那么这两张32*32的图片是怎么计算得到的?

法1. Central-surround方法,也就是第一张图片是通过以图片中心,进行裁剪出32*32的图片,也就是下图的浅蓝色区域的图片。


法2. 下采样方法。直接通过对整张图片下采样的方法得到的,也就是说直接把64*64的图片进行下采样得到32*32的图片。其实这个就像多尺度一样,在图片处理领域经常采用多分辨率、多尺度,比如什么sift、还有什么高斯金字塔什么的,总之作者说了,多分辨率可以提高两张图片的match效果

这个Central-surround two-stream network可以和上面提到的2-channel、Siamese结合在一起,提高精度。下面就是Siamese和Central-surround two-stream network结合在一起的网络结构:


-------------------------------------分割线(以下是SPP原理)------------------------------------

       空间金字塔池化采样:这个又称之为SPP(Spatial pyramid pooling,空间金字塔池化)池化,这个又什么用呢?这个跟上面的有点类似,这个其实就类似于多图片多尺度处理,我们知道现有的卷积神经网络中,输入层的图片的大小一般都是固定的,这也是我之前所理解的一个神经网络。直到知道SPP,感觉视觉又开阔了许多,菜鸟又长见识了。我们知道现在的很多算法中,讲到的训练数据图片的大小,都是什么32*32,96*96,227*227等大小,也就是说训练数据必须归一化到同样的大小,那么假设我的训练数据是各种各样的图片大小呢?我是否一定要把它裁剪成全部一样大小的图片才可以进入卷积神经网络训练呢?这就是SPP算法所要解决的问题,训练数据图片不需要归一化,而且江湖传说,效果比传统的方法的效果还好。下面是Siamese和SPP结合在一起的网络结构:


就是在全连接层的前面加了个SPP层。总之这一步是为了使得网络可以输入各种大小的图片,提高网络的实用性,鲁棒性等。paper最后的算法就是:2-channel+Central-surround two-stream+SPP 的网络结构。




---------------------------------------分割线(以下举例)----------------------------------------

      有一篇文章和这个网络差不多,文章:《 Learning Deep Face Representation 》译:《学习深层人脸表示》。下面以这篇文章为例解释孪生网络。

      人脸的表示,易于实施, 叫做Pyramid CNN (金字塔CNN),采用了greedy-filter-and-down-sample (贪心-滤波-和-向下-采样) 的操作,使得训练非常快,而且高效,并且PyramidCNN可以和多尺度人脸特征结合。97.3% 的LFW。


传统的人脸特征表示的方法:


    注意文章的基本的网络结构不是传统上的CNN结构,而是“Siamese”网络【2005 Lecun 组的一篇文章】,它的特点是它接收两个图片作为输入,而不是一张图片作为输入。    

而文章中,作者采用深度神经网络,DCNN来提取特征,其网络结构图:


网络的主要特点:

1. 它们是由多个金字塔组成,分为不同个level级别的特征,

2. 每一个level的网络由两部分组成,一部分是共享的层,它由它的前一个level的网络层组成;另一部分是一个非共享层在每一层中训练只需要训练非共享层就可以

       共享层是由前一个level的的网络层共享过来,每一个神经网络中,共享层用来进行数据的预处理,比如卷积下采样等。非共享层用来训练已经处理好的图片(由于网络的共享层,使得每一个level的训练速度不会随着网络层数的增多而急剧变慢,提高训练时间,说白了也就是说每次只需要训练网络的最后一层就可以了,前面的层可以保持固定。)

       采用金字塔的原因在于:1.加快网络的训练速度;2. 可以提取多尺度人脸结构特征;

       注意每一个非共享level多个神经网络,分别对应于每个输入图像的patch(小块),有眼睛,鼻子,嘴。每个网络的训练目标函数都是下面的损失函数:



其表示的意思就是同一个人的距离要相互接近,而非同一个人的表示要相互远离。利用这个损失函数来进行网络的训练。训练方法:


最终的特征:它由所有的level所有的patch特征级联而成,而patch的选择则依赖于人脸特征点的检测alignment(校正)。最终形成的特征其实是过完全的,也就是说有很多的冗余,但是很多文章都表明这种冗余性对于识别来说具有重要性。应该来说每一个level所有的patch特征连接起来之后的向量就是一个人脸这个level的特征了,多个level的特征再连接起来就形成了多尺度的特征表示


文章还说了,Pyramid CNN方法提取的特征可以很稀疏,最少可以在8d,而在这么低纬度的特征下,其识别率还不低。通过相同的维度特征的情况下进行识别率比较:其中LBP特征是通过了PCA降维到相对应的维度。


新的评判标准:因为在LFW数据库上面的识别率已经达到了99%以上了,所以作者他自己提出了一个新的评判标准,在人脸verification(验证)中,正确的匹配可能会比错误的匹配少(在安全接入方面,希望false positive 要尽可能的小,已防止非法进入)。新的评判标准就是在固定一个错误的接受率(false positive rate FPR )阈值下,评判各个算法的性能,如识别率等。




本文转载来源 https://blog.csdn.net/qq_15192373/article/details/78404761#comments

猜你喜欢

转载自blog.csdn.net/huanhuan_Coder/article/details/82869779