您有两个选择:
- 对整个检测器(后端+前端,即分类网络+检测器)使用预先训练的权重。
- 仅对后端使用预先训练的权重。
一切解释如下https://github.com/experiencor/keras-yolo2#2-edit-the-configuration-file https://github.com/experiencor/keras-yolo2#2-edit-the-configuration-file在你给的链接上。
在代码中,完成了整个模型的预训练权重的加载here https://github.com/experiencor/keras-yolo2/blob/8bc3fcdc123a5d6b9624ed4188e07b876b79dac5/train.py#L73。它是可选的。
后端的预训练权重是强制性的(根据教程),在代码中已完成here https://github.com/experiencor/keras-yolo2/blob/8bc3fcdc123a5d6b9624ed4188e07b876b79dac5/backend.py#L167(完整 Yolo 的示例)。请注意,您应该在创建模型之前下载后端权重,如教程中或本文开头所述file https://github.com/experiencor/keras-yolo2/blob/8bc3fcdc123a5d6b9624ed4188e07b876b79dac5/backend.py#L11.
Edit 1
如果类的数量发生变化,检测器部分(前端)中的滤波器数量将随着分类向量大小的变化而变化。然而,即使类的数量发生变化,后端(特征提取器,即主干)也保持不变。
您可以使用与骨干网大小相匹配的任何预训练权重,但对于整个网络,如果类别数量不同,则不能使用。例如,您不能将 Racoon 的重量用于狗和猫探测器。
您不能使用 YoloV2 原始权重来初始化该网络,因为 Darknet 和 Keras 之间的格式不同,您首先必须将它们转换为 Keras 格式。
如果您有足够的训练数据,则可以仅使用骨干预训练权重。
请注意,还有一个称为迁移学习的附加选项。如果您有预先训练的网络(主干网络和前端),您可以提取主干权重并使用它们来初始化网络主干。
Edit 2
不,严格来说,前端和后端并不是两个独立的网络:它们是两个链式网络。事实上,在大多数深度学习框架(例如 PyTorch、Keras 或 Tensorflow)中,任何层都可以被视为网络(全连接、卷积、MaxPool 等)。
“网络”只是一个对象,表示将输入映射到可以应用自动微分的输出的任意复杂数学函数(您必须定义前向和后向传播)。
在像 Yolo 这样的单次目标检测器中,将整个网络视为两个网络的链更为相关:backbone和detector。这种表示允许更通用的构造和更广泛的调整(即使用性能更高的主干或轻量级主干)。
是的,你是对的,边界框回归和标签分类发生在整个网络的最末端,因此发生在前端。
前端可以有任意数量的层,唯一的约束是在最后一层,它应该尊重特定的通道大小(即给定数量的过滤器),该大小始终受到要分类的类数量的限制。
通常最后一个输出层的通道数应该是numberOfClasses + 4
where numberOfClasses
包括背景类,其中数字 4 表示边界框的四个坐标。这个例子简化了很多,我建议你阅读Yolo论文以更好地理解网络结构。
看起来只有一个可训练层(2D Convhere https://github.com/experiencor/keras-yolo2/blob/8bc3fcdc123a5d6b9624ed4188e07b876b79dac5/frontend.py#L63)在检测器网络中。请注意输出的大小受类数量的限制:self.nb_box * (4 + 1 + self.nb_class)
.
然后使用随机分布初始化该层参数。
关于你的最后一个问题,我认为你对迁移学习程序的理解是正确的,这应该可行。