您的位置:

Siamese网络:一种全新的神经网络结构

一、Siamese网络图

         Input     
            |       
          Conv1     
            |       
          Conv2     
            |       
          Conv3     
            |       
          Flat      
         /   \     
       fc1 ... fcN  
         \   /     
        L1_loss   

Siamese网络的网络结构如上所示。它的原理是使用两个相同的卷积神经网络,将两张不同的图片嵌入到同样的向量空间中,计算它们之间的距离,并用L1_loss或者L2_loss来计算它们的相似度。

二、Siamese网络模型代码

import tensorflow as tf

def feature_extract(input):
    with tf.variable_scope('feature_extract', reuse=tf.AUTO_REUSE):
        x = tf.layers.conv2d(input, 32, 5, padding='same', activation=tf.nn.relu, name='conv1')
        x = tf.layers.max_pooling2d(x, 2, 2, name='pool1')
        x = tf.layers.conv2d(x, 64, 3, padding='same', activation=tf.nn.relu, name='conv2')
        x = tf.layers.max_pooling2d(x, 2, 2, name='pool2')
        x = tf.layers.conv2d(x, 128, 3, padding='same', activation=tf.nn.relu, name='conv3')
        x = tf.layers.flatten(x, name='flatten')
        x = tf.layers.dense(x, 1024, activation=tf.nn.relu, name='fc1')
        x = tf.layers.dropout(x, rate=0.5, name='dropout')
    return x

def siamese_network(left_input, right_input):
    left_output = feature_extract(left_input)
    right_output = feature_extract(right_input)
    with tf.variable_scope('L1_loss'):
        L1_distance = tf.abs(tf.subtract(left_output, right_output))
        L1_output = tf.layers.dense(L1_distance, 1, activation=tf.nn.sigmoid, name='L1_output')
    return L1_output

上述代码实现了Siamese网络的核心架构,通过定义feature_extract函数对图像进行特征提取,再通过siamese_network函数将两个图像进行融合,并计算它们的L1距离。其中,L1_loss使用的是绝对值误差(L1_loss)。整个代码已经对每一层网络进行了注释,方便大家理解。

三、Siamese网络介绍

Siamese网络最早出现在签名验证领域,用于人脸识别、指纹识别等方面。它是一种基于对比损失函数的网络结构,对比上,基于深度学习的Siamese网络模型已经成为了学术界和工业界的研究热点。Siamese网络结构特别适用于不同的图像分类、人脸识别、语义相似度判断、图像检索等领域。

四、Siamese网络框架

Siamese网络框架分为两个过程:特征提取和融合。比如说,在人脸识别的场景中,两幅人脸的输入图像会分别经过两个相同结构的卷积神经网络,进行特征提取之后,再把这两个提取到的特征向量进行融合,最后输出这两幅图像之间的差异,以判断这两个人脸是否为同一人。

五、Siamese网络跟踪

通过使用获得的每个目标的特征来跟踪动态变化的物体。这个过程如下:

  1. 采集第一个目标的的特征向量;
  2. 使用线性混合方法,将获得的特征向量和新目标的特征进行融合;
  3. 从步骤2中的融合向量中选择最匹配的项,并输出对齐向量。

六、Siamese网络行人识别

Siamese网络在行人识别领域,可用于处理更复杂的数据结构。原理是使用两张图像中的不同点,用学习到的一个函数将这两个图像分别映射为两个向量,最后判断这两个向量是否属于同一个人。同时该算法对数据抗衡较强,不需要像传统的算法那样严格控制样本的采集方式和标注方式。

七、Siamese网络分类

Siamese网络同样被用于分类问题。在这种情况下,我们通过计算两张图像的相似度,来判断其所属的类别。比如说,我们有一张表情图片(微笑脸),然后我们再在数据库里找到100张脸,计算它们和表情图片的相似度,将这些脸分成为两类。

八、Siamese网络图片配准

Siamese网络被用于图片配准领域。配准是指把多幅图片根据它们之间的相似性匹配到同一个坐标系中。在这种情况下,每一幅图片都会经过一个CNN提取出它的特征向量,使用这些特征向量会进行配准。通常所使用的是双线性插值等方法。

九、Siamese网络的降维

Siamese网络可以用于降维。这种情况下,它可以通过计算不同类别的样本之间的相似度来实现特征的压缩和降维,在将样本进行分类时,避免特征数过多导致的维度灾难。CNN的网络结构使得在数据降维时可以保留最重要的特征。

十、Siamese Cat

最后跟大家分享一下,Siamese网络的名字是怎么来的。其实,这个名字是来自于西亚米斯国的一种猫,它们一般生活在皇宫里,具有和其他地方的猫不一样的特征,就像Siamese网络一样能够在所有其他的神经网络中脱颖而出,成为一种与众不同的神经网络结构。