HardNet解读
论文:Working hard to know your neighbor’s margins: Local descriptor learning loss
为什么介绍此文:这篇2018cvpr文章主要是从困难样本入手,提出的一个loss,简单却很有效,在图像匹配、检索、Wide baseline stereo等都做了大量详细实验,在真实任务中真正取得了state-of-the-art的结果。代码:https://github.com/DagnyT/hardnet 。上一篇博客中的论文可以和这个相结合,一起阅读更佳。此外这些通过learn得到的descriptor虽然在某些数据集结果好,但在实际中并不popular,甚至不如传统SIFT及其变体!有结论认为是数据集不够大、不够有区分度!
摘要:
受到到Lowe的SIFT的匹配标准启发,引入一种度量学习所用的loss。最大化一个batch中的最近正样本与最近负样本的距离。这种方法比复杂的优化方法更有效,它对于浅层或深层网络都很work。将这个loss结合与L2Net的结构可以达到一个更加全面的描述子,称之为HardNet。它有着和SIFT一样的特征维度128,并且state-of-art performance in wide baseline stereo, patch verification and instance retrieval benchmarks.
1. 介绍
许多计算机视觉任务依赖寻找local correspondences,例如image retrieval、panorama stitching、wide baseline stereo、3D-reconstruction。尽管越来越多端到端的方法试图取代复杂的经典方法,但是对于local patches的经典的检测子和描述子仍然被用,主要就是鲁棒性和高效性以及紧密的集成。
LIFT、MatchNet和DeepCompare是最先尝试的端到端学习,然而这些方法在实际应用中并不受欢迎,尽管它们在patch verification任务中有好的表现。近来的研究证实SIFT以及其变体(RootSIFT-PCA [16], DSP-SIFT [17)远超于learned descriptors在匹配、检索以及SD重建等领域。【19】给出结论是local patches datasets不够大和有区分度来学习这么一种高质量、可以广泛应用的descriptor。
本文关注于descriptor的学习,并提出一个新奇的网络HardNet。并通过大量实验展示了该方法学习到的descriptor同时在真实世界的任务中远超于hand-crafted和learned descriptors。达到了真正的state-of-the-art。
2. 相关工作
经典的SIFT local feature matching包括两部分:寻找最近邻和比较第一、第二近邻的距离比值来过滤假阳性matches。据作者所知还没人这么做。
【20】提出一个简单的filter plus pooling策略和convex optimization 来取代 hand-crafted filters and poolings in SIFT。MatchNet采用Siamese网络结构,首先是feature net,然后是metric net,后者提高了匹配表现,但是却无法使用快速最近邻算法例如kd-tree。【15】同样方法探索了不同结构,【22】利用hard negative mining和相对较浅的结构来探索pair-basesd similarity。
下面的几篇论文中与经典的SIFT匹配策略结合紧密。【23】利用triplet margin loss和triplet distance loss,随机采样patch。它显示了triplet-based结构比pair based的优越性。它们随机采用负样本。【7】计算挖掘的正负类样本的距离矩阵,然后是pairwise contrastive loss。
L2-Net利用一个batch中的n个匹配对来生成n方-n个负样本对并且要求每行每列中到真实匹配的距离最小。没有其他距离或者距离比值的限制。相反,它们提出一个对描述子维数的相关性的惩罚,并且通过intermediate 特征图采取deep supervision。本文采用L2-Net的结构作为base结构,我们展现了利用更简单的目标函数不需要两个辅助损失项,学习更有力描述子的可能性。
图1 ,根据图示可以看到这种采样策略比较简单,但是却很有效!
下面分析这个采样过程。
3. The proposed descriptor
3.1 Sampling and loss
学习目标模仿SIFT的匹配标准,过程如图1.首先一个batch中的匹配块生成,A代表anchor,P代表positive。那么每一对就是源于相同的一个SD point。
第二,这2n个patch进入图2中的网络。 计算L2 pairwise距离矩阵n*n:
那么
然后要分别寻找和该匹配对最相近的不匹配patch以及次相近的不匹配patch的特征向量。(这体现了sift的操作)
那目标就是最小化匹配描述子和与之最相近的非匹配描述子。这n个triplet 距离然后被送到triplet margin loss:
距离在triplet重组的过程中已经预计算好了,和随机triplet采样相比开销是距离矩阵的计算、计算行列的最值。此外,相比usual的triplets学习,我们的方案只需两路two-stream CNN,并不是三路。减少了30%的计算和存储。和L2-net不同的是neither deep supervision for intermediate layers is used, nor a constraint on the correlation of descriptor dimensions.并没有产生过拟合。
3.2 Model architecture
结构来源于L2Net,具体参数及设置见论文。
有趣的一点是Pytorch更新后,作者无法复现,通过超参数搜索后,设置lr=10,dropout rate=0.3得到了更好的结果。
3.3 Model training
在UBC数据集上,除了给出fpr95:false positive rate (FPR) at point of 0.95 true positive recall.,还给出了MatchNet和Tfeat中的FDR:(false discovery rate) 指标。另外作者没有做CS(center-surrounding)结构的实验,因为许多论文都证明了这个结构可以提升结果,所以这里不比再做,其实我认为可以看看还能提升多少。。
可以看到hardnet不论有无数据增强,都更强于L2Net!
作者又探索了batchsize的影响:发现128比较合适,256之提升了一点点。
后面的工作还有很多,关于real-world实际应用的实验,有空再补充。
HardNet解读的更多相关文章
- 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 ...
随机推荐
- zTree基础
zTree使用 zTree 是一个依靠 jQuery 实现的多功能 “树插件”, 而且拥有较好的浏览器兼容性,有着丰富的功能以及可以自定义样式,足以满足大部分业务的开发. 第一步先导入css及js文件 ...
- 信用评分卡 (part 1 of 7)
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- Word 测试下发布博客
目录 语法. 3 NULL,TRUE,FALSE 3 大小端存储 4 类型转换 4 转义字符 5 运算符的优先级 5 表达式(a=b=c) 7 *pa++=* ...
- vue-获取dom节点
获取dom节点可以用ref属性,这个属性就是来获取dom对象的.看代码 这个属性就相当于给这个标签起了一个id样的东西 <input type="text" ref=&qu ...
- Process和ProcessBuilder入门【原】
ProcessBuilder优点 ProcessBuilder(XXX).start()和Runtime.exec(XXX)功能相同,主要优点在使用过程中感受有: 前者是jdk1.5后的新方式 配置环 ...
- 标签中的onclick调用js方法传递多个参数的解决方案
1.JS方法 <script type="text/javascript"> funcation cc(parameter1,parameter2,parameter3 ...
- 解析/proc/net/dev
https://stackoverflow.com/questions/1052589/how-can-i-parse-the-output-of-proc-net-dev-into-keyvalue ...
- 建立爬虫代理IP池
单线程构建爬虫代理IP池 #!/usr/bin/python3.5 # -*- coding:utf-8 -*- import time import tempfile from lxml impor ...
- zookeeper的作用
1.管理(存储和读取)程序提交的状态数据 2.为用户程序提供数据节点监听服务
- c# 适配器批量修改
DataTable dt; //在方法外部申明数据表SqlDataAdapter adapter; //在方法外部申明数据适配器 查询方法adapter = new SqlDataAdapter(Sq ...