细粒度论文《Large Scale Fine-Grained Categorization and Domain-Specific Transfer Learning》理解

本文介绍了一种处理数据长尾分布的方法,在iNaturalist2017物种分类比赛中获得第一。研究了图像分辨率对细粒度分类的影响,提出了测量源域与目标域相似度的新方法,并通过选择与目标域相似度高的源域子集,有效进行迁移学习。

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

Yin C, Yang S, Chen S, et al. Large Scale Fine-Grained Categorization and Domain-Specific Transfer Learning. In CVPR, 2018.

 

       这篇论文是目前发表的细粒度分类性能最高的一篇论文,在CUB200数据集上取得了89.6的分类准确率,超过之前最好的结果3%。本文提出一种处理数据的长尾分布的方法,并且在iNaturalist2017大规模物种分类比赛上取得了第一名。在细粒度分类上作者采用了迁移学习的方法,从大规模数据集(如ImageNet,iNaturalist2017数据集)上训练网络,然后将学到的知识迁移到特定域(比如birds,dogs等)的小规模数据集上,进行网络微调,在细粒度图像分类(FGVC)上取得了很好的效果。并且提出了一种测量两个域的相似度的方法。

       常用的FGVC数据集相对较小, 在这种情况下,一般采用微调大型数据集(如ImageNet)预训练的网络。这种常见的设置引出了两个问题:1)在大规模FGVC上实现良好性能的重要因素是什么;2)如何有效地进行迁移学习,首先在大规模数据集上训练网络,然后在特定领域的细粒度数据集上进行微调?针对这两个问题,本文首先提出了一种在大规模细粒度分类上的训练方法,在iNat上取得很好的性能;然后提出一种新方法通过使用搬土距离(earth mover’s distance,即EMD)来测量源域和目标域之间的视觉相似度。然后在源域中选取和目标域相似度较高的子集,对模型进行预训练,将学习到的知识再迁移到目标域上进行细粒度分类。

1,图像分辨率对细粒度的图像分类的影响

       每个网络结构通常有默认的输入大小。例如,AlexNet和VGGNet具有默认输入大小224*224,并且由于全连接层需要固定的特征图大小,因此默认输入大小不容易更改。之后的ResNet和Inception是全卷积的,后面跟的是全局平均池化层,这种设计使得输入图像可以是任意大小。输入图像具有高分辨率,通常包含对细粒度分类很重要的更丰富的信息和微小细节。因此高分辨率输入图像能取得更好的性能。

      

2,域相似度的测量:

       迁移学习可被视为将一组图像从源域S移动到目标域T. 通过将图像移动到另一个域所需的工作量可以定义为它们的图像距离。两个域之间的距离可以定义为所需总工作量的最小值,这种域相似性的定义可以通过搬土距离(EMD)来计算。

       假设有源域S和目标域T. 将两个图像s∈S和t∈T之间的距离定义为它们的特征表示之间的欧几里德距离:d(s,t) = || g(s) - g(t) ||,其中g(∙)表示图像的特征提取器。实验中使用从大规模JFT数据集训练的ResNet-101的倒数第二层中提取的特征作为g(∙)。

       为了便于计算,将类别中图像特征平均值作为该类别所有图像特征。形式上,将源域表示为S=si,wsii=1msi是S中的第 i 个类别, wsi 是该类别中图像的归一化数量; 目标域T类似。m、n分别是源域和目标域的类别总数。则S和T之间的距离定义为它们的搬土距离:

dS,T=EMDS,T=i=1,j=1m,nfi,j di,ji=1,j=1m,nfi,j    (2)

最优流fi,j是解决搬土距离最优化问题的最小总工作量。最后,域相似度定义为:

simS.T=e-γd(S ,   T)     (3)

3,源域选择

       使用公式2中定义的域相似性,我们能从源域中选择一个与目标域更相似的子集。我们使用贪婪选择策略逐步包含源域中最相似的类别。 也就是说,对于源域S中的每个类别si,我们通过sim(si,1,T)计算其与目标域的域相似性。然后选择具有最高域相似性的前k个类别。

