LIFT: Learned Invariant Feature Transform 论文解读

2023-10-11 05:48

本文主要是介绍LIFT: Learned Invariant Feature Transform 论文解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LIFT: Learned Invariant Feature Transform

论文概述

  • 创新点
    • 使用统一的模型进行端到端的有监督训练
    • 利用了传统特征提取的先验知识
  • 方法
    • 训练过程

* 分阶段训练* 利用SfM中sift的位置和角度,训练描述符网络* 利用SfM中sift的位置,和训练好的描述符网络,训练旋转估计网络* 利用已经训练好的旋转估计和描述符网络训练特征点提取网络
* 损失函数* 同一个3d点的角度尽可能近* 匹配点描述符距离尽可能近,非匹配点尽可能远* 匹配点的位置比较接近* 非特征点位置得分尽量低
  • 特征提取过程
    在这里插入图片描述

  • 实验验证

    • 在一些传统数据集上进行了匹配重复率测试

详细描述

简介

  • 传统的手工特征点在许多计算机视觉任务中得到了广泛的应用,如三维重建,SLAM、图片检索、物体识别等等。

  • 深度学习在许多计算机视觉领域取得了颠覆性的成果,在很多领域都远超传统的方法。但是在特征点提取匹配上的研究却不多。

  • 现有的研究成果大多是分离,包括一些特征点提取方法,和描述子计算方法

    • 特征点提取方法
      • 很少,非深度学习方法
    • 描述子计算方法
      • Discriminative Learning of Deep Convolutional Feature Point Descriptors.
      • 描述子的学习主要在于难负样本挖掘
  • 本文提出如下统一的结构,进行特征点提取匹配工作。
    在这里插入图片描述
    主要难点:

  • 如何保证整体的可微性

    • 将非极大值抑制替换为 soft argmax function
    • 利用特殊变换层对图片进行旋转和裁剪等操作
  • 如何训练整个网络

    • 整个网络端到端的训练不可行
    • 利用SfM产生真实值以及训练特征点
      • 先训练描述子网络
      • 再训练旋转估计网络
      • 最后训练特征点提取网络
  • 实际应用

    • 将所有网络解耦,在图像金字塔中使用特征点提取网络
    • 非极大值抑制得到特征点
    • 旋转估计和描述子网络均应用在提取得到的特征点上

因此,本文的贡献点有:

  • 第一个完整的集成特征点提取、旋转估计、描述子计算深度学习端到端的架构
    • 难点,如何保证整体网络的可导
  • 网络训练方法
    • 利用SfM得到patch真实值
    • 分阶段、分任务进行训练

方法

问题描述
  • 采用图像patch作为输入而非整体图片作为输入进行训练,这保证了网络能够在不同尺度大小的图片上进行工作。
  • 采用SfM中提取的特征点构造图片patch进行训练,每次训练采用四个patch同时输入
    • P1, P2 为同一个特征点的不同视角下的图片patch
    • P3为不同特征点对应的图片patch
    • P4为随机选取的图片patch其中不包含特征点

因此每次训练创建四个共享参数的网络对四个patch进行处理
在这里插入图片描述

  • 包括如下部分
    • 特征点提取网络
    • softargmax 层,提取得到特征点位置(假设只有一个特征点)
    • 特殊变换层,将patch进行一定的裁剪
    • 旋转估计网络,得到角度
    • 特殊变换层2,根据角度将patch进行一定的旋转变换
    • 描述符计算层
  • 其中,p4仅用来训练特征提取网络,因此没有后面的层
训练集创建
  • 现有的数据集大多都用传统的特征点提取patch然后训练描述子,但是没有训练特征点的方法
  • 为了获取不同视角下同一个点的patch,采用SfM方法,基于sift特征点
  • 3384张图片,得到39k的特征点
描述子

