SNet解读
解读论文:Learning Local Image Descriptors with Deep Siamese and Triplet Convolutional Networks by Minimising Global Loss Functions
为什么要总结这么一篇旧的论文?因为里面一些方法具有总结性。
例如对于图像块匹配来说,我自己给出的一个划分:
- 按照网络类型:度量学习(metric learning)和描述子学习(local image discriptor)。
- 按照网络结构:pairwise的siamese结构、triplet的three branch结构,以及引入尺度信息的central-surround结构(此结构往往在baseline中使用进一步提升结果)。
- 按照网络输出:单个概率值(pairwise similarity)、特征向量(feature embedding)。
- 按照损失函数:损失函数可以是对比损失函数、交叉熵损失函数、triplet loss、hinge loss等等。此外损失函数可以带有隐式的困难样本挖掘,例如pn-net中的softpn等,也可以是显示的困难挖掘等等。但是困难挖掘就一定好吗?也不一定,可能导致过拟合是的结果变差。
而本文则是引入一个应用到mini-batch中的全局损失函数(Global Loss Functions)来提高结果,方法非常简单,下面进入正文。
1. 摘要
为什么引入这样一个损失函数?因为当前的siamese和triplet网络易于陷入过拟合。所以作者提出全局损失函数来证明泛化性能的提高。同时作者验证triplet网络比siamese网络产生更加精确的embedding。此外论文Improved Deep Metric Learning with Multi-class N-pair Loss Objective提到:尽管contrastive loss和triplet loss广泛应用,但是都容易遭受收敛慢、需要昂贵的数据采样方法来提供不平凡的pairs或triplets来加速训练。
2. 介绍
作者介绍了当前卷积网络的主要实现,无非就是siamese和triplet网络及变体。注意下图b和d。b为siamese网络,即输入一对匹配或者不匹配的图像块,输出可以是embedding(特征向量)也可以是pairwise similarity(匹配概率值)。而d作为triplet网络一般输出embedding。

在b和d中作者采用全局损失函数,通过最小化属于同一类和属于不同类的特征的距离的方差,并最小化属于同一类的特征的距离的均值,最大化不同类图像块特征的均值。就是说对于这两类,都要最下化其方差,同时让它们分布尽可能远:类似下图:

为此,作者首先利用triplet network,利用triplet损失函数+global loss。然后利用siamese network+唯一的global loss,最后利用central-surround siamese network来完成实验。这在15年是state-of-the-art的。通过在UBC数据上发现:triplet net比siamese net有更好的分类结果(我觉得这基本毋庸置疑,三张图同时考虑了额外信息)、triplet loss+global loss提升了单triplet loss结果、global loss来训练central-surround siamese net达到了当时最好结果。而后,作者分析了metric learning 和local image descriptor(度量学习和描述子学习)。
3. 方法
这一节,作者看似推了一大堆公式,其实就说明了这个global loss怎么实现?其目标就是实现最小化方差、分别最大最小化均值。
首先介绍pairwise loss(包括embedding feature和similarity estimate),embedding feature的损失:

即输出的一对特征向量,对于匹配而言距离越大损失越大,距离越小损失越小。不匹配情况反之。
然后是similarity estimate损失:

即输出的概率值,对于匹配而言概率越大损失越小,概率越小损失越大,不匹配情况反之。
对于triplet net而言的triplet损失:

就是说对于匹配的图像特征之间的距离要小于不匹配图像特征的距离至少为margin:m。
很好理解,就是下图:

下面global loss就很明确了:
作者讲到siamese和triplet网络含有大量参数,需要采样大量样本来训练。然而采样所有的图像对不可能的,并且其中绝大多数都是简单样本!所以可选的方案是采样策略。必须足够小心,因为在困难样本上关注太多又会导致过拟合,所以这其实很棘手。为此作者提出了这个全局损失函数。这个函数主要为了避免欠采样(太多简单样本)或者过采样(太多困难样本)问题。所以这个损失函数就是要:1) minimise the variance of the two distributions and the mean value of the distances between matching pairs, and 2) maximise the mean value of the distances between non-matching pairs。
1)输出是特征向量feature embedding:
t为margin,方差和均值为一个batch中匹配和非匹配样本的特征距离的方差和均值。
2)输出是相似概率值pairwise similarities:

