精细视觉分类的精炼训练配方

精细视觉分类的精炼训练配方

原文:towardsdatascience.com/a-refined-training-recipe-for-fine-grained-visual-classification/

在过去的一年里,我在Multitel的研究主要集中在细粒度视觉分类(FGVC)上。具体来说,我致力于构建一个能够在边缘设备上实时运行的鲁棒汽车分类器。这篇帖子是关于这一经历可能成为的一系列反思的一部分。我写这篇文章是为了分享我所学到的经验教训,同时也是为了组织和巩固我所学到的知识。同时,我希望这能让你对我们在 Multitel 进行的高层次工程和应用研究有一个感性的认识,这种工作将学术严谨性与现实世界的限制相结合。无论你是同行研究者、好奇的工程师,还是考虑加入我们团队的人,我希望这篇帖子能提供洞察和灵感。

1. 问题:

我们需要一个能够识别特定车型的系统,而不仅仅是“这是一辆宝马”,还需要知道是哪款宝马以及哪一年。它还需要在资源受限的边缘设备上实时运行,与其他模型并行。这类任务属于细粒度视觉分类(FGVC)的范畴。

图片

两个模型及其判别部分的示例[1]。

FGVC 旨在识别属于超类别(例如动物/植物的物种、汽车型号等)多个下级类别的图像。难度在于理解细粒度视觉差异,这些差异足以区分在整体外观上高度相似但在细粒度特征上有所不同的对象[2]。

图片

细粒度分类与通用图像分类[3]。

FGVC 特别棘手的原因是什么?

  • 类间差异小:类与类之间的视觉差异可能非常微妙。

  • 类内差异大:同时,同一类别的实例可能由于光照、姿势、背景或其他环境因素的变化而有很大的差异。

  • 细微的视觉差异很容易被其他因素如姿势和视角所掩盖。

  • 长尾分布:数据集通常只有少数类别有大量样本,而许多类别只有非常少的示例。例如,你可能只有几幅图像是关于在偏远地区发现的稀有蜘蛛物种,而常见物种有成千上万幅图像。这种不平衡使得模型难以在所有类别中均匀学习。

图片

CUB 200 数据集中的两种海鸥物种展示了细粒度对象分类的难度[4]。

2. 景观:

当我们最初开始解决这个问题时,我们自然转向了文献。我们深入研究学术论文,检查基准数据集,并探索最先进的 FGVC 方法。起初,这个问题似乎比实际情况要复杂得多,至少在我们特定的环境中是这样。

FGVC 已经活跃研究多年,并且有大量方法引入了越来越复杂的架构和流程。例如,许多早期工作提出了两阶段模型:一个定位子网络首先识别判别性物体部分,然后第二个网络基于这些部分进行分类。其他人则专注于定制损失函数、高阶特征交互或使用分层结构进行标签依赖建模。

所有这些方法都是为了解决使 FGVC 如此具有挑战性的微妙视觉差异。如果你对这些方法的演变感兴趣,Wei 等人[2]提供了一个深入的综述,涵盖了其中许多方法。

图片

基于深度学习的细粒度图像分析(FGIA)景观概述 [2]。

当我们更仔细地查看最近的基准结果(来自 Papers with Code 的存档),许多表现最好的解决方案都是基于 transformer 架构。这些模型通常达到了最先进的准确率,但很少讨论推理时间或部署约束。鉴于我们的要求,我们相当确信这些模型在边缘设备上实时运行时不会表现良好,因为该设备已经并行运行了多个模型。

在这项工作的时间,斯坦福汽车的最好结果是 97.1%的准确率,由CMAL-Net实现。

3. 我们的方法:

我们没有从最复杂或最专业的解决方案开始,而是采取了相反的方法:一个我们已知能够满足我们的实时和部署约束的模型,是否能够在任务上表现良好?具体来说,我们询问一个坚实的通用架构是否能够在适当训练的情况下,接近更近期的、更重的模型的表现。

