Siamese-pytorch孪生网络实现评价图像相似度

93f0021dbdae84b6f3eef4fa9341306a.png

来源:机器学习AI算法工程 
本文约1600字,建议阅读5分钟
本文为你介绍什么是孪生神经网络。

什么是孪生神经网络

简单来说,孪生神经网络(Siamese network)就是“连体的神经网络”,神经网络的“连体”是通过共享权值来实现的,如下图所示。

be8c5de8445f42f948328a23197ae04d.png

所谓权值共享就是当神经网络有两个输入的时候,这两个输入使用的神经网络的权值是共享的(可以理解为使用了同一个神经网络)。

很多时候,我们需要去评判两张图片的相似性,比如比较两张人脸的相似性,我们可以很自然的想到去提取这个图片的特征再进行比较,自然而然的,我们又可以想到利用神经网络进行特征提取。

如果使用两个神经网络分别对图片进行特征提取,提取到的特征很有可能不在一个域中,此时我们可以考虑使用一个神经网络进行特征提取再进行比较。这个时候我们就可以理解孪生神经网络为什么要进行权值共享了。

孪生神经网络有两个输入(Input1 and Input2),利用神经网络将输入映射到新的空间,形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。

孪生神经网络的实现思路

一、预测部分

1、主干网络介绍

a3215654518257f107f6cf0f27ea529c.png

孪生神经网络的主干特征提取网络的功能是进行特征提取,各种神经网络都可以适用,本文使用的神经网络是VGG16

2db6511cc0df8839f19115b130c13fd4.png

这是一个VGG被用到烂的图,但确实很好的反应了VGG的结构:

1、一张原始图片被resize到指定大小,本文使用105x105。

2、conv1包括两次[3,3]卷积网络,一次2X2最大池化,输出的特征层为64通道。

3、conv2包括两次[3,3]卷积网络,一次2X2最大池化,输出的特征层为128通道。

4、conv3包括三次[3,3]卷积网络,一次2X2最大池化,输出的特征层为256通道。

5、conv4包括三次[3,3]卷积网络,一次2X2最大池化,输出的特征层为512通道。

6、conv5包括三次[3,3]卷积网络,一次2X2最大池化,输出的特征层为512通道。

2、比较网络

355fa52c137b69217286474b589b48f1.png

在获得主干特征提取网络之后,我们可以获取到一个多维特征,我们可以使用flatten的方式将其平铺到一维上,这个时候我们就可以获得两个输入的一维向量了。

将这两个一维向量进行相减,再进行绝对值求和,相当于求取了两个特征向量插值的L1范数。也就相当于求取了两个一维向量的距离。

然后对这个距离再进行两次全连接,第二次全连接到一个神经元上,对这个神经元的结果取sigmoid,使其值在0-1之间,代表两个输入图片的相似程度。

实现代码如下:

66772e3cc38ae9afc2d0647d953c3925.png

68e7d9d0bd360695131bdd4a8e2bf7dd.png

二、训练部分

1、数据集的格式

本文所使用的数据集为Omniglot数据集。

其包含来自 50不同字母(语言)的1623 个不同手写字符。每一个字符都是由 20个不同的人通过亚马逊的 Mechanical Turk 在线绘制的。

相当于每一个字符有20张图片,然后存在1623个不同的手写字符,我们需要利用神经网络进行学习,去区分这1623个不同的手写字符,比较输入进来的字符的相似性。

0c92857e703b9dd4ebbc166616c04adf.png

最后一级的文件夹用于分辨不同的字体,同一个文件夹里面的图片属于同一文字。在不同文件夹里面存放的图片属于不同文字。

df1679bd36357ca7040c62b9e78c8464.png

上两个图为

.\images_background\Alphabet_of_the_Magi\character01里的两幅图。它们两个属于同一个字。

3696d1af5ceaf1217f758a8b7c2b9e4b.png

上一个图为

.\images_background\Alphabet_of_the_Magi\character02里的一幅图。它和上面另两幅图不属于同一个字。

2、Loss计算

对于孪生神经网络而言,其具有两个输入。

当两个输入指向同一个类型的图片时,此时标签为1。

当两个输入指向不同类型的图片时,此时标签为0。

然后将网络的输出结果和真实标签进行交叉熵运算,就可以作为最终的loss了。

本文所使用的Loss为binary_crossentropy。

当我们输入如下两个字体的时候,我们希望网络的输出为1。

0afdc7e9af03655856b76968182dd7c4.png

我们会将预测结果和1求交叉熵。

当我们输入如下两个字体的时候,我们希望网络的输出为0。

0d78857f848f7b1f3774473a58411dc1.png

我们会将预测结果和0求交叉熵。


训练自己的孪生神经网络

1、训练本文所使用的Omniglot例子

554998d9f7c07a0765782469fac5f5ad.png

下载数据集,放在根目录下的dataset文件夹下。

c868d52b383f4218ae9baf3a1218fef6.png

运行train.py开始训练。

461517050af05f748e68c958c0be0b21.png

2、训练自己相似性比较的模型

如果大家想要训练自己的数据集,可以将数据集按照如下格式进行摆放。

17c9ea8f7f93bcf27e1b328cda549739.png

每一个chapter里面放同类型的图片。

之后将train.py当中的train_own_data设置成True,即可开始训练。

e593e3c3e59e8d4eb8f14c1ab9801f82.png

编辑:王菁

校对:林亦霖f23355793d141387f225d9dc6dcd14d5.png

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值