论文笔记:Multi-scale Matching Networks for Semantic Correspondence

一、先验知识

1.FPN

【目标检测】FPN(Feature Pyramid Network)这篇文章讲的挺好的。

2.4D-correlation map

4D指的是4个维度,因为输入两幅图片,每幅图片得到的特征图大小为hxw(2D),且要进行像素级语义对应故需要计算两个特征图上每个点的对应关系,故需要得到hxwxhxw次,这便是4D的含义,correlation表示互信息。4D correlation map如何得到呢,下面我放一下pytroch的代码,大家就一目了然了。

class FeatureCorrelation(torch.nn.Module):
    def __init__(self, normalization=True):
        super(FeatureCorrelation, self).__init__()
        self.normalization = normalization
        self.ReLU = nn.ReLU()

    def forward(self, feature_A, feature_B):
        b, c, hA, wA = feature_A.size()
        b, c, hB, wB = feature_B.size()
        # reshape features for matrix multiplication
        feature_A = feature_A.view(b, c, hA * wA).transpose(1, 2)  # size [b,c,h*w]
        feature_B = feature_B.view(b, c, hB * wB)  # size [b,c,h*w]
        # perform matrix mult.
        feature_mul = torch.bmm(feature_A, feature_B)
        # indexed [batch,row_A,col_A,row_B,col_B]
        correlation_tensor = feature_mul.view(b, hA, wA, hB, wB).unsqueeze(1)

        if self.normalization:
            correlation_tensor = featureL2Norm(self.ReLU(correlation_tensor))

        return correlation_tensor

通过对4D correlation map进行一定的处理就可以用来计算得到语义对应关系了。
举一个计算对应关系的例子,图片A、B的特征图为FA、FB,大小均为(h,w),那么对应的4D correlation map大小为(h,w,h,w),任取图片A上一点a,对应的特征图FA上的点为Fa,那么Fa一个点便和FB一张图进行对应,利用一定的规则如点与点之间的距离作为衡量标准,那么取FB上距离Fa距离最小点Fb变为Fa的对应点。

二、论文框架

1.动机

目的:

  • 寻找一种网络结构用来进行像素级的语义对应。

问题:

  • 颜色、尺度、方向、照明和非刚性变形的大类内变化,语义对应问题仍然非常具有挑战性。
  • 虽然现阶段的特征提取器能够提取得到具有丰富语义的特征,但是,在语义对应中,最顶层相邻像素之间的模糊性会导致性能下降。

启发:

  • 人观看图像是先看整体,后看细节,这体现一种从粗粒度到细粒度。
  • 特征提取器高阶特征具有丰富的语义但缺少位置信息,低阶特征语义信息较少,但是位置信息丰富。
  • 利用Transformer可以缓解最顶层相邻像素之间的模糊性。

创新点:

  • 第一个是特征增强路径(Feature Enhancement),它对空间上更粗糙但语义上更强的特征图进行上采样,并将它们与来自横向连接的特征融合以产生更高分辨率的特征。
  • 第二个是匹配增强路径(Matching Enhancement),它学习更精细和互补的匹配细节,以增强较低分辨率的粗糙匹配结果。我们从解码器的第一层开始生成最粗略的匹配结果,并在不同语义级别使用互补匹配细节对它们进行上采样和增强。

特征增强路径通过尺度内增强和跨尺度增强来增加特征图的表示能力。匹配增强路径从较粗级别学习与匹配结果互补的匹配细节。

  • 在提取特征阶段,设计了一种新颖的尺度内特征增强模块(Inner-scale Enhancement),它同时融合了每个卷积组中的所有特征图,并进一步提高了融合特征图与局部变换器的判别能力。
2.网络结构

在这里插入图片描述
: 这个不是UNet结构,Encoder部分没有串联,我一开始也认为是UNet结构,重新阅读论文并看了代码后才发现不是UNet结构。
关于细节和公式论文中说的很细,这里不再介绍。

论文框架主要在干两件事情:

  • 提取特征并将不同尺度特征进行融合从而增强特征
  • 计算4D correlation map,并将不同尺度特征获得的4D correlation map进行融合从而增强得到的4D correlation map(因为4D correlation map是通过两幅图像的特征map进行矩阵相乘得到的,故相当于特征的二次加强。)

a.Feature Enhancement
在这里插入图片描述
在这里插入图片描述
根据作者描述,这部分主要分为两个部分:尺度内和跨尺度 融合。

  • 首先看一下尺度内特征融合。通过ResNet提取得到的特征后通过SEM+卷积层得到尺度内的高阶特征,将这几个高阶特征进行concentrate后输入进入Local Self Attention中,便得到尺度内融合后的特征。关于将几个特征进行融合意义不用多说,这个虽然会增加计算量,但便于在训练过程中特征的选择增多。使用SEM模块作者解释是为了扩大单个神经元的感受野并捕获不同尺度的语义(我看了一下SEM的源码好像就是利用了空洞卷积去增大感受野)。使用Local Self Attention目的视为了解决高阶特征相邻像素之间的模糊性。
    关于Local Self Attention论文中有详细的介绍,这里不在多说。
  • 跨尺度融合过程不用多说。通过反卷积扩大上一层得到融合后特征的尺寸并和当前层的特征进行融合。

b.Matching Enhancement
在这里插入图片描述

在这里插入图片描述
首先将得到的两个Feature Map转化为4D correlation map,接着通过插值法提高尺寸大小用来和下一个尺寸的4D correlation map进行融合。

该结构采用了和FPN的top to down结构,即每一层得到的结果单独做一个预测,此外传递到下一层进行增强。