这种思维方式引导我们阅读了 Ross Wightman 等人撰写的论文“ResNet Strikes Back: An Improved Training Procedure in Timm.” 在这篇论文中,Wightman 提出了一个有力的论点:大多数新架构都是使用最新的进步和技术进行训练,但随后与使用过时配方训练的旧基线进行比较。Wightman 认为,经常用作基准的 ResNet-50 并没有得到这些现代改进的好处。他的论文提出了一种改进的训练程序,并表明,当适当训练时,即使是普通的 ResNet-50 也能取得令人惊讶的良好结果,包括在几个 FGVC 基准上。

在这些约束和目标在心中,我们着手构建我们自己的强大、可重用的训练流程,一个可以在 FGVC 任务上提供高性能而无需依赖特定架构技巧的流程。想法很简单:从一个已知、高效的骨干网络如 ResNet-50 开始,并完全专注于改进训练流程而不是修改模型本身。这样,相同的配方可以稍后应用于其他架构,只需进行最小调整。

我们开始从多个来源收集想法、技术和训练改进,将最佳实践复合成一个单一的、连贯的流程。特别是,我们从四个关键资源中汲取灵感:

  • 使用卷积神经网络进行图像分类的技巧集(He 等人)

  • 复合卷积神经网络中组装技术的性能改进(Lee 等人)

  • ResNet 反击:Timm(Wightman 等人)中的改进训练流程

  • 使用 TorchVision 最新原语训练最先进模型的方法(Vryniotis)

我们的目标是创建一个不依赖于模型特定调整的稳健训练流程。这意味着专注于在架构间广泛适用的技术。

为了测试和验证我们的训练流程,我们使用了斯坦福汽车数据集[9],这是一个广泛使用的细粒度分类基准,与我们的实际应用场景紧密相关。该数据集包含 196 个汽车类别和 16,185 张图片,所有图片都是从后面拍摄的,以强调类间细微的差异。数据几乎均匀地分为 8,144 张训练图片和 8,041 张测试图片。为了模拟我们的部署场景,其中分类模型在目标检测系统之后运行,我们在训练和评估之前将每张图片裁剪到其标注的边界框。

虽然数据集的原始托管网站已不再可用,但它仍然可以通过如 Kaggle 和 Huggingface 等精选仓库访问。该数据集在BSD-3-Clause 许可下分发,允许商业和非商业使用。在本工作中,它仅用于研究背景,以产生此处展示的结果。

斯坦福汽车数据集[9]裁剪图片的示例。

构建配方

以下是我们通过实验、迭代和仔细汇总上述作品中提到的想法而得出的提炼训练配方。我们的想法是表明,通过简单地应用现代训练最佳实践,没有任何架构特定技巧,我们可以使通用模型如 ResNet-50 在细粒度基准上具有竞争力。

我们将从使用基本设置训练的 vanilla ResNet-50 开始,并逐步引入改进,一次一步。

对于每种技术,我们将报告:

  • 个人性能提升

  • 添加到流程后的累积增益

虽然许多使用的技术可能很熟悉,但我们的意图是强调当有意组合时它们可以多么强大。基准测试通常通过比较使用最新进展训练的新架构与使用过时配方训练的旧基线来掩盖这一点。在这里,我们想反过来,展示在广泛可用、高效的骨干网络上应用精心调校的配方所能实现的可能性。

我们也认识到许多这些技术之间相互影响。因此,在实践中,我们通过贪婪搜索或网格搜索调整了一些组合,以考虑协同作用和相互依赖。

基础配方:

在深入优化之前,我们从一个干净、简单的基线开始。

我们使用Stanford Cars数据集在预训练的ImageNet上训练一个ResNet-50模型。每个模型在一个单独的RTX 4090 GPU上训练600 个 epoch,基于验证准确率使用200 个 epoch 的耐心进行早期停止

我们使用:

  • Nesterov 加速梯度(NAG)用于优化

  • 学习率:0.01

  • 批大小:32

  • 动量:0.9

  • 损失函数:交叉熵

