必知前置知识

本文总结了小样本目标检测的基础,包括定义、训练过程、迁移学习和元学习两种经典范式,探讨了域偏移、数据偏差等挑战,并提出了注意力机制、图卷积神经网络等研究方向。

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

少样本目标检测基础总结

1.定义和训练过程

小样本目标检测(Few-shot Object Detection,FSOD)相对于通用目标检测最大的不同,是其数据输入的不同,FSOD 将数据集分为基类数据集 D 𝑏 D_𝑏 Db 和新类数据集 D n D_n Dn 。基类数据集 D 𝑏 D_𝑏 Db 由拥有大量标注图像的基类 𝐶 𝑏 𝐶_𝑏 Cb 组成,新类数据集𝐷𝑛 由只有少量标注图像的新类 𝐶 n 𝐶_n Cn 组成,其中,基类类别和新类类别不存在交集,即 𝐶 𝑏 𝐶_𝑏 Cb 𝐶 n 𝐶_n Cn= ϕ \phi ϕ。其目标是通过在基类和新类数据集上训练得到一个模型,期待该模型可以检测出任意给定测试图像中的新类和基类对象。

其定义如图1所示
在这里插入图片描述

图1
小样本目标检测算法的训练过程一般分为两个阶段
  1. 第一阶段使用大量的基类数据 𝐷 b a s e 𝐷_{base} Dbase进行模型的训练,从初始化模型 𝑀 𝑖 𝑛 𝑖 𝑡 𝑀_{𝑖𝑛𝑖𝑡} Minit得到基模型 𝑀 b a s e 𝑀_{base} Mbase,称之为基训练阶段;
  2. 第二阶段使用由少量的基类数据 𝐷 b a s e 𝐷_{base} Dbase和新类数据 𝐷 𝑛 𝑜 𝑣 𝑒 𝑙 𝐷_{𝑛𝑜𝑣𝑒𝑙} Dnovel组成的平衡数据集 𝐷 𝑓 𝑖 𝑛 𝑒 𝑡 𝑢 𝑛 𝑒 𝐷_{𝑓𝑖𝑛𝑒𝑡𝑢𝑛𝑒} Dfinetune对基模型 𝑀 𝑏 𝑎 𝑠 𝑒 𝑀_{𝑏𝑎𝑠𝑒} Mbase进行模型微调,得到最终模型 𝑀 f 𝑀_{f} Mf,称之为微调阶段

其训练过程如图2所示
在这里插入图片描述

图2

2.相关研究

  • 弱监督
  • 半监督
  • 类增量
  • 零样本
  • 单例
    在这里插入图片描述
图3

3.两类经典范式

3.1 基于迁移学习

定义:基于迁移学习的范式是将从已知类中学习到的知识迁移到未知类的检测任务中。

Baseline:两阶段微调方法(Two-stage Fine-tuning Approach,TFA)是迁移学习范式的基线方法,基于Faster R-CNN算法进行改进。

Wang, Xin, et al. “Frustratingly simple few-shot object detection.” arXiv preprint arXiv:2003.06957 (2020).

思路:Faster R-CNN 主干网络是类无关的,特征信息可以很自然的从基类迁移到新类上,仅仅只需要微调检测器的最后一层(包含类别分类和边界框回归),就可以达到远远超过之前方法的性能表现。

实现:整个方法分为基训练和微调两个阶段

  1. 在基训练阶段,整个模型在有着大量标注的基类上训练;
  2. 在微调阶段,冻结网络前期的参数权重,由基类和新类组成的平衡子集对顶层的分类器和回归器进行微调
    在这里插入图片描述
图4

Attention

  1. TFA 在微调阶段的分类器上采用余弦相似性测量候选框和真实类别边界框之间的相似性;
  2. 由于小样本中每个新类别的样本量非常少,其高方差可能会导致检测结果的不可靠,TFA 通过抽样多组训练样本进行评估,并且在不同组进行多次实验得到平均值

3.2 基于元学习