设描述子网络为:
d = h ρ ( P θ ) \textbf{d} = h_{\rho}(\textbf{P}_{\theta}) d=hρ(Pθ)
其中, d \textbf{d} d为计算得到的描述子向量, P θ \textbf{P}_{\theta} Pθ为旋转过后的patch,其中patch的位置和旋转由sift特征点确定。
因此定义损失函数:
L desc  ( p θ k , p θ l ) = { ∥ h ρ ( p θ k ) − h ρ ( p θ l ) ∥ 2 for positive pairs, and  max ⁡ ( 0 , C − ∥ h ρ ( p θ k ) − h ρ ( p θ l ) ∥ 2 ) for negative pairs  \mathcal{L}_{\text {desc }}\left(\mathbf{p}_{\theta}^{k}, \mathbf{p}_{\theta}^{l}\right)= \begin{cases}\left\|h_{\rho}\left(\mathbf{p}_{\theta}^{k}\right)-h_{\rho}\left(\mathbf{p}_{\theta}^{l}\right)\right\|_{2} & \text { for positive pairs, and } \\ \max \left(0, C-\left\|h_{\rho}\left(\mathbf{p}_{\theta}^{k}\right)-h_{\rho}\left(\mathbf{p}_{\theta}^{l}\right)\right\|_{2}\right) & \text { for negative pairs }\end{cases} Ldesc (pθk,pθl)={hρ(pθk)hρ(pθl)2max(0,Chρ(pθk)hρ(pθl)2) for positive pairs, and  for negative pairs 

  • 正样本尽量接近
  • 负样本尽量远,但是限制了过分的远导致的负样本项数值很大的情况
难负样本挖掘策略

在描述子网络中,难负样本挖掘是一种非常有效的方法,因为大量的特征点之间的差别是非常大的,很容易区分,且负样本的数量往往远远大于正样本,导致网络训练效率下降。

文中采用了如参考文献[10]中类似的策略进行负样本选择。
这部分可参考该论文,这里不展开了。

旋转估计网络

设旋转估计网络为:
θ = g ϕ ( P ) \theta = g_{\phi}(\textbf{P}) θ=gϕ(P)
其中, P \textbf{P} P为sift提取得到的特征点位置处得到的patch。 θ \theta θ则为计算得到的旋转角度。

因此可以定义旋转网络的误差函数

L o r i e n t a t i o n ( P 1 , x 1 , P 2 , x 2 ) L_{orientation}(\textbf{P}^1,x^1,\textbf{P}^2,x^2) Lorientation(P1,x1,P2,x2)

  • 就很简单,相同3d点的patch估计得到不同的角度,然后输入到训练好描述子网络中,最终得到尽量接近的描述子
  • 这里没有对非同一个特征点的patch进行约束
特征点提取

设特征点提取网络为
S = f μ ( P ) = ∑ n N δ n max ⁡ m M ( W m n ∗ P + b m n ) \mathbf{S}=f_{\mu}(\mathbf{P})=\sum_{n}^{N} \delta_{n} \max _{m}^{M}\left(\mathbf{W}_{m n} * \mathbf{P}+\mathbf{b}_{m n}\right) S=fμ(P)=nNδnmmaxM(WmnP+bmn)

其中, P \textbf{P} P为输入patch图片,经过多层网络的卷积变换 ( W m n ∗ P + b m n ) \left(\mathbf{W}_{m n} * \mathbf{P}+\mathbf{b}_{m n}\right) (WmnP+bmn),之后添加线性激活函数得到单层的得分图 S \textbf{S} S

为了通过得分图确定特征点的位置,采用softargmax 函数,也就是计算得分图的质心作为特征点的位置

x = softargmax ⁡ ( S ) softargmax ⁡ ( S ) = ∑ y exp ⁡ ( β S ( y ) ) y ∑ y exp ⁡ ( β S ( y ) ) \textbf{x} = \operatorname{softargmax}(\mathbf{S})\\ \operatorname{softargmax}(\mathbf{S})=\frac{\sum_{\mathbf{y}} \exp (\beta \mathbf{S}(\mathbf{y})) \mathbf{y}}{\sum_{\mathbf{y}} \exp (\beta \mathbf{S}(\mathbf{y}))} x=softargmax(S)softargmax(S)=yexp(βS(y))yexp(βS(y))y

定义误差函数分为两类

  • 分类误差,区分当前patch中有无特征点
  • 定位精度误差,计算提取的特征点位置误差
其中分类误差采用:

L class  ( P 1 , P 2 , P 3 , P 4 ) = ∑ i = 1 4 α i max ⁡ ( 0 , ( 1 − softmax ⁡ ( f μ ( P i ) ) y i ) ) 2 \mathcal{L}_{\text {class }}\left(\mathbf{P}^{1}, \mathbf{P}^{2}, \mathbf{P}^{3}, \mathbf{P}^{4}\right)=\sum_{i=1}^{4} \alpha_{i} \max \left(0,\left(1-\operatorname{softmax}\left(f_{\mu}\left(\mathbf{P}^{i}\right)\right) y_{i}\right)\right)^{2} Lclass (P1,P2,P3,P4)=i=14αimax(0,(1softmax(fμ(Pi))yi))2

其中patch中有特征点时 y i = 1 y_i = 1 yi=1,没有时 y i = − 1 y_i = -1 yi=1,这就保证了有特征的时得分尽量接近1,而没有特征点时计算的得分尽量趋于零。

定位精度误差采用:

L pair  ( P 1 , P 2 ) = ∥ h ρ ( G ( P 1 , softargmax  ( f μ ( P 1 ) ) ) ) − h ρ ( G ( P 2 , softargmax ⁡ ( f μ ( P 2 ) ) ) ) ∥ 2 \begin{aligned} \mathcal{L}_{\text {pair }}\left(\mathbf{P}^{1}, \mathbf{P}^{2}\right)=\| & h_{\rho}\left(G\left(\mathbf{P}^{1}, \text { softargmax }\left(f_{\mu}\left(\mathbf{P}^{1}\right)\right)\right)\right)-\\ & h_{\rho}\left(G\left(\mathbf{P}^{2}, \operatorname{softargmax}\left(f_{\mu}\left(\mathbf{P}^{2}\right)\right)\right)\right) \end{aligned} \|_{2} Lpair (P1,P2)=hρ(G(P1, softargmax (fμ(P1))))hρ(G(P2,softargmax(fμ(P2))))2

也就是利用目前训练好的旋转估计和描述符计算网络去计算当前提取位置的得分。

但是由于难以训练问题,因此实际上采用的误差函数
L ~ pair  ( P 1 , P 2 ) = 1 − p 1 ∩ p 2 p 1 ∪ p 2 + max ⁡ ( 0 , ∥ x 1 − x 2 ∥ 1 − 2 s ) p 1 ∪ p 2 \tilde{\mathcal{L}}_{\text {pair }}\left(\mathbf{P}^{1}, \mathbf{P}^{2}\right)=1-\frac{\mathbf{p}^{1} \cap \mathbf{p}^{2}}{\mathbf{p}^{1} \cup \mathbf{p}^{2}}+\frac{\max \left(0,\left\|\mathbf{x}^{1}-\mathbf{x}^{2}\right\|_{1}-2 s\right)}{\sqrt{\mathbf{p}^{1} \cup \mathbf{p}^{2}}} L~pair (P1,P2)=1p1p2p1p2+p1p2 max(0,x1x212s)

  • 这个误差函数就是确保每次提取的特征点位置和sift特征点位置尽量重合,即 P 1 , P 2 P^1,P^2 P1,P2重合时误差最小
  • 因此没有说数据驱动得到特征点而是利用网络去拟合逼近sift特征点。
运行流程

  • 生成尺度空间图片
  • 利用特征提取网络,在尺度空间图片中滑动提取特征
  • 把 softargmax 函数替换成非极大值抑制,在整个图片内获取特征点
  • 将图片裁剪成一个个小patch
  • 估计旋转角度
  • 旋转patch
  • 计算描述子

实验验证

数据集
  • Strecha dataset [33]
  • DTU dataset [34]
  • Webcam [6]
评价标准
  • Repeatability
  • Nearest Neighbor mean Average Precision
  • Matching Score

(具体根据参考文献 [35] 进行计算)

总结

基本的思路就是用网络的方法去拟合毕竟sift特征点,只能算是基于深度学习的特征点提取的早期工作,没有完全的端到端数据驱动。

这篇关于LIFT: Learned Invariant Feature Transform 论文解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/185969

相关文章

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。