keras - 了解 YOLO 是如何训练的
问题描述
我试图了解 YOLO (v2) 是如何训练的。为此,我正在使用这个 keras 实现https://github.com/experiencor/keras-yolo2在 VOC 数据集上从头开始训练 YOLO(我对其他实现持开放态度,但我从未使用过 pytorch,所以, keras 实现将是首选)。
1-据我了解 YOLO,它首先在 imageNet 上进行分类训练,然后在训练 yolo 进行回归(检测边界框)时,应该在某处使用这些训练的权重(用于分类)。在我在互联网上找到的从头开始训练 yolo(用于回归)的大多数代码中,我没有看到加载这些分类权重的部分。这什么时候发生?什么时候在训练yolo回归时使用分类权重?
2-我在 1) 中的理解是否正确?
提前致谢
解决方案
你有两个选择:
- 对整个检测器(后端+前端,即分类网络+检测器)使用预训练的权重。
- 仅对后端使用预训练的权重。
在您提供的链接上,所有内容都在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)
。
然后用随机分布初始化该层参数。
关于您的最后一个问题,我认为您对迁移学习的程序是正确的,应该可以。
推荐阅读
- pyspark - 使用 PySpark 从 Lat/Lon 列创建 LineString
- c++ - 遍历数据结构中所有可能的元素
- identityserver4 - 添加了自定义声明,显示在访问令牌中缺少的 ID 令牌中
- typescript - 显式指定静态字典值类型,同时推断确切的形状(或至少键)
- javascript - For-in cicle 仅返回 array.push 中的最后一个结果
- javascript - 如何在具有材料表反应的行上获得悬停效果?
- nearprotocol - Near Api 以获取地址的所有交易,直到日期或任何特定的区块高度
- bash - 从末端分割线(跨平台)
- python - 使用 Python 从 Blob 存储下载 Blob
- java - 计算具有相同值的对象的频率数