我想了解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)。请注意,按照教程或文件开头所述,在创建模型之前,您应该已经下载了后端权重。
如果您更改了类别数,则随着分类向量大小的变化,检测器部分(前端)中的过滤器数也会发生变化。但是,即使类数发生变化,后端(特征提取器,即主干)也保持不变。
您可以使用与骨干网大小相匹配的任何预训练权重,但是对于整个网络,如果类数变化,您将无法使用。例如,您不能将Racoon的重量用于猫狗探测器。
您不能使用YoloV2原始权重来初始化此网络,因为Darknet和Keras之间的格式不同,您首先必须将它们转换为Keras格式。
如果您有足够的训练数据,最好只使用骨干预先训练的权重。
请注意,还有一个称为转移学习的附加选项。如果您拥有经过预训练的网络(骨干网和前端网),则可以提取骨干权重并使用它们来初始化网络骨干。
不,前端和后端严格来说不是两个独立的网络:它们是两个链接的网络。实际上,在大多数深度学习框架(例如PyTorch,Keras或Tensorflow)中,任何层都可以视为网络(完全连接,卷积,MaxPool等)。
“网络”只是代表任意复杂数学函数的对象,该函数将输入映射到可以应用自动微分的输出(必须定义正向和反向传播)。
在像Yolo这样的单发物体检测器中,将整个网络视为两个网络的链更重要:骨干网和检测器。这种表示允许更通用的构造和更广泛的调优(即,使用性能更高的主干或轻量级的主干)。
是的,您是对的,边界框回归和标签分类发生在整个网络的最末端,因此发生在前端。
前端可以具有任意数量的层,唯一的约束是在其最后一层,该层应遵循特定的通道大小(即给定数量的过滤器),该大小始终受要分类的类数的限制。
一般在最后输出层信道的数量应该是numberOfClasses + 4
其中numberOfClasses
包括背景类和其中数字4代表的边界框的四个坐标。此示例已简化很多,建议您阅读Yolo论文以更好地了解网络结构。
看来探测器网络中只有一个可训练层(此处为2D转换)。请注意,输出的大小受类数限制:self.nb_box * (4 + 1 + self.nb_class)
。
然后用随机分布初始化该层参数。
关于您的最后一个问题,我认为您应该正确地掌握转学的程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句