### 基于类原型对比学习在多标签和细粒度教育视频分类中的应用 #### 类原型对比学习的核心概念 类原型对比学习是一种通过构建类别级别的代表性向量(即类原型),并利用这些原型之间的关系来进行特征学习的方法。这种方法能够有效捕捉类间差异以及类内一致性,从而提升模型的泛化能力[^1]。 具体而言,在多标签场景下,每个类别的原型可以通过该类别下的所有样本嵌入向量计算得到。通常采用均值池化的方式生成类原型 \( C_k \),其中 \( k \) 表示第 \( k \) 个类别: \[ C_k = \frac{1}{N_k} \sum_{i=1}^{N_k} f(x_i), \] 这里 \( N_k \) 是属于类别 \( k \) 的样本数量,\( f(x_i) \) 则是输入样本 \( x_i \) 经过编码器提取后的特征向量[^2]。 #### 对比损失函数的设计 为了实现更有效的特征表示学习,对比学习框架引入了一种特殊的损失函数——InfoNCE Loss (Information Noise Contrastive Estimation)。这种损失函数旨在最大化正样本对之间的相似性,同时最小化负样本对之间的相似性。对于给定查询样本 \( q \),其对应的正样本集合记作 \( P(q) \),而负样本集合则为 \( N(q) \),那么 InfoNCE Loss 可定义如下: \[ L_{contrastive}(q) = -\log \left( \frac{\exp(\text{sim}(q, p)/\tau)}{\sum_{n \in N(q)} \exp(\text{sim}(q,n)/\tau)+\sum_{p' \in P(q)} \exp(\text{sim}(q,p')/\tau)} \right). \] 这里的 \( \text{sim}() \) 函数通常是余弦相似度或者欧氏距离,参数 \( \tau \) 称为温度超参,控制分布的锐利程度。 #### 多标签与细粒度教育视频分类的应用挑战 当应用于多标签和细粒度教育视频分类时,主要面临以下几个方面的挑战: - **标签不平衡**:某些细粒度类别可能拥有远少于其他类别的标注数据,这会使得训练过程中难以形成可靠的类原型。 - **语义重叠**:不同类别之间可能存在较高的语义关联性,增加了区分难度。 - **时间依赖特性**:相比于静态图片,动态视频还包含了帧间的时间序列信息,这对建模提出了更高要求。 针对上述问题,可以考虑以下改进措施: 1. 引入自适应权重机制调整各类别的重要性; 2. 设计专门的模块捕获跨帧间的长期依赖关系,比如使用 LSTM 或 Transformer 结构; 3. 融合外部知识源辅助优化决策边界。 #### 实验验证与效果分析 实验表明,在多个公开基准数据集上,基于类原型对比学习的方法显著优于传统监督方法以及其他无监督预训练方案。特别是在低资源环境下,由于充分利用了有限样例内部的信息结构,性能优势更加明显。 ```python import torch.nn.functional as F def info_nce_loss(query_embeddings, positive_embeddings, negative_embeddings, temperature=0.5): """ Compute the contrastive loss using InfoNCE formulation. Args: query_embeddings (Tensor): Query embeddings of shape [batch_size, embedding_dim]. positive_embeddings (Tensor): Positive sample embeddings of same shape. negative_embeddings (Tensor): Negative samples with shape [num_negatives * batch_size, embedding_dim]. temperature (float): Temperature parameter controlling sharpness. Returns: Tensor: Scalar value representing computed loss. """ # Normalize all vectors to unit length queries_norm = F.normalize(query_embeddings, dim=-1) positives_norm = F.normalize(positive_embeddings, dim=-1) negatives_norm = F.normalize(negative_embeddings, dim=-1) logits_pos = torch.sum(queries_norm * positives_norm, dim=-1).unsqueeze(-1) / temperature logits_neg = torch.matmul(queries_norm.unsqueeze(1), negatives_norm.T.permute(0, 2, 1)) / temperature full_logits = torch.cat([logits_pos, logits_neg], dim=-1) labels = torch.zeros(full_logits.shape[:2]).to(logits_pos.device).long() return F.cross_entropy(full_logits.view(-1, full_logits.size(-1)), labels.view(-1)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值