Zero-Shot 物体检测

Zero-Shot Learning

零样本学习总体来说是一种特殊的迁移学习。旨在将源域上训练完成的模型,迁移到没有标注数据的目标域中。因为缺少标注数据,所以在迁移过程,源域模型不能对目标域数据进行拟合训练。即源域模型需要直接在目标域上进行测试。如下图所示

模型源域识别出狮子,老虎,豹子后,在没有拟合猫图片的情况下,依然能够识别出目标域中的猫。上述任务中体现zero-shot的两个关键点:
  1. 猫没有在源域中出现过
  2. 猫在目标域中没有标注样本可供迁移训练

现阶段对于zero-shot研究,大多需要引入语义信息的帮助。即在训练源域数据过程中,模型不仅可以观察到图片信息,还可以观察到与图片对应的语义信息,同时语义信息是纵贯目标域与源域,因此可以建立源域与目标域之间的桥梁。简单分类架构如下图所示,其主要将视觉特征映射到语义空间中计算损失。

如上图所示,在训练阶段,三个样本输入CNN网络提取视觉特征,将得到的视觉特征与每个类别的词向量计算相似度,最后将源域中的类别进行softmax激活并且计算损失。测试阶段,模型输入在源域中没有出现过的训练样本“猫”时,计算源域相似度时,与词向量“猫”的相似度将最大,完成zero-shot 分类。所以有意义的语义信息是上述模型成功的关键,即在语义空间中各个向量合乎现实中的逻辑(猫与老虎相近,与狗不相近)

Zero-Shot Object Detection

对于物体检测而言,每张图片中可能有多个物体。测试样本中可能既包含新的物体也包含源域中出现过的物体,这比上述zero-shot learning难度更大。

论文:Transductive Learning for Zero-Shot Object Detection

Shafin Rahman, Salman Khan, Nick Barnes; The IEEE International Conference on Computer Vision (ICCV), 2019, pp. 6082-6091

关键点:

  1. 直推式学习(Transductive Learning)解决零样本物体检测,在直推式学习中,无标签的测试样本是可以参与训练的。直推式学习关注的是如何当前问题,而不作推广。论文中一句话有体现:Transductive ZSD: Predict category labels and object locations for only ‘unseen’ classes present in the set Xts.(你细品~~)
  2. 自监督(self-learning)调整模型
模型整体框架
  1. 目标域无标签图片输入Inductive Model产生Fixed Label(1)(2)
  2. 使用Inductive参数初始化Transductive Model(3)
  3. 使用初始化后的Transductive Model对目标域数据产生Dynamic Label(4)(5)
  4. 将Fixed和Dynamic Label输入Transductive Model中,动态迭代Dynamic Label
  5. 最后得到理想的分类
使用源域有标签数据训练Inductive Model

首先使用源域可见数据训练一个Inductive ZSD模型,这个模型可以完成候选框视觉特征与标签语义特征的对齐,通过sigmoid或者softmax获得分类结果。

f表示候选框的的视觉特征,U表示映射参数,W表示语义空间,所得结果**p**为这个候选框在语义空间中与每个类别的相似度,随后**p**作为模型预测值与标签计算focal loss。 在后续操作中,需要将无标注的目标域数据输入训练好的Inductive Model中,产生伪标签(体现自监督)。
Transductive ZSD

直推式学习既需要迁移源域标注数据中所学的知识,也需学习目标域无标签数据的新知识。为解决两问题,模型分别使用Fixed pseudo-labeling与Dynamic pseudo-labeling完成旧知识的迁移与新知识的学习。

  1. Fixed Pseudo-labeling
    首先使用已完成训练的Inductive Model识别无标签目标域数据中已经训练过的类,将其标记为Fixd Pseudo-labeling。因为Inductive Model已经在有标记的数据上完成训练,所以其检测出的物体具有一定可信度,可被视为真实标签。在整个Tranductive模型训练过程中,Fixed Pseudo-labeling保持不变,并且配合Dynamic pseudo-labeling
    计算损失,这样模型可以将源域所学知识稳定迁移到目标域中。
  2. Dynamic Pseudo-labeling
    使用Dynamic Pseudo-labeling主要是为学习目标域新知识,所以其需要动态调整。首先使用Inductive Model的参数初始化Tranductive Model,使用Tranductive Model为目标域中所有数据产生伪标签,数据包括包含已训练完成的类别以及未曾训练的类别。

