首页 > 解决方案 > 了解 YOLO 是如何训练的

问题描述

我试图了解 YOLO (v2) 是如何训练的。为此,我正在使用这个 keras 实现https://github.com/experiencor/keras-yolo2在 VOC 数据集上从头开始训练 YOLO(我对其他实现持开放态度,但我从未使用过 pytorch,所以, keras 实现将是首选)。

1-据我了解 YOLO,它首先在 imageNet 上进行分类训练,然后在训练 yolo 进行回归(检测边界框)时,应该在某处使用这些训练的权重(用于分类)。在我在互联网上找到的从头开始训练 yolo(用于回归)的大多数代码中,我没有看到加载这些分类权重的部分。这什么时候发生?什么时候在训练yolo回归时使用分类权重?

2-我在 1) 中的理解是否正确?

提前致谢

标签: kerasdeep-learningyolo

解决方案


你有两个选择:

  • 对整个检测器(后端+前端,即分类网络+检测器)使用预训练的权重。
  • 仅对后端使用预训练的权重。

在您提供的链接上,所有内容都在https://github.com/experiencor/keras-yolo2#2-edit-the-configuration-file进行了解释。

在代码中,为整个模型加载预训练的权重在这里完成。它是可选的。

后端的预训练权重是强制性的(根据教程),在此处完成的代码中(完整的 Yolo 示例)。请注意,您应该在创建模型之前下载后端权重,如教程或文件开头所述。

编辑 1

如果您的类别数量发生变化,则检测器部分(前端)中的过滤器数量将随着分类向量大小的变化而变化。然而,即使类的数量发生变化,后端(特征提取器,即主干)也保持不变。

您可以使用预训练的任何与主干大小匹配的预训练权重,但是对于整个网络,如果类的数量不同,则不能。例如,您不能将 Racoon 的权重用于狗和猫检测器。

您不能使用 YoloV2 原始权重来初始化此网络,因为 Darknet 和 Keras 的格式不同,您首先必须将它们转换为 Keras 格式。

如果你有足够的训练数据,只使用主干预训练的权重是可以的。

请注意,还有一个称为迁移学习的附加选项。如果您有预训练的网络(骨干网和前端),您可以提取骨干网权重并使用它们来初始化您的网络骨干网。

编辑 2

不,前端和后端严格来说并不是两个独立的网络:它们是两个链式网络。事实上,在 PyTorch、Keras 或 Tensorflow 等大多数深度学习框架中,任何层都可以被视为一个网络(Fully Connected、Convolutive、MaxPool...)。

“网络”只是一个对象,它代表一个任意复杂的数学函数,将输入映射到可以应用自动微分的输出(您必须定义前向和后向传播)。

在像 Yolo 这样的单次目标检测器中,将整个网络视为两个网络的链更相关:主干网络和检测器。这种表示允许更通用的构造和更广泛的调整(即使用性能更高的主干或轻量级的主干)。

是的,你是对的,边界框回归和标签分类发生在整个网络的最后,因此在前端。

前端可以有任意数量的层,唯一的限制是在它的最后一层,它应该尊重一个特定的通道大小(即给定数量的过滤器),它总是受你想要分类的类数量的限制。

通常最后一个输出层的通道数应该是numberOfClasses + 4包含numberOfClasses背景类的地方,数字4代表边界框的四个坐标。这个例子简化了很多,我建议你阅读 Yolo 论文以更好地了解网络结构。

检测器网络中似乎只有一个可训练层(此处为 2D Conv )。请注意受类数限制的输出大小:self.nb_box * (4 + 1 + self.nb_class)

然后用随机分布初始化该层参数。

关于您的最后一个问题,我认为您对迁移学习的程序是正确的,应该可以。


推荐阅读