Torchvision SSD 实施

pytorch玩转深度学习

共 3781字,需浏览 8分钟

 ·

2021-06-26 14:11

在 TorchVision v0.10 中,我们发布了两个基于 SSD 架构的新对象检测模型。我们的计划是在一篇由两部分组成的文章中介绍算法的关键实现细节以及有关如何训练它们的信息。

在本系列的第 1 部分中,我们将重点介绍Single Shot MultiBox Detector 论文中描述的 SSD 算法的原始实现我们将简要介绍该算法的工作原理,然后介绍其主要组件,突出显示其代码的关键部分,最后讨论我们如何训练已发布的模型。我们的目标是涵盖重现模型所需的所有细节,包括论文中未涵盖但属于原始实现部分的优化

固态硬盘如何工作?

强烈建议阅读上述论文,但这里有一个简单的快速复习。我们的目标是检测图像中对象的位置及其类别。这是SSD 论文中的图 5,其中包含模型的预测示例:

SSD 算法使用 CNN 主干,将输入图像通过它并从网络的不同级别获取卷积输出。这些输出的列表称为特征图。然后将这些特征图通过负责预测类别和框位置的分类和回归头。

由于每张图像的特征图包含来自网络不同层次的输出,它们的大小各不相同,因此它们可以捕获不同维度的对象。在每个顶部,我们平铺了几个默认框,可以将其视为我们粗略的先验猜测。对于每个默认框,我们预测是否有一个对象(连同它的类)和它的偏移量(对原始位置的校正)。在训练期间,我们需要首先将地面实况与默认框匹配,然后我们使用这些匹配来估计我们的损失。在推理过程中,组合相似的预测框来估计最终的预测。

SSD 网络架构

在本节中,我们将讨论 SSD 的关键组件。我们的代码紧跟论文,并利用了官方实现中包含的许多未记录的优化

默认框生成器

DefaultBoxGenerator类是负责产生SSD的默认框和功能类似AnchorGenerator(上分歧看到4-6的纸页了解更多信息)FasterRCNN的。它生成一组特定宽度和高度的预定义框,这些框在图像上平铺,并作为对对象可能位于何处的第一个粗略的先验猜测。这是 SSD 论文中的图 1,其中显示了基本事实和默认框:

该类由一组控制其形状平铺的超参数参数化该实现将自动为那些想要尝试新的主干/数据集但也可以传递优化的自定义值的提供默认参数的良好猜测

SSD匹配器

SSDMatcher类扩展了标准的匹配器通过FasterRCNN使用,它负责默认盒匹配的地面实况。在估计所有组合IoU之后,我们使用匹配器为每个默认框找到重叠高于IoU 阈值的最佳候选ground truth SSD 版本的 matcher 有一个额外的步骤,以确保每个 ground truth 与具有最高重叠的默认框匹配匹配器的结果用于模型训练过程中的损失估计。

分类和回归头

SSDHead类负责初始化网络的分类和回归的部分。以下是有关其代码的一些值得注意的细节:

  • 无论是分类回归从头部继承同一个类是负责使每个特征图的预测。

  • 特征图的每一层都使用单独的 3x3 卷积来估计对数框位置

  • 预测数,每头每次水平使得取决于默认的箱数和特征地图的大小。

骨干特征提取器

特征提取器重新配置和增强了标准VGG骨架与如所描述的在SSD纸的图2额外层:

该类支持 TorchVision 的所有 VGG 模型,并且可以为其他类型的 CNN 创建一个类似的提取器类(请参阅此示例以了解 ResNet)。以下是该类的一些实现细节:

  • 修补ceil_mode parameter第三Maxpool层是必要的,以获得相同的功能,地图大小为纸。这是因为 PyTorch 与模型的原始 Caffe 实现之间存在细微差异。

  • 在 VGG 之上添加了一系列额外的特征层如果 highres 参数True在其构建期间,它将附加一个额外的卷积这对于模型的 SSD512 版本很有用。

  • 正如论文第 3 节所述,原始 VGG 的全连接层使用 Atrous转换为卷积此外maxpool5的步幅和内核大小修改

  • 如第 3.1 节所述,L2 归一化用于conv4_3输出,引入一组可学习的权重来控制其缩放。

SSD 算法