定义:基于元学习的范式是利用元学习器从不同的任务中学习元知识,然后对包含有新类的任务通过元知识的调整完成对新类的检测。
一张图像中可能存在多个感兴趣对象,在小样本模型训练中只需要标注支持集中基类的边界框即可。
元学习范式有两种标注方法:

  • 将支持集裁剪为只包含目标实例的图像;
  • 在表示图像的RGB三通道外,再添加一个掩码通道组成四通道,第四通道使用数字1标注出感兴趣对象的边界框,其他位置用0填充

Baseline:Few-shot object detection via feature reweighting(FSRW)

Kang, Bingyi, et al. “Few-shot object detection via feature reweighting.” Proceedings of the IEEE/CVF International Conference on Computer Vision. 2019.

实现:基于一阶段网络YOLOv2改进。具体来说,在一阶段网络中新增了元特征学习器元学习器模块。

  • 元特征学习器以查询图像为输入,使用YOLOv2的骨干实现,从有充足样本的基类图像中提取具有泛化性的元特征,用于之后检测新类;
  • 元学习器模块以支持集为输入,将新类的某一类别实例转换为一个全局向量,该向量用来检测特定类别的对象实例

网络的训练过程同样分两阶段完成,首先使用基类数据训练连同元学习器模块在内的整个网络模型,然后由少量标注的新类和基类组成的平衡数据集微调模型以适应新类。
在这里插入图片描述

图5

3.3 两种范式对比

相同点

  • 数据集都分为有大量标注的基类数据和只有少量标注的新类数据;
  • 训练过程都分为两阶段进行,分别是基训练阶段和微调阶段,算法模型在基训练阶段学习到基类数据具有泛化性的知识,然后在新类数据上对模型进行微调,达到检测新类的目的;
  • 评价指标相同

不同点

  • 数据的输入方式不同,元学习范式是以任务(episode) 为输入单元,每个任务由支持集图像和查询集图像组成,目的是找到查询集图像中属于支持集类别的目标对象,而迁移学习范式通常不需要分为支持集和查询集两部分;
  • 元学习范式除了通用目标检测模型外,还有一个需要获得类别级元知识的元学习器,而迁移学习范式只需要在通用目标检测模型上改进即可;
  • 元学习范式随着支持集中类别数量的增加,内存利用率会降低,而迁移学习范式不会随着类别数量的增加而使内存利用率降低

4.存在的问题

4.1 域偏移

很多FSOD方法利用大规模数据集来学习generic notions(通用知识),然后通过迁移/微调以满足新任务需求。但在某些情况下,源域和目标域之间共享的跨域知识很少,即存在较大的域偏移,从源域学习到的“通用”知识对目标任务仅产生微弱的影响甚至负面影响。
e.g.很多paper认为RPN是一种可以为所有前景类生成高质量RoIs的理想的proposal algorithm,但是前景类是特定于任务的,而其他类则被定义为负类。因此,这种class-agnostic(类不可知) 的RPN无法为新类提供像基类那样好的RoIs,特别是在有较大域偏移的情况下。
在这里插入图片描述

图6

图6展示了较大和较小域偏移下RPN的性能。Backbone和RPN都是在仅有动物和植物类别的inat2017数据集上进行了预训练。

  • 鸟是inat中的一个类,故RPN生成了较好的建议框;
  • 虽然飞机不是inat中的类,但其和鸟具有类似的视觉特征,故RPN也生成了较好的建议框;
  • TV和inat2017数据集具有较大的域差异,故RPN生成了较差的建议框

4.2 数据偏差

数据集的本质:特定分布的观察样本的集合
现实中,会存在一种现象,即较大的类内偏差 ⇒ \Rightarrow 决策边界模糊。不同于大规模数据集,小规模数据集不可能覆盖所有情况,故其在尺度,上下文,类内多样性等方面具有更大的数据偏差。
基于神经网络的算法易受到噪声/偏差的影响,而导致使用非鲁棒知识来做决策,即过拟合。特别是,基于度量学习的方法需要利用训练集来学习一组鲁棒的类别原型作为特定任务的参数。当训练集有很多异常值(如遮挡)时,难以建立鲁棒的类别原型。
在这里插入图片描述

