论文阅读《FSCE: Few-Shot Object Detection via Contrastive Proposal Encoding》

news2024/11/18 20:00:12

论文地址:https://arxiv.org/pdf/2103.05950.pdf
代码地址:https://github.com/megvii-research/FSCE
对比学习https://zhuanlan.zhihu.com/p/346686467

目录

  • 1、存在的问题
  • 2、算法简介
  • 3、算法细节
    • 3.1、new-baseline
    • 3.2、对比建议编码
    • 3.3、对比建议编码的损失
  • 4、实验
    • 验证实验
    • 消融实验
  • 5、结论

1、存在的问题

小样本目标检测的方法存在的不足是:分类任务相对回归任务的错误率更高。 目标框定位通常很准确,但是目标的类别识别经常发生错误。
在这里插入图片描述

样本不足,新类学习到的特征不足以去和基类中相近的目标进行区分,所以新类别容易被归结为基类中易混淆的类。

对比学习可以通过降低不同类别目标的相似性来减小类内差异,增大类间差异,这样就可以减少对于相似类别的误判。

对比学习的目标是学习一个编码器,此编码器对同类数据进行相似的编码,并使不同类的数据的编码结果尽可能的不同。

2、算法简介

是一个基于微调fine-tune的方法。 第一次将对比学习引入到了小样本目标检测中来。

提出了一种 基于对比建议编码(FSCE)的小样本目标检测方法 ,在RoI 特征提取后添加了一个和回归、分类分支并行的 建议框对比编码(CPE)分支。

训练过程:
首先,使用丰富的基类数据(Dtrain=Dbase)训练Faster R-CNN检测模型。

然后,将训练好的模型迁移到小数据集上。小数据集是由新类和随机抽样的基类组成的混合数据集( D t r a i n = D n o v e l ∪ D b a s e Dtrain=Dnovel\cup Dbase Dtrain=DnovelDbase)。在微调过程中,主干特征提取网络被冻结,联合优化回归损失、分类损失和对比建议损失。
在这里插入图片描述

3、算法细节

3.1、new-baseline

首先,回顾一下原始两阶段微调方法TFA:
在这里插入图片描述
1、在基本训练阶段,利用大量的基类样本对普通的两阶段目标检测网络(如Faster-RCNN等)进行训练。这个阶段是在基类上联合训练整个目标检测器,包括特征提取器和box预测器。
2、在微调阶段,在保持整个特征提取器不变的情况下,将新类随机初始化的权值分配给box预测网络,只微调box分类和回归网络,其他特征提取组件都被冻结了。
因此,其他网络层完全没有参与到新类的训练过程中,RPN,ROI特征提取器只包含从基类中学到的语义信息,这其实可以看作是一种对新类的过拟合训练。
同时,作者发现,在微调阶段,正样本的建议框数量只有基础训练时的1/4,因为许多包含新类别的建议框的置信度很低,会被NMS过滤掉,导致前景建议框的数量也随之减少,网络学习新类别的机会变少。

本文在TFA的基础上提出了一种new-baseline。

new-baseline在解冻RPN和ROI模块的同时应用了以下的两个策略:
1、在微调阶段,原始的TFA的RPN提出来的区域建议框较少, new-baseline使得经过NMS的建议框的最大数量扩大了两倍。 这就带来了更多的前景,相当于增加正样本的数量。

2、标准的ROI的batchsize是512,但前景建议框的数量比512的一半还少,因此 将ROI head 中用于损失计算的抽样建议框的数量减少一半。 相当于增加了前景建议框的数量,使得网络学习到了更多的新类特征。

3.2、对比建议编码