同理稍微一改,方差和均值为一个batch中匹配和非匹配样本的概率的方差和均值。
然后作者的四个实验网络如下:
- TNet,TLoss:triplet net+triplet loss、输出feature embedding
- TNet,TGLoss:triplet net+triplet loss&global loss、输出feature embedding
- SNet,GLoss:siamese net+global loss、输出pairwise similarity estimator
- CS SNet,GLoss:central-surrond siamese net+global loss、输出pairwise similarity estimator
注意前面两个模型产生的是feature embedding,所以局部描述子的比较基于L2正则的距离比较。(也就是计算出特征向量后要正则一下,使得模为1!)
对于网络结构,作者采用的是Learning to compare image patches via convolutional neural networks一文中的结构,再次强调:Finally, the output feature from both siamese networks are normalised to have unit norm。
以下是实验一和实验二的结果:

可以看到第二组实验fpr95均值最小,只有8.8。这时feature embedding里最好的结果。
另外作者自己为了验证global loss的有效性,自己随机生成二维数据,看看分类结果:

外点明显对b影响很大,过拟合的问题。结合了全局损失后,c好了一些,d中不受外点影响,更鲁棒。
第三四组实验结果:可以看到加上尺度信息后,直接掉了一半fpr95,也看到siamese的5.28优于上面的triplet结果。

然后是对于网络的详细设置,以及UBC数据的分析,这部分略过,可以在论文中找到信息。
4. 实验与结论
从之前两个table,我们也看到了,输出pairwise similarity的siamese结构要优于输出feature embedding的triplet网络,但就siamese成对的输入来说,在测试时比较复杂。确实是,siamese测试一对图像得经过全连接得到一个0-1之间的概率值,而对于特征向量来说可以直接利用余弦内积得到相似度,因为这些向量都被l2 norm为1了,所以得到的也是0-1之间的概率。但是上面不能说的绝对,因为有的方法中triplet更优于siamese,这还是要看网络结构、损失函数、优化策略等等。总结就是global loss首次运用到triplet网络,这个损失函数作用于mini-batches,也比较好实现。
附:
利用直方图损失来区分两种分布:16年cvpr:Learning Deep Embeddings with Histogram Loss
思想:通过在正样本中随机取样所得到的相似性比从负样本中随机取样得到的相似性低的可能性。
SNet解读的更多相关文章
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
- SDWebImage源码解读 之 UIImage+GIF
第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...
- SDWebImage源码解读 之 SDWebImageCompat
第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...
- SDWebImage源码解读_之SDWebImageDecoder
第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...
- SDWebImage源码解读之SDWebImageCache(上)
第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...
- SDWebImage源码解读之SDWebImageCache(下)
第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读 总结(干货)(上)
养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...
随机推荐
- mysql同步复制异常的常见操作-传统复制方式
mysql同步复制异常的常见操作-传统复制方式 一.传统复制方式是基于非gtid的,常见的错误有1032和1062 1032是主键冲突,1062是从库中没有找到对应的记录. 可以查看出现错误的binl ...
- JMX监控Hadoop的部分常用参数位置
近期版本get无法使用,可能使用了其他参数代替,但源码中已经去掉JMX部分,也没有给出替代接口,应该是不再额外实现了. NameNode DataNode HDFS Yarn HBase MapRed ...
- parseFloat()为什么没有效果
parseFloat() 函数可解析一个字符串,并返回一个浮点数.看清楚说明是操作字符串,如果是数值类型parseFloat([],x)会失去效果. 正确的用法:parseFloat().toFixe ...
- shop++改造之Filter类
基于shop++源码进行商城改造.本来想大展手脚,结果一入手.发觉瞬间淹没了我的才华,sql语句也得贼溜没啥用. 不得不说这个商城源码价值很高,封装的很精屁. 下面是我第一天入手的坑. 数据库建好了表 ...
- .NET获取当前程序所在电脑的CPU和内存使用率
using System; using System.Diagnostics; using System.Text; using System.Runtime.InteropServices; nam ...
- HDU - 6313 Hack It(构造)
http://acm.hdu.edu.cn/showproblem.php?pid=6313 题意 让你构造一个矩阵使得里面不存在四个顶点都为1的矩形,并且矩阵里面1的个数要>=85000 分析 ...
- idea上使用maven模块开发
使用maven模块开发: 使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为common(域模型层).dao(数据库访问层).s ...
- java基础之反射---重要
java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)): 1:获取Class字节码文件对象的三种方式: /** ...
- vue 中 使用百度编辑器 UEditor
(单页应用,多编辑器也可行) 新建一个Ueditor.vue组件对象,该组件用来封装ueditor,用来进行复用. <template> <div> <!--下面通过传递 ...
- SSH免费登录
SSH免费登录很简单,如果有用过git的就更简单了 只需要一下两步操作就OK: 1.生成公钥和私钥,在linx上生成公钥和私钥,执行:ssh-keygen 2.执行ssh-copy-id +ip 例如 ...