0%

细粒度图像分类挑战

项目标题:

细粒度图像分类挑战

项目背景:

细粒度图像分类的目标,是区分同一超级类别下外观高度相似的多个子类别。与普通图像分类相比,细粒度分类不能只依赖整体轮廓或主体语义,还需要识别花蕊形态、花瓣边缘、局部纹理和颜色分布等细微视觉差异。这些能够区分相似类别的关键局部区域,通常称为判别性区域

以往工作常常从以下角度提升

  • 判别性区域定位
    • 早期方法常依赖部件位置、目标框或局部区域标注,以显式定位关键区域。这类强监督方法具有较强的可解释性,但标注成本高,且不同类别的关键部件并不完全一致,难以扩展到大规模类别体系。
    • 弱监督方法只使用图像级类别标签,通过注意力机制、类激活图、多实例学习或区域排序等方式自动发现与分类相关的局部区域。由于模型无需额外局部标注,更适合实际应用场景。
  • 学习细粒度特征
    • 定位局部区域后,还需要学习具有判别力的局部表征。常见方法包括多尺度特征融合、局部特征聚合和高阶特征交互。以双线性卷积网络为例,模型通过外积操作建模不同特征通道之间的高阶关系,从而增强对局部纹理和细微结构的表达能力。部分方法还会分别建立全局分支和局部分支,使整体语义与局部细节形成互补。
  • 优化表征空间
    • 仅使用交叉熵损失时,模型主要关注分类边界是否正确,但不一定能够形成紧凑、可分的特征空间。对比学习、度量学习和基于间隔的约束可以进一步拉近同类样本,并分离外观相似但类别不同的困难样本,从而提高细粒度识别能力。

此次比赛要求对152类花卉进行分类,每类花卉样本数不超过200,存在某些花卉样本数在50左右。比赛要求模型大小不超过500MB,推理时间不超过100ms一张。禁止外部标注数据。

因此,本项目面向一个低资源、弱监督且具有部署约束的细粒度花卉分类任务。模型需要在缺少部件标注的情况下,自动定位判别性区域,增强局部特征表达,并以较低的参数量和计算成本实现全局语义与局部细节的协同分类。

方法

架构设计

image-20260612232457398

从输入到显著区域

我们输入大小为448*448大小的图像进入冻结的DINOv3 backbone。利用Attention Rollout的思想,取5、8、11层的attention矩阵(B, 12, 789, 789)进行累乘。具体来说是每次先使用softmax归一化后,加上单位矩阵除以二,因为考虑到残差连接。最后对每个head求平均,得到输出rollout矩阵大小为(B,789,789),其中rollout[: 0, 1+reg] 就是显著性分数,大小为(B,784)

得到显著性分数后,我们每次选出一个patch后屏蔽其3 * 3邻域内的patch,如果遍历一次结束但候选池未满,则取消屏蔽从头再次遍历知道选出32个候选区域。

从显著区域到判别性区域

我们从最后一层中取出cand_idx对应的token,并且输入到一个简单的线性中获取一个判别性分数。此分数只用于排序而不是分类所以计算很简单。

实际训练时,这个判别性分数在前期主要依赖于显著性分数,后期显著性分数的占比逐步下降

实际应用时,我们从多层取出这些parts,并进行对齐融合。

在知道目标标签的时候很好选出对应Top-k,但是我们在实际推理的时候是没有对应标签的,所以对于这些候选区,不仅需要进行分类,还要进行ranking。从一张图的32个候选区域选出6个判别区域的过程有些像多实例学习。

为了学好分类器,我们先挑出logit最高的四个区域,然后取出这四个区域完整的logis向量求平均(参考)后softmax,最后计算交叉熵。这里取top-r pooling本质上就好比找出最有价值的局部区域共同投票。

而DecisionRank的目的是训练一个不依赖标签的评分器。它对每个候选区只输出一个标量,推理阶段真正参与局部区域筛选的是这个评分分数,而这个ranking Loss的作用就是在训练阶段教会它哪些区域应该排在前面。也就是说,上述的分类器作为老师,而这个评分器作为学生。我们设计评分机制,也就是说,我们可以依据这个分数对候选区域进行排序。

老师希望区域A得学生分数至少比区域B高出一个margin(γ = 0.05),所以定义Ranking Loss:

判别性区域辅助分类

CAP 提出细粒度识别不仅需要定位信息区域,还要考虑信息区域的空间结构和上下文关系。它关注的是具有空间连续性的 imformative integral,而不是孤立点。对此我们聚合空间邻近 3*3 的 token,具体来说我们收集这个中心点的周围一圈,总共9个token:,然后我们对每个领域token根据Attention Rollout分数做softmax后加权求和。领域聚合完成后,我们对中心patch做残差融合,其中α = 0.6

到了这里我们已经拥有了6个局部区域token,我们让全局CLS主动读取局部区域信息,从而得到一个局部增强后的全局表征。

我们对CLS和parts做cross attention。其中q=CLS,k=选出来的六个局部区域,v也是六个被读取得parts。

具体来说,当前只有一个CLS Query,。六个局部Parts为:。Cross-Attention输出得到一个被局部信息增强的全局分类表征。如果将CLS作为key的话,每个Part都无条件读取相同的CLS信息,无法在六个局部区域之间做选择,同时还需要额外设计一个池化操作,将六个增强后的part汇总成一个分裂表征。

具体计算过程中,我们先计算Q K转置,也就是求内积得到CLS和每个part的相似度,接着除以根号dk进行缩放,然后softmax得到六个局部区域的权重。最后对Value进行加权求和。

最后我们得到两类logits后加权求和

对比学习

我们对局部增强表征做监督对比学习。我们将一个batch内的表征先做L2归一化后求点积衡量相似度(点积有一个温度参数)。对此我们定义Loss

其中m=0.4.这个Loss和TransFG完全一样。属于是最基础的pair-wise loss。

训练技巧

数据增强

类型 参数 强度 目的
RandomResizedCrop (0.70, 1.0) 保守 保留花朵主体
随机旋转 ±60° 较强 增强方向鲁棒性
90 度旋转 p=0.2 中等偏低 进一步减少方向依赖
RandAugment N=2, M=4 轻中等 增强颜色/形变/光照鲁棒性
Random Erasing p=0.05, area 2%~8% 很轻 防止过度依赖单一区域
自定义增强 p=0.18 偏轻 降低背景/环境依赖
MixUp alpha=0.0 关闭 避免破坏局部区域监督
CutMix alpha=0.30 中等 提高局部鲁棒性
CR-CPL SnapMix 开启 关键增强 用语义区域修正 CutMix 标签权重

学习率调度

前5个epoch线性warm up

cosine Annealing 缓慢下降

EMA

结论