首先,再来回顾一下Faster R-CNN的总体流程:
在这里插入图片描述
1、Backbone:conv+relu+pooling.
输入:图像
功能:提取输入图像的特征图
输出:特征图
2、RPN:
输入:Backbone的特征图
功能:生成建议框proposal
输出:建议框proposal
3、ROI Pooling:
输入:建议框proposal 和 Backbone的特征图
功能:将建议框proposal映射到Backbone的特征图上得到proposal feature maps,并将不同大小的proposal feature maps调整至统一大小
输出:一组向量(向量个数=建议框数量,向量大小=CxWxH,其中C为通道数,W=7,H=7)
4、分类分支:
输入:proposal feature maps
功能:得到区域建议框的类别
输出:cls_prob概率向量(区域建议框属于各个类别的概率)
5、回归分支:
输入:proposal feature maps
功能:确定目标检测框的精确位置
输出:每个proposal的位置偏移量bbox_pred
6、ROI head:
是由ROI pooling,box_head以及box_predictor结合在一起的,在Faster R-CNN中,ROI head对RPN产生的proposal进行pooling生成1024维的特征向量,再对该特征向量进行分类,以及bbox回归。
但是常规检测器无法为有限类别的区域建议框建立稳健的特征表示,即对于少样本来说是不够健壮的。
根据实验,在少样本的情况下,正样本分类器不能很好的区分它们。

为了更好的从小样本中学到更多的目标特征表示,文章提出了一种 批量对比学习方法(batch contrastive learning) 来更好的对 类内相似性 和 类间差异性 特征进行建模。

具体做法是 在ROI head中加入了一个对比分支(contrastive branch),与回归和分类分支并行,用于度量建议框的相似性

对比分支使用1层多层感知机( 1层神经网络),将1 * 1024的ROI特征转化为1 * 128维的对比特征向量 x i x_{i} xi。随后,计算对比特征向量的相似度分数,并将对比分支的损失加入到总的损失函数中进行优化,使得不同类别距离增大,相同类别距离减少。

采用基于余弦相似度的边界框分类器,计算出RoI 与各个类别的相似性度量。下式表示第 i 个 RoI 与第 j 个类别的相似性度量:
l o g i t { i , j } = α x i T w j ∣ ∣ x i ∣ ∣ ⋅ ∣ ∣ w j ∣ ∣ logit_{\{i,j\}} = \alpha\frac{x_{i}^Tw_{j}}{||x_{i}|| \cdot ||w_{j}||} logit{i,j}=α∣∣xi∣∣∣∣wj∣∣xiTwj
α \alpha α是增大梯度的尺度元素,实验设置为20, x i x_{i} xi是第 i 个实例的ROI特征, w j w_{j} wj是第 j 个类别的权重。

在余弦相似投影的超空间内,对比特征向量使用聚类的方法使得簇内距离更小,簇间距离更大。

在这里插入图片描述

在这里插入图片描述

3.3、对比建议编码的损失

对于每一个mini-batch,有N个ROI特征框, { z i , u i , y i } i = 1 N \{z_{i},u_{i},y_{i}\}_{i=1}^N {zi,ui,yi}i=1N
z i z_{i} zi表示ROI head对第 i i i个区域建议框所编码成的128维向量;
u i u_{i} ui表示建议框和真实框的IOU值;
y i y_{i} yi表示真实框的标签。
则设计对比建议编码的损失为:
L C P E = 1 N ∑ i = 1 N f ( u i ) ⋅ L z i L_{CPE} = \frac{1}{N}\sum_{i=1}^{N}{f(u_i)}\cdot L_{z_{i}} LCPE=N1i=1Nf(ui)Lzi
L z i = − 1 N y i − 1 ∑ j = 1 , j ≠ i N ∣ ∣ { y i = y j } ⋅ l o g e x p ( z i ~ ⋅ z j ~ / τ ) ∑ k = 1 N ∣ ∣ k ≠ i ⋅ e x p ( z i ~ ⋅ z k ~ / τ ) L_{z_{i}} = \frac{-1}{N_{y_{i}}-1}\sum_{j=1,j\ne i}^{N}{||\{ y_{i}=y_{j}\}\cdot log \frac{exp(\widetilde{z_{i}} \cdot \widetilde{z_{j}}/\tau)}{\sum_{k=1}^{N}{||_{k\ne i}\cdot exp(\widetilde{z_{i}} \cdot \widetilde{z_{k}}/\tau)}}} Lzi=Nyi11j=1,j=iN∣∣{yi=yj}logk=1Nk=iexp(zi zk /τ)exp(zi zj /τ)
f ( u i ) = ∣ ∣ { u i ≥ ϕ } ⋅ g ( u i ) {f(u_i)}=||\{u_{i}\geq \phi\}\cdot g(u_{i}) f(ui)=∣∣{uiϕ}g(ui)