所有训练和验证图像都被裁剪到其边界框并调整到224×224像素。我们开始时采用与[5]中相同的标准增强策略。

这里是基础训练配置及其性能的总结:

| 模型 | 预训练 | 优化器 | 学习率

动量 批大小
ResNet50 ImageNet
损失函数 图像大小
交叉熵损失 224×224

我们在运行之间固定随机种子以确保可重复性和减少实验之间的方差。为了评估配方变化的真正影响,我们遵循最佳实践,并在多次运行(通常是 3 到 5 次)上平均结果。

我们现在将逐步构建在这个基础之上,每次介绍一种技术,并跟踪其对准确率的影响。目标是隔离每个组件的贡献以及它们组合应用时的累积效应。

大批量训练:

在小批量 SGD 中,梯度下降是一个随机过程,因为每个批次中的示例是随机选择的。增加批大小不会改变随机梯度的期望,但会减少其方差。然而,使用大批大小可能会减慢训练进度。对于相同数量的 epoch,与使用较小批大小训练的模型相比,使用大批大小训练的模型在验证准确率上有所下降。

He 等人[5]认为,随着批大小的增加线性增加学习率在 ResNet-50 训练中经验上是有效的。

为了提高训练的准确性和速度,我们将批大小改为 128,学习率改为 0.1。我们添加了一个 StepLR 调度器,每 30 个 epoch 将每个参数组的学习率衰减 0.1。

学习率预热:

由于在训练开始时所有参数通常是随机值,因此使用过大的学习率可能会导致数值不稳定性。

在预热启发式方法中,我们开始时使用一个小学习率,然后在训练过程稳定后切换回初始学习率。我们使用一种逐渐预热策略,将学习率从 0 线性增加到初始学习率。

我们为 5 个轮次添加了线性预热策略。

学习率曲线。图由作者提供。

模型 预训练 优化器 学习率 动量
ResNet50 ImageNet NAG 0.1 0.9
批量大小 损失函数 图像大小 轮数 耐心度
128 交叉熵损失 224×224 600 200
增强方法 调度器 调度器步长 调度器伽马 预热方法
标准化 StepLR 30 0.1 线性
预热 轮数 预热衰减 准确率 增量提升 绝对提升
5 0.01 89.21 +0.99 +0.99

Trivial Augment:

为了探索更强的数据增强的影响,我们将基线增强替换为 TrivialAugment。Trivial Augment 的工作原理如下。它接受一个图像 x 和一组增强 A 作为输入。然后它简单地从 A 中均匀随机抽取一个增强,并以从可能的强度集合 {0, ..., 30} 中均匀随机抽取的强度 m 应用此增强到给定的图像 x,并返回增强后的图像。

使 TrivialAugment 特别吸引人的是,它是 完全无参数的,不需要搜索或调整,使其成为一个简单而有效的即插即用替换,从而降低了实验复杂性。

虽然这样的通用和随机策略似乎会优于针对数据集特定定制的增强或更复杂的自动化增强方法,但我们尝试了各种替代方案,TrivialAugment 在所有运行中始终提供了强大的结果。它的简单性、稳定性和出人意料的高效性使其成为一个有吸引力的默认选择。

TrivialAugment 的可视化 [10]。

模型 预训练 优化器 学习率 动量
ResNet50 ImageNet NAG 0.1 0.9
批量大小 损失函数 图像大小 轮数 耐心度
128 交叉熵损失 224×224 600 200
增强方法 调度器 调度器步长 调度器伽马 预热方法
TrivialAugment StepLR 30 0.1 线性
预热轮数 预热衰减 准确率 增量提升 绝对提升
5 0.01 92.66 +3.45 +4.44

余弦学习率衰减:

接下来,我们探索了修改学习率计划。我们切换到余弦退火策略,该策略通过余弦函数从初始值降低到 0 来降低学习率。余弦的一个大优点是没有任何超参数需要优化,这又减少了我们的搜索空间。