预测部分参考了另一篇文章《Correspondence Networks with Adaptive Neighbourhood Consensus》中的预测方法,然后作者在此基础上利用概率值计算损失函数。

具体做法为(以下均为看源码加参考文献所得,为本人思考,若有问题敬请批评指正):

  • 因为GT中的关键点在图像上,而我们的预测结果是特征图,故需要进行缩放到特征图的空间维度(乘以一个缩放因子),参考ANC Net的做法,因为缩放过程中原来在GT上的坐标点是整数值,缩放后就可能变成带有小数的值,故无法进行准确定位,这时便可以取缩放后点的4个距离最近邻来进行代替。同样,因为要利用概率值计算损失函数,故需要计算4个最近邻的概率值(利用距离缩放后点的欧式距离的倒数取softmax得到)。因为要得到一张和Feature map一样大小(c×w)的预测图,故除了4个最近邻的概率值外,其余点的概率值为0。这样我们便得到了GT的一个关键点对应的概率图,共有n个关键点,便有n个概率图。得到概率图后要利用高斯滤波器过滤一下使得概率图更加平滑并可以进行去噪。
  • 4D correlation map对应的概率图做法便比较简单了,因为GT用了4个最近邻,故4D correlation map这的对应点需要融合4个最近邻的对应的特征图(具体做法为加权求和),然后便得到了cxw大小的概率图。(不是一个点吗,为啥得到的是cxw大小的概率图,因为4D指的是4个维度,分别对应两张特征图的两个维度,故图片A得到的特征图上的点a对应图B特征图便是cxw大小)
  • 最后便可以带入损失函数公式进行计算了。在这里插入图片描述

在这里插入图片描述

首先将Ground Truth中的关键点重新缩放到与不同尺度下的特征图相同的分辨率。然后,根据ANC - Net,我们选择它的四个最近邻,并根据距离设置它们的概率,以建立每个尺度上的二维真值匹配概率。然后我们在概率图上应用大小为3的二维高斯平滑。

三、实验结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参考文献

1.论文笔记(2):Deep Crisp Boundaries: From Boundaries to Higher-level Tasks
2.FlowNet : simple / correlation 与 相关联操作
3.【目标检测】FPN(Feature Pyramid Network)
4.关键点估计之 PCK, PCKh, PDJ 评价度量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: qmetaobject::connectslotsbyname: 找不到匹配的信号 这是Qt框架中的一个错误提示,通常是因为在使用connect函数连接信号和槽时,信号的名称拼写错误或者信号不存在。需要检查代码中的信号名称是否正确,或者是否在相应的类中定义了该信号。 ### 回答2: qmetaobject::connectslotsbyname: no matching signal for是Qt框架中的一个错误信息,通常在连接信号和槽的时候出现。这个错误信息表示无法找到与要连接的槽对应的信号。 在使用Qt框架进行信号与槽的连接时,首先我们需要明确信号和槽的名称和参数类型。当使用QMetaObject::connectSlotsByName函数连接信号和槽时,框架会通过名称进行匹配。 如果出现no matching signal for的错误,可能是以下几个原因导致的: 1. 信号或槽的名称拼写错误:请检查信号和槽的名称拼写是否一致,包括大小写。 2. 信号或槽的参数不匹配:在信号和槽的定义中,参数的类型和顺序必须一致。如果参数类型或顺序不匹配,会导致连接失败。 3. 信号或槽的定义未在moc中注册:Qt使用元对象编译器(moc)来处理信号和槽的连接,如果信号或槽的定义未在moc中注册,连接会失败。请确保信号和槽的定义在宏的作用域内,并且相应的头文件已包含了Q_OBJECT宏。 解决此问题的方法是: 1. 仔细检查信号和槽的名称和参数,确保拼写和类型一致。 2. 检查信号和槽的定义是否在moc中注册。 3. 使用新的语法进行信号和槽的连接。新的Qt语法使用函数指针而非字符串进行连接,可以避免一些连接错误。 总之,qmetaobject::connectslotsbyname: no matching signal for表示无法找到与要连接的槽对应的信号。检查信号和槽的名称、参数和定义是否正确,并确保已正确注册到moc中,可以解决此问题。 ### 回答3: QMetaObject::connectSlotsByName: no matching signal for 在Qt中,QMetaObject::connectSlotsByName是一个用于自动连接信号和槽的功能。该错误提示表示在使用该功能时,没有找到与所连接的槽函数对应的信号函数。 通常情况下,这个错误有以下几个可能的原因: 1. 信号函数名称拼写错误:请检查信号函数的名称是否拼写正确。信号和槽函数的名称必须完全一致,包括大小写。 2. 信号函数没有声明在QObject的派生类中:请确保信号函数是在QObject的派生类中声明的。只有QObject的派生类才能包含信号函数和槽函数。 3. 在信号函数中需要添加Q_INVOKABLE宏:如果信号函数是在QObject的派生类的private或protected部分中声明的,那么需要添加Q_INVOKABLE宏来标记该函数为可调用的。 4. 在Q_OBJECT宏中声明了信号函数,但是没有重新生成moc文件:如果在信号函数中使用了Q_OBJECT宏并且编译器没有重新生成moc文件,那么信号函数将无法被识别。这种情况下,需要清理并重新生成工程。 总之,QMetaObject::connectSlotsByName: no matching signal for错误提示表示在使用QMetaObject::connectSlotsByName连接信号和槽时,没有找到与要连接的槽函数对应的信号函数。根据具体情况,可以通过检查函数的名称拼写、所在类的声明、添加Q_INVOKABLE宏或重新生成moc文件等方式来解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值