在上面的公式中,使用 f ( u i ) {f(u_i)} f(ui)来减少偏离目标过多的建议框的数目,防止 IoU 得分过低使得proposal 中包含干扰的背景信息。(图像分类的所有语义信息来自于整张图片。而在目标检测问题中,用于分类的语义信息来自于RPN得到的region proposals,有些IOU较低的proposal可能含有较多的非目标信息。)

其中, z j ~ = z i ∣ ∣ z i ∣ ∣ \widetilde{z_{j}}=\frac{z_{i}}{||z_{i}||} zj =∣∣zi∣∣zi,表示归一化特征;
z i ~ ⋅ z j ~ \widetilde{z_{i}} \cdot \widetilde{z_{j}} zi zj 表示第 i i i个和第 j j j个建议框之间的余弦相似度;
N y i N_{y_{i}} Nyi是具有相同标签 y i y_{i} yi的建议框的数量;
τ \tau τ是超参数;
ϕ \phi ϕ为IOU阈值,取值为0.7;
g ( u i ) g(u_{i}) g(ui)为权重分配函数,为不同的IOU赋予不同的权重。

最终的损失函数为:
L = L r p n + L c l s + L r e g + λ L C P E \mathbb{L}=L_{rpn}+L_{cls}+L_{reg}+\lambda L_{CPE} L=Lrpn+Lcls+Lreg+λLCPE

其中, L r p n L_{rpn} Lrpn是二元交叉熵损失,用于从众多anchor中得到前景proposals、 L c l s L_{cls} Lcls是交叉熵损失,用于proposals分类, L r e g L_{reg} Lreg是smoothed-L1损失,用于box回归。
当在微调阶段传输到新数据时,我们发现对比损耗可以以多任务方式添加到主要Faster RCNN损耗中,而不会破坏训练, λ \lambda λ设置为0.5,以平衡损失规模。
在这里插入图片描述

训练过程:
1、首先,使用丰富的基类数据(Dtrain=Dbase)训练Faster R-CNN检测模型。
2、然后,将训练好的模型迁移到小数据集上。小数据集是由新类和随机抽样的基类组成的混合数据集( D t r a i n = D n o v e l ∪ D b a s e Dtrain=Dnovel\cup Dbase Dtrain=DnovelDbase)。在微调过程中,主干特征提取网络被冻结,联合优化回归损失、分类损失和CPE损失。

其实就是加了一个同类相吸,异类相斥的模块,使用聚类的方法来增大类间差异。

4、实验

实验参数设置

项目Value
基线方法Faster R-CNN
特征提取器ResNet-101+FPN
batch-size16
训练方法SGD优化器
动量0.9
权重衰减0.0001
GPU数量8

验证实验

PASCAL VOC PASCAL VOC中的20个类别分为15个基类和5个新类。所有来自PASCAL VOC 07+12 trainval集合的基类数据都被认为是可用的,新实例的K-shot是从新类中随机抽取的,K=1、2、3、5和10。
在这里插入图片描述

MS COCO 对于COCO中的80个类别,与PASCAL VOC相同的20个类别保留为新类,其余60个类别用作基类。在COCO 2014 val数据集的5K图像上评估了K=10和30个shot的检测性能,并获取了新类的COCOstyle AP和AP75。
在这里插入图片描述

