论文: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解读的更多相关文章

  1. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  2. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  3. SDWebImage源码解读 之 UIImage+GIF

    第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...

  4. SDWebImage源码解读 之 SDWebImageCompat

    第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...

  5. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

  6. SDWebImage源码解读之SDWebImageCache(上)

    第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...

  7. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  8. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  9. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

随机推荐

  1. 2017-12-15python全栈9期第二天第七节之x or y ,x 为 非 0时,则返回x

    #!/user/bin/python# -*- coding:utf-8 -*-# x or y ,x 为 非 0时,则返回xprint(1 or 2)print(3 or 2)print(0 or ...

  2. 2017-12-15python全栈9期第二天第四节之格式化输出%s和个人简介模板

    #!/user/bin/python# -*- coding:utf-8 -*-msg = '''-----------info of zd----------------Name:zdage:24h ...

  3. CentOS7 上以 RPM 包方式安装 Oracle 18c 单实例

    安装阿里云 YUM 源 https://opsx.alibaba.com/mirror?lang=zh-CN 一.安装Oracle数据库 1.安装 Oracle 预安装 RPM yum -y loca ...

  4. java8的Streams

    首先看一个问题:在这个task集合中一共有多少个OPEN状态的?计算出它们的points属性和.在Java 8之前,要解决这个问题,则需要使用foreach循环遍历task集合:但是在Java 8中可 ...

  5. python (大文件下载及进度条展示) 验证客户端链接的合法性,socketserver

    ##########总结########### 文件校验加进度条显示 ####server import os import json import socket import struct impo ...

  6. CSS3笔记2

    1.CSS样式表分类 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  7. java.io.OutputStream & java.io.FileOutputStream

    java.io.OutputStream & java.io.FileOutputStream 1.Java.io.OutputStream(字节输出流) 字节输出流,这是一个抽象类,是表示输 ...

  8. CRM项目之RBAC权限组件-day26

    写在前面 上课第26天,打卡: 世间安得双全法 不负如来不负卿 s17day26 CRM项目 项目概要:XX公司CRM - 权限管理,公共组件,app ***** - 熟悉增删改查,Low *** - ...

  9. 一次针对多台服务器交互式主机命令采集Python脚本编写

    [环境介绍]   系统环境:Linux + Python 2.7.10(监控主机)   [背景描述] 需求:每次节假日或者重要时间时,需要对数据库主机信息进行检查,比如主机空间使用率之类.有时候需要执 ...

  10. 使用 JS 实现文字左右跑马灯

    Ø  前言 其实,前面两篇已经基本上实现了图片.文字跑马灯,这里为什么还要学下文字左右跑马灯呢?因为,虽然基本一样,但实现起来还是有很大不同的,所以为了完整再补充一下.代码如下: 1.   首先定义 ...