实现的最后一个关键部分是SSD 类以下是一些值得注意的细节:

  • 该算法参数由一组类似于其他检测模型参数。强制性的参数是:它负责骨干估计特征地图中,anchor_generator这应该是一个配置实例的的DefaultBoxGenerator类,大小到的输入图像将被调整和num_classes用于分类剔除的背景。

  • 如果未提供head,则构造函数将初始化默认SSDHead为此,我们需要知道主干生成的每个特征图的输出通道数。最初我们尝试从主干中检索此信息,但如果不可用,我们将动态估计它

  • 该算法重用其他检测模型使用的标准BoxCoder 类该类负责对边界框进行编码和解码,并配置为使用与原始实现相同的先验方差

  • 虽然我们重用标准的GeneralizedRCNNTransform 类来调整输入图像的大小和归一化,但 SSD 算法对其进行配置以确保图像大小保持固定。

下面是实现的两个核心方法:

  • compute_loss方法估计标准的 Multi-box 损失,如 SSD 论文第 5 页所述。它使用平滑 L1 损失进行回归,使用标准交叉熵损失硬负采样进行分类。

  • 与所有检测模型一样,forward 方法目前具有不同的行为,具体取决于模型是处于训练模式还是评估模式。它首先调整输入图像大小和标准化,然后将它们传递到主干以获得特征图。然后通过头部传递特征图以获得预测,然后该方法生成默认框

    • 如果模型是训练模式,远期将估计欠条与地面真相默认盒,使用SSDmatcher产生比赛最后估计损失调用compute_loss method

    • 如果模型处于eval 模式,我们首先通过仅保留通过分数阈值的那些来选择最佳检测,选择最有希望的框并运行 NMS 以清理并选择最佳预测。最后,我们对预测进行后处理以将它们调整为原始图像大小。

SSD300 VGG16 型号

SSD 是一个型号家族,因为它可以配置不同的主干和不同的 Head 配置。在本节中,我们将重点介绍所提供的SSD 预训练模型我们将讨论其配置的详细信息以及用于重现报告结果的训练过程。

培训流程

该模型是使用 COCO 数据集训练的,其所有超参数和脚本都可以在我们的参考文件夹中找到下面我们提供有关培训过程中最显着方面的详细信息。

论文超参数

为了在 COCO 上获得最佳结果,我们采用了论文第 3 节中描述的关于优化器配置、权重正则化等的超参数。此外,我们发现采用官方实现中出现的有关优化的优化很有用DefaultBox 生成器的平铺配置论文中没有描述这种优化,但它对于提高较小物体的检测精度至关重要。

数据增强

实施本文第 6 页和第 12 页所述SSD 数据增强策略对于重现结果至关重要。更具体地说,随机“放大”和“缩小”变换的使用使模型对各种输入大小具有鲁棒性,并提高了对中小型对象的精度。最后,由于 VGG16 有相当多的参数,包含在增强中的光度失真具有正则化效果,有助于避免过度拟合。

权重初始化和输入缩放

我们发现有益的另一个方面是遵循论文提出权重初始化方案为此,我们必须通过取消由 0-1执行的缩放ToTensor()并使用符合此缩放的预训练 ImageNet 权重来调整我们的输入缩放方法感谢 Max deGroot在他的 repo 中提供它们)。新卷积的所有权重都使用 Xavier 初始化,并且它们的偏差设置为零。初始化后,网络进行端到端的训练

LR计划

正如论文中所报道的那样,在应用积极的数据增强之后,有必要对模型进行更长时间的训练。我们的实验证实了这一点,我们必须调整学习率、批量大小和总体步骤以达到最佳结果。我们提出的学习方案被配置为相当安全,在步骤之间显示出稳定的迹象,因此一个人可能能够通过仅执行我们 66% 的 epoch 来训练类似的模型。

关键精度改进的细分

重要的是要注意,直接从论文中实现模型是一个迭代过程,在编码、训练、错误修复和调整配置之间循环,直到我们匹配论文中报告的准确性。通常,它还涉及简化训练配方或使用更新的方法对其进行增强。这绝对不是一个线性过程,通过一次改进单个方向来实现增量精度改进,而是涉及探索不同的假设,在不同方面进行增量改进并进行大量回溯。

考虑到这一点,下面我们尝试总结对我们的准确性影响最大的优化。我们通过将各种实验分为 4 个主要组并将实验改进归因于最接近的匹配来做到这一点。请注意,图形的 Y 轴从 18 开始而不是从 0 开始,以使优化之间的差异更加明显:

模型配置地图增量地图
使用“FasterRCNN 风格”超参数的基线——19.5
+ 纸超参数1.621.1
+ 数据增强1.822.9
+ 权重初始化和输入缩放123.9
+ LR 方案1.225.1

我们的最终模型实现了 25.1 的 mAP,并准确再现了论文中报告的 COCO 结果。以下是准确度指标详细分类


浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报