更新的学习率曲线。图片由作者提供。

模型 预训练 优化器 学习率 动量
ResNet50 ImageNet NAG 0.1 0.9
批大小 损失函数 图像大小 迭代次数 耐心度
128 交叉熵损失 224×224 600 200
增强方法 调度器 调度器步长 调度器伽马 预热方法
简单增强 余弦 线性
预热迭代次数 预热衰减 准确率 增量改进 绝对改进
5 0.01 93.22 +0.56 +5

标签平滑:

减少过拟合的一个好方法是阻止模型变得过于自信。这可以通过使用标签平滑来软化真实标签来实现。其思路是将真实标签的构造改为:

[q_i = \begin{cases}

1 – ε,& 如果 i = y,\

\frac{\varepsilon}{K – 1}, & \text{otherwise}.

\end{cases} ]

有一个参数控制平滑的程度(越高越强),我们需要指定。我们使用了ε = 0.1的平滑因子,这是原始论文中提出的标准值,并且在文献中被广泛采用。

有趣的是,我们通过实验发现,添加标签平滑可以减少训练过程中的梯度方差。这使得我们能够安全地增加学习率,而不会破坏训练过程。因此,我们将初始学习率从 0.1 增加到 0.4

模型 预训练 优化器 学习率 动量
ResNet50 ImageNet NAG 0.1 0.9
批大小 损失函数 图像大小 迭代次数 耐心度
128 交叉熵损失 224×224 600 200
增强方法 调度器 调度器步长 调度器伽马 预热方法
简单增强 StepLR 30 0.1 线性
预热迭代次数 预热衰减 标签平滑 准确率 增量改进
5 0.01 0.1 94.5 +1.28
绝对改进
+6.28

随机擦除:

作为一种额外的正则化形式,我们将随机擦除引入到训练流程中。这种技术随机选择图像中的一个矩形区域,并用随机值替换其像素,以固定的概率。

通常与自动增强方法配对,由于其正则化效果,通常会在准确率上带来额外的改进。我们添加了概率为 0.1 的随机擦除。

随机擦除的例子 [11]。

模型 预训练 优化器 学习率 动量
ResNet50 ImageNet NAG 0.1 0.9
批量大小 损失函数 图像大小 轮次 耐心
128 交叉熵损失 224×224 600 200
增强方法 调度器 调度器步长 调度器伽玛 预热方法
简单增强 步长学习率调整 30 0.1 线性
预热轮次 预热衰减 标签平滑 随机擦除 准确率
5 0.01 0.1 0.1 94.93
增量改进 绝对改进
+0.43 +6.71

指数移动平均(EMA):

使用小批量训练神经网络会在梯度下降在批量之间更新模型参数时引入噪声和更不精确的梯度。指数移动平均在训练深度神经网络时用于提高其稳定性和泛化能力。

与仅使用训练期间直接学习的原始权重不同,EMA 维护模型权重的运行平均值,然后在每一步训练中使用当前权重和先前 EMA 值的加权平均值进行更新。

具体来说,在每一步训练中,指数移动平均(EMA)的权重是通过以下方式更新的:

[\theta_{\mathrm{EMA}} \leftarrow \alpha , \theta_{\mathrm{EMA}} + (1 – \alpha) , \theta]

其中θ是当前模型权重,α是一个衰减因子,它控制过去赋予多少权重。

通过在测试时评估 EMA 权重而不是原始权重,我们发现运行间的性能一致性得到了改善,尤其是在训练的后期阶段。

模型 预训练 优化器 学习率 动量
ResNet50 ImageNet NAG 0.1 0.9
批量大小 损失函数 图像大小 轮次 耐心
128 交叉熵损失 224×224 600 200
增强方法 调度器 调度器步长 调度器伽玛 预热方法
简单增强 步长学习率调整 30 0.1 线性
预热轮次 预热衰减 标签平滑 随机擦除 EMA 步骤
5 0.01 0.1 0.1 32
EMA 衰减 准确率 增量改进 绝对改进
0.994 94.93 0 +6.71

