Relation Networks for Object Detection

这篇CVPR 2018论文提出了一种关系模块,将物体间的关联信息融入到目标检测中,增强特征表示,同时提出了一种替代NMS的去除重复框方法。关系模块通过结合所有物体的外观和几何特征,学习物体间的关系,不改变特征维数,适用于现有检测框架。此外,文中介绍的去重模块通过自适应学习参数,解决了NMS的手动参数设置问题,提高了检测性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文链接:https://arxiv.org/abs/1711.11575 

代码链接:https://github.com/msracver/Relation-Networks-for-Object-Detection

源代码讲解:https://blog.youkuaiyun.com/u014380165/article/details/80779712

在介绍这篇论文之前首先介绍一下边框回归(https://blog.youkuaiyun.com/zijin0802034/article/details/77685438/)这里有个小问题在Loss = \sum_i^N(t_*^i - \hat w_*^T\phi_5(P^i))^2中的t_{*}指的是ground truth 并不是之前解释的t_{x} t_{y} t_{w} t _{h},这四个值是公式中的w。

 


这个是CVPR 2018的文章,虽然并没有什么巧妙的设计,但是思路很有趣,那就是引入了object的关联信息,在神经网络中对object的relations进行建模。

在之前使用cnn进行目标检测的方法中,都是每个对象被单独识别(rcnn  ,fast rcnn  faster rcnn),而这一篇对一组对象同时做了Relation Moudle 处理,即一个对象上融合了其他对象的关系特征。好处在于丰富了特征,而且在Relation Moudle 处理后唯独不会发生变化。

主要贡献点有两条: 

  1. .提出了一种relation module,可以在以往常见的物体特征中融合进物体之间的关联性信息,同时不改变特征的维数,能很好地嵌进目前各种检测框架,提高性能 
  2. 在1的基础上,提出了一种特别的代替NMS的去重模块,可以避免NMS需要手动设置参数的问题

1. Background
假设现在有一个显示屏幕,问这是电脑显示屏还是电视屏幕,该怎么判断?如果单纯把屏幕取出来,确实很难回答这个问题,但是如果结合周围的东西,就很好解决了……比如,放在客厅环境、旁边有茶几的是电视,而旁边有键盘和鼠标的是电脑显示屏;又或者,宽度有沙发那么大的是电视,而只比一般座椅稍大一点的是电脑屏…… 
总之,周边其他物体的信息很可能对某个物体的分类定位有着帮助作用,这个作用在目前的使用RoI的网络中是体现不出来的,因为在第二阶段往往就把感兴趣的区域取出来单独进行分类定位了。这篇文章作者就考虑改良这个情况,来引入关联性信息。 
放一个直观的例子,蓝色代表检测到的物体,橙色框和数值代表对该次检测有帮助的关联信息。 


 
实际上以往也有人尝试过类似的工作,但是由于关联性涉及到对其它物体特征和位置的假设等原因,一直不是个容易的问题,本文作者从google在NLP(https://arxiv.org/abs/1706.03762)方面的一篇论文中的Attention模块得到启发,设计了本文的这种思路。

2. Object Relation Module
这个模块的特点就是联合所有object的信息来提升每个object recognition的准确性。它的模块示意图如下图所示: 


 
解释下,这里的f_A^n代表第n个物体的apperance特征,其实就是物体自身的大小、颜色、形状这些外观上的特征,而f_G^n对应的是是第n个物体的geometry特征,代表物体的位置和大小(bounding box),也就是每个对象有几何特征(四维的bbox),外观特征(文中为1024维)。这里有多个relation模块(数量为N_r),可以类比神经网络中我们每层都会有很多不同的通道,以便于学习不同种类的特征……每个relaiton模块都用所有object的两个特征做输入,得到不同的relaiton特征后再concat,并和物体原来的特征信息融合,作为物体的最终特征…… 
那么右面的图怎么理解呢?看下面的公式: 


 
f_R(n)是第n个relation模块的输出,它是由各个所有物体的apperance特征经过W_V的维数变化后,又赋予不同的权重叠加得到的……也许看到这里有人疑惑,不是说geometry特征也是输入吗,怎么没看到?其实位置特征是体现在权重里的,第m个物体对于当前第n个物体的权重\omega^{mn}的求法如下: 


 
公式分母是个归一化的项,重点看分子,\omega^{mn}主要是由两者决定的,那就是第m个物体对于当前第n个物体在geometry上的权重\omega_G^{mn}和在apperance上的权重\omega_A^{mn},它们各自的求法如下: 


 
 
这里的W_K/W_Q包括下面的W_G都起到类似的变化维数的效果,dot代表点乘,d_k是点乘后的维数;比较值得在意的是这里的\varepsilon_G,这里是通过另一篇论文(Attention Is All You Need)中提到的方法将低维数据映射到了高维,映射后的维数为d_g。将4维升到d_g维,文中16维
作者选取了dk=dg=64,Nr=16dk=dg=64,Nr=16。总结一下这个模块的求法:

  • 分别根据两个特征计算它们各自的权重
  • 由两个特征的权重获得总权重
  • 按照第m个物体对当前物体的总权重,加权求出各个relation模块
  • concat所有relation模块,与原来的特征叠加,最终输出通道数不变的新特征 
  • 在这个过程中,要留意通道数,比如16个relation模块输出concat可以和fnAfAn叠加,那么它们每个的通道应该就是fnAfAn的通道数(记作dfdf)的16分之一。 
  • 这个模块直接应用在第二阶段,得到和原来相同的Output(score和bbox),应用是直接在fc层之后,即从原来的: 
  • 改变为:
  •  

 

r1,2r1,2代表重复次数,也可以用图来表示: 

3. Duplicate removal
作者的另一个贡献就是提出了这种可以代替NMS的消除重复框的方法。框架如下: 


 
要先说明的是,作者把duplicate removal当成一个二分类问题,对于每个ground truth,只有一个detected object被归为correct类,而其余的都是duplicate。 
这个模块的输入是instance recognition模块的output,也就是一系列的detected objects,它们每个都有1024-d的特征,分类分数s_0还有bbox。而输出则是s_0*s_1得到的最终分类分数。 
那么s_1是怎么算的呢?首先,对于detected objects作者按照它们的scores对它们进行排名,然后将scores转化为rank,据作者说这样更加有效,随后rank信息会按照类似\varepsilon_G的求法映射到高a和sigmoid函数,得到s_1 
如何判断哪个detected object是correct,而哪些是duplicate?在这里,作者设置了一个阈值η,凡是IoU超过该阈值的样本都会被选择;接着,在选择的样本中,IoU值最大的为correct,其余为duplicate。当对定位要求比较高的时候,可以设置较高的η,相应的被选择的样本就会发生变化,s_1也会发生变化,直接影响最终的分数。 
作者认为这样做的好处如下:

  • output的时候,NMS需要一个预设置的参数;而duplicate removal模块是自适应学习参数的。
  • 通过设置不同的η,可以将模块变成多个二分类问题,并取其中最高的值作为输出,作者经过试验,证明这种方式较单一阈值的方式更可靠。
  • 作者发现阈值的设置和最后的指标有某种联系。例如mAP0.5在η为0.5时的效果最好,mAP0.75的t同理,而mAP使用多个η效果最好。
  • 最后,就是η的含义问题。之前也发过邮件和作者沟通,对方的回复是,η本质上代表的是分类和定位问题的权重,它的值设置得越高,说明网络越看重定位的准确性。

这里作者也提出了问题:

  • 只有一个样本被划分为correct,会不会导致严重的正负样本不均衡? 
  • 答案是否定,网络工作的很好,这是为什么呢?因为作者实际运行发现,大多数的object的s_0得分很低,因此s0和s1s0和s1就很小,从而导致L = -log(1-s_0s_1)和梯度\frac{\partial L}{\partial s_1}都会比较小。
  • 设计的两个模块功能是否矛盾?因为instance recognition要尽可能多地识别出high scores的物体,而duplicate removal的目标是只选择一个正样本。作者认为这个矛盾是由s_1s_0来解决的,instance recognition输出的高s0s0可以通过较低的s1s1来调节。
  • duplicate removal是一个可以学习的模块,和NMS不同,在end2end训练中,instance recognition输出的变化会直接影响到该模块,是否会产生不稳定性?答案也是否定的,实际上,作者发现end2end的训练方式更好,作者认为这是由于不稳定的label某种程度上起到了平均正则化的作用。
     

 

视觉关系检测(Visual Relationship Detection, VRD)是计算机 vision 和图像理解中的一个重要研究方向,旨在识别图像中物体之间的语义关系。它不仅涉及目标检测,还进一步建模对象间的交互,如“人骑在马上”或“狗在跑”。该任务对于提升图像检索、场景图生成、视觉问答等应用具有重要意义。 ### 技术方法概述 #### 1. 基于区域提议的方法 早期的视觉关系检测模型通常基于区域提议方法,例如 Faster R-CNN 的变种。这些方法首先检测图像中的物体,然后通过分类器判断它们之间的关系。为了捕捉物体间的关系,一些工作引入了联合特征表示,将主语、谓词和宾语三元组统一建模。 #### 2. 图神经网络(GNN) 随着图结构在建模复杂关系中的优势显现,图神经网络被广泛应用于视觉关系检测中。通过构建对象之间的图结构,GNN 可以传播信息并增强每个节点(物体)的表示能力,从而更准确地预测关系。例如,Scene Graph Generation (SGG) 中常用 GNN 进行推理。 #### 3. 多任务学习与上下文建模 许多研究采用多任务学习框架,将物体检测、属性识别和关系预测结合在一起。此外,上下文建模也受到关注,包括全局图像上下文、局部区域上下文以及语言先验知识(如 Word Embedding),以提升关系预测的准确性。 #### 4. 注意力机制与 Transformer 近年来,注意力机制和 Vision Transformer 被引入到视觉关系检测中。这些方法利用自注意力机制捕捉长距离依赖关系,从而更好地建模复杂的视觉关系。例如,Relation Transformer Network (RTN) 显式建模对象间的两两关系,并通过注意力机制进行优化。 --- ### 经典研究论文推荐 以下是一些具有代表性的研究论文: - **"Visual Relationship Detection with Language Priors"** (ECCV 2016)[^1] 提出了一种结合语言先验的视觉关系检测方法,利用外部语料库训练的语言模型来辅助关系预测。 - **"Scene Graph Generation by Iterative Message Passing"** (CVPR 2017)[^1] 引入图神经网络来迭代传播对象之间的信息,提升关系检测性能。 - **"Graphical Contrastive Loss for Scene Graph Generation"** (CVPR 2021) 提出一种对比损失函数用于图结构的学习,增强了关系判别能力。 - **"Relation Networks for Object Detection"** (CVPR 2018)[^1] 将关系模块嵌入到检测框架中,显式建模对象之间的相互作用。 - **"Knowledge-Embedded Routing Network for Scene Graph Generation"** (NeurIPS 2020)[^1] 利用知识图谱引导关系推理过程,提高语义一致性。 --- ### 应用领域 视觉关系检测技术广泛应用于以下方向: - **视觉问答(VQA)**:通过理解图像中对象之间的关系,增强对问题的理解能力。 - **图像检索与描述生成**:基于关系图可更精确地匹配图像内容。 - **机器人感知与导航**:帮助机器人理解环境中的交互关系。 - **增强现实(AR)与虚拟现实(VR)**:提升场景理解能力,实现更自然的交互体验。 --- ### 实现示例(PyTorch 伪代码) ```python import torch from torchvision.models.detection import fasterrcnn_resnet50_fpn from torch_geometric.nn import GCNConv class VisualRelationshipDetector(torch.nn.Module): def __init__(self, num_relations): super().__init__() self.backbone = fasterrcnn_resnet50_fpn(pretrained=True) self.gcn = GCNConv(1024, 512) self.relation_head = torch.nn.Linear(512 * 2, num_relations) def forward(self, images, boxes, edges): features = self.backbone(images)['roi_features'] graph_features = self.gcn(features, edges) relation_pairs = torch.cat([graph_features[edges[0]], graph_features[edges[1]]], dim=1) relations = self.relation_head(relation_pairs) return relations ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值