消融实验

为了确定每个模块的最优参数值进行的消融实验:
1、对比分支的参数消融
在这里插入图片描述
2、对比编码损失的参数消融

在这里插入图片描述

new-baseline
在这里插入图片描述
FSCE各个组成模块的消融
在这里插入图片描述

5、结论

引入对比学习的思想

对实例进行建模而不是对类别进行建模

对比分支可以作为二阶段网络的一个即插即用模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(第二章)OpGL超级宝典学习:创建我们第一个OpenGL程序,绘制一个点和三角形

目录前言创建简单的应用创建脚本渲染底色渲染底色plus使用着色器(shader)什么是着色器(shader)GLSLOpenGL的着色阶段编写着色器顶点着色器片段着色器shader对象的创建执行程序的创建删除无用的shader顶点数组对象VAO清理VAO和Prog…

跨孔CT交叉梯度联合反演算法

跨孔CT交叉梯度联合反演算法 利用交叉梯度函数的结构约束作用实现多种跨孔CT的联合反演。 文章目录跨孔CT交叉梯度联合反演算法1、跨孔CT原理2、跨孔CT正演算法2.1 多模块快速推进算法2.2 最短路径法弯曲射线追踪2.3 胖射线追踪2.4 直射线追踪3、跨孔CT正演模型4、交叉梯度联合…

Matlab渐变色生成/编辑器专业版—ColorMapPro

渐变配色在科研绘图时十分常用,比如三维柱状图、特征渲染散点图、热图、曲面图、等高线填充图等等,都需要使用渐变配色。 虽说现成的渐变配色有很多,比如,在TheColor配色工具的渐变颜色库中便集成了近千种的渐变色: 然…

Lambda Python 创建和使用 Layer

目标 由于 Python 代码中需要用到第三方的库, 在 Lambda 中可以通过创建自定义层(Layer)的方式来将这些依赖提供给 Lambda 运行环境. 下面演示创建一个包含第三方库 requests 的层, 以及如何在 Lambda 中调用 准备 zip 文件 首先在本地电脑上将相关依赖下载到名为 python 的…

32.多输入多输出通道

通道数是一个重要的超参数,通常是会仔细设计的。 在之前,我们仅展示了单个输入和单个输出通道的简化例子。 这使得我们可以将输入、卷积核和输出看作二维张量。 当我们添加通道时,我们的输入和隐藏的表示都变成了三维张量。例如&#xff0c…

OpenPCDet详细安装指南+单/多GPU训练演示

OpenPCDet详细安装指南单/多GPU训练演示前言个人环境一览安装环境安装的各版本1. 创建conda虚拟环境2. 安装PyTorch3. 安装spconv4. 安装PCDet5. 训练单GPU训练多GPU训练前言 本人总共花了两个晚上一个下午安装,中间因为各种版本错误、版本不兼容报各种奇奇怪怪的错…

Windows 下使用 Docker + MySQL 安装 Wiki.js

Windows 下使用 Docker MySQL 安装 Wiki.jsIntroductionChapter 1 配置数据库Part 1 数据库安装Part 2 创建 Wiki 相关配置并修改权限Chapter 2 配置 Wiki.jsPart 1 安装Part 2 配置 WikiIntroduction Wiki 是一种在网络上开放且可供多人协同创作的系统,比较著名的…

【触摸屏功能测试】昆仑通态MCGS——测试通过HJ212_TCPIP驱动4G功能发送212报文

1、触摸屏功能测试 型号:TPC7022Ni 测试内容: 实现4G触摸屏,通过自带的4G卡向平台发送HJ212报文 2、HJ212_TCPIP 驱动说明 2.1、驱动介绍 本驱动构件用于MCGS软件,通过污染物在线监控(监测)系统数据传输标准协议向下位机数采仪发送各类指…

MCU-51:静态数码管显示