图7

图7中(a)列出了数据偏差的几个例子,e.g.存在噪声背景和姿势变化;(b)说明了数据偏差的不利影响,从图像池中采样的训练图像的质量会严重影响最终的检测性能。

4.5 不完整标注

问题:在 𝐷 b a s e 𝐷_{base} Dbase上训练时,模型可能会将新类目标视为负样本,并学习抑制这些目标,这其实对于检测新类目标是有害的。
对策:可以将问题视为一个半监督问题。

Li, Yiting, et al. “Few-shot object detection via classification refinement and distractor retreatment.” Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2021.

5.研究(改进)方向

在这里插入图片描述

图6

5.1 基于注意力机制

5.2 基于图卷积神经网络

5.3 基于度量学习

5.4 基于数据增强

参考文献

### C++ 前置自增与后置自增的区别 #### 定义与行为差异 在 C++ 中,`++i` 表示前置自增操作符,而 `i++` 则表示后置自增操作符。两者的共同点是对变量执行加一的操作,但在具体的行为上存在显著区别。 对于前置自增 (`++i`),它会先对变量进行自增操作,然后再返回该变量的值[^1]。这意味着,在表达式中使用 `++i` 时,所得到的结果已经是经过自增之后的新值。 而对于后置自增 (`i++`),它的特点是先返回当前变量的原始值,随后再对该变量执行自增操作。因此,在表达式中使用 `i++` 的情况下,所得结果将是未被修改之前的旧值。 #### 效率上的考虑 另一个重要的不同之处在于性能方面。由于后置自增需要保存原值以便后续返回给调用者,这通常涉及创建一个临时对象来存储这个初始状态。相比之下,前置自增不需要这样的额外开销,因为它直接返回已更新的对象本身。这种机制使得前置自增往往比后置自增更高效,尤其是在处理复杂数据类型或者大型类实例的时候。 #### 运算符重载中的实现细节 当涉及到运算符重载时,前置和后置自增也有各自独特的定义方式: - **前置自增**可以通过成员函数的形式简单地完成,如下所示: ```cpp Counter &operator++() { count++; return *this; } ``` 此处通过增加内部计数器并返回本对象的引用实现了预期功能[^2]。 - **后置自增**则相对复杂一些,因为除了要提升自身的数值外还需要提供原来的副本作为结果输出: ```cpp Counter operator++(int) { Counter temp(*this); count++; return temp; } ``` 上述代码片段展示了如何利用参数列表里的整型占位符区分两种形式,并借助局部变量暂存原有的状况直至最终交付出去。 #### 实际应用案例解析 下面给出一段具体的程序演示上述理论知识点的实际效果: ```cpp #include <iostream> using namespace std; int main(){ int i = 0, m=0; int j = i++; // 使用后置自增 int k = ++m; // 使用前置自增 cout << "i="<< i << "\tj=" << j << endl; cout << "m="<< m << "\tk=" << k << endl; return 0; } /* 输出结果为: i=1 j=0 m=1 k=1 */ ``` 从运行结果可以看出,采用后置自增的情况下(`i++`),虽然最后`i`确实变成了1,但是分配给`j`的那个瞬间还是保持了原来的状态也就是零;相反地,运用前置自增(`++m`)就立即反映了变动情况——既改变了源变量又把新的数值赋予目标位置[^3]。 #### 返回类型的特性说明 另外值得注意的一点就是有关它们各自的返回性质: - 前置自增(++x),其返回的是变量 x 自增后的左值(lvalue), 即指向内存地址可再次参与赋值等动作; - 而后置自增(x++),仅能传递回右值(rvalue),代表不可进一步更改或定位的具体数值而已[^4]。 ### 结论 综上所述,无论是基本原理层面还是实际编码实践当中,C++里边的前置自增同后置自增之间都存在着本质性的差别。理解这些细微却至关重要的概念有助于编写更加精确高效的软件解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值