我们单独测试了 EMA,并发现它在训练稳定性和验证性能方面都带来了显著的改进。但是,当我们把 EMA 与其他技术整合到完整的方案中时,它并没有带来进一步的改进。结果似乎达到了平台期,这表明大部分的收益已经被其他组件所捕获。

由于我们的目标是开发一个通用训练方案而不是针对单个数据集过度定制,我们选择保留 EMA 在最终设置中。在其他条件下,其优势可能更为明显,并且其低开销使其成为一个安全的选择。

我们测试了一些优化方法但没有采用:

我们还探索了一系列在其他图像分类任务中通常有效的额外技术,但发现它们要么没有带来显著的改进,或者在某些情况下,在斯坦福汽车数据集上略微降低了性能

  • 权重衰减:在训练过程中添加 L2 正则化以抑制大权重。我们在我们的用例中广泛地实验了权重衰减,但它始终降低了性能。

  • Cutmix/Mixup:Cutmix 替换图像之间的随机补丁并混合相应的标签。Mixup 通过线性组合图像和标签对来创建新的训练样本。我们尝试在训练过程中随机以相等的概率应用 CutMix 或 MixUp,但这种方法降低了结果。

  • AutoAugment:取得了强大的结果和有竞争力的准确度,但我们发现TrivialAugment更好。更重要的是,TrivialAugment 完全无参数,这减少了我们的搜索空间并简化了调整。

  • 替代优化器和调度器:我们尝试了广泛的优化器和学习率调度器。Nesterov 加速梯度(NAG)在优化器中始终给我们带来最佳性能,而余弦退火作为最佳调度器脱颖而出,它提供了强大的结果,无需调整额外的超参数。

4. 结论:

下面的图表总结了我们在逐步构建训练方案过程中的改进:

图片

模型细化带来的累积准确度提升。图由作者提供。

仅使用标准的ResNet-50,我们就能在斯坦福汽车数据集上实现强大的性能,这证明了仔细调整一些简单技术可以在细粒度分类中取得长足的进步。

然而,保持这种观点很重要。这些结果主要表明,我们可以在一个干净、精心整理的数据集中训练一个模型来区分细粒度、表现良好的类别。斯坦福汽车数据集几乎类别平衡,包含高质量、主要是正面的图像,且没有重大遮挡或现实世界的噪声。它没有解决像长尾分布、领域迁移或未知类别的识别等挑战。

在实践中,你永远不会有一个覆盖所有汽车型号的数据集——尤其是那些每天更新以适应新模型的型号。现实世界的系统需要处理分布性变化开放集识别不完美的输入

因此,虽然这提供了一个强大的基线和概念证明,但仍然需要做大量的工作来构建一个稳健且适用于生产的系统。

参考文献:

[1] Krause, Deng, et al. Collecting a Large-Scale Dataset of Fine-Grained Cars.

[2] Wei, et al. Fine-Grained Image Analysis with Deep Learning: A Survey.

[3] Reslan 和 Farou。使用深度学习自动进行鸟类物种的细粒度分类。

[4] Zhao 等人。基于深度学习的细粒度物体分类和语义分割综述。

[5] He 等人。卷积神经网络图像分类的技巧汇总。

[6] Lee 等人。在卷积神经网络中组合组装技术的性能改进。

[7] Wightman 等人。ResNet 反击:Timm 中的改进训练过程。

[8] Vryniotis。如何使用 TorchVision 的最新原语训练最先进的模型。

[9] Krause 等人,用于细粒度分类的 3D 对象表示。

[10] Müller 和 Hutter。TrivialAugment:无需调整且最先进的数据增强。

[11] Zhong 等人,随机擦除数据增强。

posted @ 2026-03-27 10:41  布客飞龙IV  阅读(1)  评论(0)    收藏  举报