目录一、数码管介绍2.1 介绍2.2 数码管引脚定义2.3 原理图二、要用到的C语言知识2.1 数组2.2 子函数三、数码管显示3.1 单个数码管显示3.2 通过定位函数实现数码管显示四、动态数码管显示一、数码管介绍 2.1 介绍 LED数码管:数码管是一种简单、廉价的显示器&#…

Word表格常见设置汇总

Word表格常见设置汇总 总结一些Word中常用的关于表格的设置问题。 文章目录1.居中设置2.隔页显示表格首行设置3.边框边线粗细及显示设置4.表格斜线设置5.单元格合并与拆分设置1.居中设置 全选要居中显示部分→布局→选择居中类型。 2.隔页显示表格首行设置 选择表格→表格属性→…

idea插件之自动生成时序图(Sequence Diagram)

前言 小伙们,你们有没有发现,身边经常有这样一些人,看着平时没怎么干活,到关键时候需要展示工作成果,会发现这些人也有工作成果,甚至比辛苦在干的人可能还要多一些。按常理推测,这绝对不是一件科…

【小程序】案例 - 本地生活(首页)

1. 首页效果以及实现步骤 新建项目并梳理项目结构 配置导航栏效果 配置 tabBar 效果 实现轮播图效果 实现九宫格效果 实现图片布局 2. 接口地址 获取轮播图数据列表的接口 【GET】 https://www.escook.cn/slides 获取九宫格数据列表的接口 【GET】 https://www.esco…

XXE工具——XXEinjection安装与使用

今天继续给大家介绍渗透测试相关知识,本文主要内容是XXE工具——XXEinjection安装与使用。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调&#xff1…

直播推流神器 Kplayer 手把手教你在B站7*24h全天直播

开始前的准备工作 Linux服务器 (1)KPlayer目前仅支持Linux环境并需要满足x86_64(amd64)与aarch64(arm64)CPU架构的硬件环境上运行,我们已经将相关依赖库静态链接至主程序中,这意味着你不需要额外的安装任何的第三方库来支持KPlayer的运行。 在后续的迭代…

【数据预处理】基于Pandas的数据预处理技术【前七个任务】

文章目录一.需求分析二.需求解决2.1 本次实验以california_housing加州房价数据集为例,下载数据集2.2 查看数据集的描述、特征及目标数据名称、数据条数、特征数量2.3 将数据读入pandas的DataFrame并转存到csv文件2.4 查看数据集各个特征的类型以及是否有空值2.5 对…

五年经验的前端社招被问:CPU 和 GPU 有什么区别?

CPU 和 GPU 的设计目标和整体架构的区别分析,并在全文最后使用通俗的例子做比喻帮助理解。 首先来看 CPU 和 GPU 的百科解释: CPU(Central ProcessingUnit,中央处理器):功能主要是解释计算机指令以及处理计…

【工作流Activiti7】2、Activiti7 与 Spring Boot 及 Spring Security 整合

1. 前言 其实,选择用Activiti7没别的原因,就是因为穷。但凡是有钱,谁还用开源版的啊,当然是用商业版啦。国外的工作流引擎没有考虑中国的实际情况,很多像回退、委派、撤销等等功能都没有,所以最省事的还是…

若依前后端分离框架去掉首页 登录后跳转至动态路由的第一个路由

若依前后端分离框架去掉首页 登录后跳转至动态路由的第一个路由若依框架VUE前端界面,登录后默认跳转至动态路由第一路由(第一个子菜单)一、登录后跳转第一路由界面二、设置路由的首页路径,方便后续的获取三、点击若依的logo跳转的…

字符串函数(4)--strtok函数和strerror函数

1.strtok函数 — 分割字符串函数 2.strerror函数 — 错误报告函数 1.strstok函数的用法 char* strtok(char* str, const char* delimiters);直接看函数的声明: 参数1:要切割的地址,参数2:切割时的标记物 注意:strt…

单链表的python实现

首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构。 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或…