算法VLCount详解(VLCounter: Text-aware Visual Representation for Zero-Shot Object Counting)

VLCounter:端到端零样本目标计数

视频讲解1:Bilibili视频讲解

视频讲解2:https://www.douyin.com/video/7581341814616067337

论文下载:https://arxiv.org/abs/2312.16580

代码下载:https://github.com/seunggu0305/VLCounter

基于Zero-Shot的计数算法详解(T2ICount: Enhancing Cross-modal Understanding for Zero-Shot Counting)

论文CLIP-Count(基于文本指导的零样本目标计数)详解(PyTorch)

        本文提出了一种端到端的零样本目标计数框架VLCounter,通过改进CLIP模型解决现有两阶段方法的局限性。核心创新包括:1)语义条件提示调优(SPT)将文本语义融入视觉提示,增强类别关注;2)可学习仿射变换(LAT)优化相似度图为计数任务;3)分段感知跳跃连接(SaSC)传递多层级语义信息。实验表明该方法在FSC147等数据集上优于传统方法,实现了无需示例块的直接计数。论文代码已开源,为跨模态理解在计数任务中的应用提供了新思路。

现有方法局限性

        研究零样本目标计数( Zero-Shot Object Counting, ZSOC ​ 问题。 ZSOC 的目标是,在仅给定图像和文本类别名称(如“汽车”)的条件下,无需任何人工标注的示例图像块,就能统计出图像中该类别物体的数量。论文指出现有方法普遍采用“先发现示例块,再计数”的两阶段流程,存在错误传播和需要额外训练数据的问题。为此,作者提出了一个新颖的 端到端单阶段框架 来解决这些挑战
现有 方法局限性
•  发现 阶段的定位错误会直接传递给计数阶段,导致误差累积
•  需要 分别训练和优化两个独立模块,增加系统复杂度和训练 成本
      发现 器通常需要额外的训练数据集,限制了方法的普适性
  CLIP 图像编码器倾向于关注图像中的主导类别,对文本指定的少数类别不敏感
  CLIP 的全局池化操作丢失了像素级的空间信息,而计数是本质上的密集预测任务
•  训练的视觉 - 语言对齐能力未能针对计数任务进行 优化

提出方法

        VLBase是论文提出的一个端到端基线模型,其核心思想是利用预训练的CLIP模型强大的视觉-语言关联能力。CLIP能够将图像块和文本语义映射到同一个特征空间,这使得直接计算图像块与类别名称的相似度成为可能

算法大致过程:模型接收查询图像和类别名称,分别通过CLIP的图像编码器和文本编码器,得到图像块嵌入特征和文本语义嵌入特征。接着,计算每个图像块与文本语义的余弦相似度,生成一个相似度图。这个相似度图已经能够较好地指示目标物体在图像中的位置。最后,一个CNN计数解码器将图像块特征和相似度图融合,直接预测出目标的密度图,求和即可得到总数量

语义条件提示调优(SPT

        为了在微调CLIP图像编码器时更好地融入任务和类别信息,SPT在视觉提示调优(VPT)的基础上进行了改进。它不是简单地添加可学习的提示令牌,而是将文本语义嵌入特征与这些可学习令牌相结合,生成语义条件化的提示。这样,图像编码器在提取特征时,就能更关注与指定类别相关的区域

可学习仿射变换(LAT

        虽然SPT生成的相似度图能定位物体,但计数任务更关注物体的中心点,而非整个区域。LAT通过一个简单的可学习仿射变换(缩放W和偏置B)将相似度图S转换为更适用于计数任务的“计数图”Â。同时,论文使用了一种排序感知对比损失来直接优化这个计数图,使其在物体中心位置有更高的激活。

分段感知跳跃连接(SaSC

        为了将CLIP编码器中间层的丰富语义信息传递给解码器,并保持模型对未见类别的泛化能力,论文设计了SaSC。它从CLIP编码器的不同深度提取特征,使用计数图Â进行过滤以强调物体相关区域,然后通过跳跃连接整合到解码器的对应层中,为解码器提供多层次的语义线索

Zero-Shot目标统计

端到端的Zero-Shot目标统计框架

视觉-文本基准模型

语义条件提示微调Semantic-conditioned Prompt Tuning SPT

可学习的仿射变换Learnable Affine TransformationLAT

语义感知跳跃连接(Segment-aware Skip ConnectionSaSC

损失函数

FSC_147数据集介绍

1 数据集背景与定位

FSC-147(Few-Shot Counting 147)是第一个大规模类别无关计数数据集,专门为推进少样本和零样本物体计数研究而创建。该数据集突破了传统类别特定计数(如只计数人群、车辆)的限制,使模型能够计数任意类别的物体实例。其核心目标是开发通用型物体计数器,仅需少量示例(甚至零示例)即可计数从未见过的新类别。

2 数据内容与统计信息

根据文档内容,FSC-147数据集包含6,135张图像,覆盖了147个完全不同的物体类别。这些类别具有极高的多样性,涵盖了动物、厨房用具、交通工具等各种日常物品。

数据集划分特点
  • 训练集:包含来自89个类别的图像
  • 验证集:包含来自29个类别的图像
  • 测试集:包含来自29个类别的图像
  • 关键特性:训练集、验证集和测试集中的类别是完全不相交的,这确保了评估的公平性,能够真实反映模型对全新类别的泛化能力。
标注信息
  • 每张图像都标注了物体中心的点级标注,可用于生成真实密度图(npy格式)
  • 提供每个图像的类别名称信息
  • 为每张图像提供3个视觉示例(边界框box),用于指定要计数的物体

实验结果

综合比较

        在表1,将VLBaseVLCounter与之前的分类无关计数方法进行了比较。尽管它的设计很简单,但VLBase的性能可以与两阶段方法相媲美,甚至可以使用额外的训练数据。另一方面,VLcounter明显超过了其他ZSOC基线。特别是与ZSC相比,VLCounter在验证MAE和测试MAE方面分别实现了32.94%22.81%的相对提升。评论了与最先进的少量计数方法BMNet的可比结果。对于ZSOC来说,这是一个特别值得注意的里程碑,因为少射方法通常被视为两阶段ZSOC方法的上限;两阶段作品的计数框架通常采用少镜头法。在最右边的列中,提供了每个图像的推理速度。由于本文阶段方法(VLBaseVLCounter)只需要计算对象的时间,因此表明它们的推理速度比两阶段方法(ZSC)快得多,后者需要额外的时间来发现样本(由于实现未完全公开,因此表示为α)。除了推理时间,VLBaseVLCounter需要学习的参数更少,训练时间更短(VLCounter的训练时间大约比BMNet2倍)。

消融实验

可视化

复现《Learning with Fantasy: Semantic-Aware Virtual Contrastive Constraint for Few-Shot Class-Incremental Learning》这篇论文可按以下步骤进行: ### 1. 准备工作 - **获取代码**:该论文的代码地址为https://github.com/zysong0113/SAVC ,可从该地址下载代码到本地 [^2]。 - **明确任务**:论文主要解决少样本类增量学习(Few-shot class-incremental learning,FSCIL)问题,即在有限样本下持续学习新类别且不遗忘旧类别的分类任务 [^3]。 ### 2. 数据处理 - **初始数据处理**:利用初始样本充足的训练数据训练特征提取器。对初始训练样本进行数据增强(增强次数和顺序确定)以扩充初始数据集。例如,可采用特定的图像旋转、翻转等操作,且后续所有增强都按此方式进行 [^4]。 - **增量数据处理**:计算增量训练数据(少样本)中新增类别的原型,通过数据增强和特征提取后得到特征的均值来确定 [^4]。 ### 3. 模型训练 - **特征提取器训练**:采用MoCo的学习策略构建对比损失,结合标准交叉熵分类损失更新模型。扩充版的初始训练数据集经训练好的特征提取器(训练好后冻结)输出特征,并据此计算各初始类别不同增强方式下的原型(特征均值) [^4]。 - **联合优化**:论文采用分类对比任务联合优化框架,同时还涉及每个增量会话的微调更新 [^2]。 ### 4. 模型测试 - **相似度计算与分类**:对测试样本进行数据增强,将增强后的测试样本输入特征提取器得到特征,并对测试特征和所有原型进行标准化。计算测试特征与各原型的平均相似度,将测试样本分类为平均相似度最高的类 [^4]。 ### 代码示例 由于不清楚代码仓库中的具体实现,以下是一个简单示意代码说明数据增强和原型计算的过程: ```python import torch import torchvision.transforms as transforms # 数据增强示例 transform = transforms.Compose([ transforms.RandomRotation(10), transforms.RandomHorizontalFlip() ]) # 假设初始训练数据 initial_data = torch.randn(100, 3, 32, 32) # 100个样本,3通道,32x32图像 augmented_data = [] for sample in initial_data: augmented_sample = transform(sample) augmented_data.append(augmented_sample) augmented_data = torch.stack(augmented_data) # 计算原型示例 def calculate_prototype(data): return torch.mean(data, dim=0) prototype = calculate_prototype(augmented_data) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值