理解YOLO的训练过程

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

据我所知,YOLO首先在ImageNet上进行分类训练,然后这些用于分类的训练权重应该在训练YOLO进行回归(检测边界框)时使用。在我找到的大多数用于从头开始训练YOLO(用于回归)的代码中,我没有看到加载这些分类权重的部分。这是什么时候发生的?分类权重在训练YOLO回归时是如何使用的?

我上面描述的理解是否正确?


回答:

你有两个选择:

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

所有这些都在你提供的链接https://github.com/experiencor/keras-yolo2#2-edit-the-configuration-file中进行了解释。

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

根据教程,后端的预训练权重是必须的,在代码中是在这里完成的(完整YOLO的示例)。请注意,根据教程或文件开头的说明,在创建模型之前,你应该已经下载了后端权重。

编辑1

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

你可以使用任何与主干网络大小匹配的预训练权重,但如果类别数量变化,你不能用于整个网络。例如,你不能使用用于浣熊的权重来检测狗和猫。

你不能使用YOLOv2原始权重来初始化这个网络,因为Darknet和Keras之间的格式不同,你首先必须将它们转换为Keras格式。

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

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

编辑2

不,前端和后端严格来说不是两个独立的网络:它们是两个链接的网络。实际上,在大多数深度学习框架如PyTorch、Keras或TensorFlow中,任何层都可以被视为一个网络(全连接、卷积、最大池化等)。

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

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

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

前端可以有任意数量的层,唯一的约束是它的最后一层应该遵循特定的通道大小(即给定数量的滤波器),这总是由你想要分类的类别数量决定的。

通常,最后输出层的通道数量应该是numberOfClasses + 4,其中numberOfClasses包括背景类,而数字4代表边界框的四个坐标。这个例子被大大简化了,我建议你阅读YOLO论文以更好地理解网络结构。

看起来检测器网络中只有一个可训练层(一个2D卷积层,在这里)。请注意输出的大小是由类别数量决定的:self.nb_box * (4 + 1 + self.nb_class)

然后,这层的参数用随机分布进行初始化。

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

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注