Dynamic Pseudo-labeling的动态调整是个啥过程?
众所周知,如果模型认为候选框属于某个类别概率越高,其分类越准确。对于可见类和不可见类而言,如果模型认为候选框属于某类别的概率超过阈值0.9,那么我们有很大的把握认为模型分类是正确的。即这个候选框可被认定为完成分类,所以在迭代过程中,候选框会产生另一种伪标签:已完成分类/未完成分类。而模型的任务就是使“已完成分类”的伪标签越多越好!如下图:

猫作为一个不可见类,在不断迭代优化的过程中也可以完成正确的分类。可见类与不可见类的损失由下式给出:
需要注意,在Dynamic Pseudo-labeling不断优化中,Fixed Pseudo-labeling是固定不变的,即某个候选框可能既产生Fixed损失也产生Dynamic损失。最后模型总体损失由Fixed loss与Dynamic loss共同决定,如下图:

论文:A Multi-Space Approach to Zero-Shot Object Detection

Dikshant Gupta, Aditya Anantharaman, Nehal Mamgain, Sowmya Kamath S, Vineeth N Balasubramanian, C.V. Jawahar; The IEEE Winter Conference on Applications of Computer Vision (WACV), 2020, pp. 1209-1217

关键点:

  1. 在语义空间中融合视觉特征,在视觉空间中融合语义特征
  2. 在两种空间中计算相似度,在公共空间中合并

现有Zero-Shot研究,将视觉空间与语义空间相互映射,或将两者映射到公共空间。但是对于不同类别,其在语义空间与视觉空间对应特征所具备的区分性不同。有些类别可能在语义空间很容易区分,有些类别则容易在视觉空间区分,为使用不同类别在两种空间的区分度,本文将不同空间进行对齐,结果进行融合,达到使用不同空间共同预测的效果(并不是在公共空间预测)。

  1. 首先使用Faster-RCNN框架产生候每个选框特征p,由p获得softmax操作后的scores:c
  2. 使用Wsem将所得c映射到语义空间中:Wsem × c
  3. 计算第二步映射后向量与label语义空间向量的相似性
    使用均方误差计算每一维度的损失。
  4. 与此同时,使用子网络将语义信息映射到视觉空间中
  5. 计算第五步获得特征与第一步中p的相似度
    损失函数中,使用max-margin损失使视觉空间特征与ground truth对应类别映射特征相似,与其他类别映射特征不相似。
    Sii表示与ground truth的相似度,Sij表示与其他类别相似度。
  6. 随后将语义空间与视觉空间相似性合并,下列两种方式选其一:

Zero Shot Detection(基于YOLOV2的零样本物体检测)

  1. 使用Feature-Extraction提取基础特征TF(13,13,1024)
  2. Object-Localization模块:定位物体,将TF卷积为TL(13,13,5×4)的定位信息,5个候选框,每个四个定位值
  3. Semantic-Prediction模块:使用语义信息链接seen类和unseen类,具体来说,将TF卷积为TS(13,13,5×64),每个候选框对应一个64维的语义信息
  4. Confidence Prediction模块:将TF,TL,TS拼接为(13, 13,1024+320+20)的block,使用1×1卷积卷它,最后得到TC(13,13,5),TC表示每个候选框的置信度

损失函数:
回归定位损失:

语义相似损失:
置信度损失:
论文中并没有指出如何解决**避免将Unseen类预测为背景**,使用语义信息作为连接seen类和unseen类的桥梁,默认网络在seen类别上训练完成后,可以自动根据类之间的语义相关性推广到unseen类别的检测中,应该是一个试探性的工作。

Don’t Even Look Once: Synthesizing Features for Zero-Shot Detection(基于YOLOV2的零样本物体检测)
论文认为只要能产生足够好的候选框,即定位物体准确,就可以借助ZSR的工作解决分类问题,所以文章致力于解决如何产生准确的seen+unseen候选框。

网络在只用Seen类别的训练集中训练完成后,已经能够定位出Seen物体并完成分类。但是当面对Unseen物体时,网络会给出较低的置信度,这就导致Unseen类别难以检测。如果Confidence Predictor模块能够给予unseen较高的置信度就可以缓解此问题,所以我们需要将Unseen的特征输入Confidence Predictor模块进行训练,至于如何得到Unseen特征,答案就是使用生成网络,如下:

使用Seen类的特征 f 以及语义信息 S 训练CVAE,并通过4个损失函数进行约束,最后得到一个生成器G。其可以根据随机噪声 z 以及语义信息 S 生成视觉特征 f 。所以可以使用G以及Unseen类的语义信息生成Unseen类的视觉特征,并且将生成的Unseen特征以及Seen特征输入到Confidence Predictor中完成训练,最后将Confidence Predictor插入原网络中,完成Unseen类检测。
在这里插入图片描述

### Few-Shot Learning 和 Zero-Shot Learning 的概念 Few-shot learning 是指一种机器学习范式,在这种情况下,模型只需要少量标注数据即可完成特定任务。它通常用于解决样本稀缺的情况,例如某些领域中的罕见事件或昂贵的数据采集过程[^1]。具体来说,few-shot learning 可以通过迁移已有的知识到新任务上实现高效的学习效果。 Zero-shot learning 则是一种更为极端的场景,其中模型不需要任何目标类别的训练样本来执行分类或其他预测任务。它是基于跨模态的知识转移来实现的,比如利用自然语言描述或者其他辅助信息帮助识别未见过的类别[^2]。 两者之间的主要区别在于所需样本的数量:few-shot 需要极少数几个例子来进行泛化;而 zero-shot 完全不依赖于目标类别的实例,而是依靠先验知识进行推理[^3]。 #### 应用案例分析 ##### Few-Shot Learning 的应用场景 Few-shot learning 广泛应用于图像分类、物体检测等领域。例如,在医疗影像诊断中,由于疾病种类繁多且每种疾病的病例数量有限,传统的深度学习方法可能无法有效工作。此时采用 few-shot 学习技术能够显著提升性能。另外,在语音合成方面也可以看到其身影——当面对新的说话者声音时,仅需几秒钟音频片段便能生成高质量模仿音效[^5]。 以下是 Python 实现的一个简单示例框架: ```python import torch from torchvision import models, transforms from torch.utils.data import DataLoader # 假设我们有一个预训练好的卷积神经网络作为特征提取器 feature_extractor = models.resnet18(pretrained=True) def train_few_shot_model(support_set, query_set): support_loader = DataLoader(support_set) query_loader = DataLoader(query_set) optimizer = torch.optim.Adam(feature_extractor.parameters(), lr=0.001) for epoch in range(epochs): # epochs 数可以根据实际情况调整 for batch_support, _ in support_loader: outputs = feature_extractor(batch_support) loss_fn(outputs).backward() optimizer.step() train_few_shot_model(support_data, test_queries) ``` 此代码展示了如何使用 ResNet 进行特征提取并结合支持集和支持查询优化参数的过程。 ##### Zero-Shot Learning 的实际用途 Zero-shot learning 主要在跨域问题中有重要价值,像跨语言文本处理、视觉语义理解等方面都有所体现。举个例子,如果我们要开发一个多标签图片标记系统,那么即使存在一些从未出现在训练集中却可以通过属性关联被正确辨认出来的对象类型也是可行的。这得益于 zero-shot 方法可以从其他相关联的信息源获取必要的线索[^4]。 同样给出一段伪代码表示基本流程: ```python class ZSLModel(torch.nn.Module): def __init__(self, word_embeddings_dim, num_classes): super(ZSLModel, self).__init__() self.fc_layer = nn.Linear(word_embeddings_dim, num_classes) def forward(self, input_features): output_scores = self.fc_layer(input_features) return F.softmax(output_scores, dim=-1) model_instance = ZSLModel(vocab_size=len(glove_vectors), class_count=len(all_possible_labels)) predicted_probabilities = model_instance(example_sentence_embedding) ``` 上述脚本定义了一个简单的线性映射层用来连接词向量空间与类别概率分布之间关系,并最终输出各候选答案的可能性大小。 ### 总结说明 无论是 few-shot 还是 zero-shot learning,它们都在推动人工智能向着更加灵活通用方向发展迈进了一大步。尽管目前仍面临诸多挑战,但随着研究深入和技术进步,相信未来会有更多突破性的成果涌现出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值