我正在努力理解YOLO (v2)是如何被训练的。为此,我使用这个keras实现https://github.com/experiencor/keras-yolo2从零开始在VOC上训练YOLO (我对其他实现开放,但我从未使用过pytorch,因此,keras实现将是首选)。
1-正如我所理解的,YOLO首先用于在imageNet上进行分类,然后这些经过训练的权重(用于分类)应该在训练yolo进行回归(检测边界框)时使用。在我在互联网上找到的用来从零开始训练yolo的大部分代码(用于回归)中,我没有看到这些分类权重被加载的部分。这是什么时候发生的?什么时候分类权重被用来训练yolo回归?
我的理解是正确的吗?
提前感谢
发布于 2020-03-27 12:49:40
你有两个选择:
在您给出的链接上,所有的内容都说明如下:https://github.com/experiencor/keras-yolo2#2-edit-the-configuration-file。
在该代码中,对整个模型进行预训练权值的加载是这里。这是可选的。
对后端进行预先训练的权重是强制性的(根据本教程),在代码中它是这里 (例如整个Yolo)。注意,在创建模型之前,您应该已经下载了后端权重,如本教程或文件开头所述。
编辑1
如果类的数量发生变化,则检测器部件(前端)中的过滤器数量将随着分类向量大小的变化而变化。但是,即使类的数量发生变化,后端(特性提取器,即主干)仍然保持不变。
您可以使用预先训练过的任何与主干网大小相匹配的预先训练的权重,但对于整个网络,如果类数不同,则不能使用。例如,你不能使用浣熊的重量作为一个狗和猫探测器。
您不能使用YoloV2原始权重来初始化这个网络,因为Darknet和Keras之间的格式不同,您必须首先将它们转换为Keras格式。
如果你有足够的训练数据的话,只使用脊骨预训练的重量是很好的。
请注意,有一个额外的选项称为转移学习。如果你有一个预先训练过的网络(主干和前端),你可以提取主干网权重并使用它们初始化你的网络骨干。
编辑2
不,严格地说,前端和后端不是两个独立的网络:它们是两个链式网络。事实上,在大多数深度学习框架中,如PyTorch、Keras或Tensorflow,任何层都可以看作是一个网络(完全连接、卷积、MaxPool、.)。
“网络”只是一个对象,它表示一个任意复杂的数学函数,将输入映射到可以应用自动微分的输出(必须定义向前和向后传播)。
在像Yolo这样的单镜头目标检测器中,将整个网络看作是两个网络的链更相关:主干和检测器。这种表示形式允许更通用的构造和更广泛的调优(即使用性能更好的主干或轻量级的主干网)。
是的,你是对的,包围盒回归和标签分类发生在整个网络的最末端,因此在前端。
前端可以有任意数量的层,唯一的约束是在它的最后一层,它应该尊重特定的信道大小(即给定数量的过滤器),它总是受到您想要分类的类数的限制。
通常,最后一个输出层中的通道数应该是numberOfClasses + 4,其中numberOfClasses包含背景类,数字4表示包围框的四个坐标。这个例子是简化了很多,我建议你阅读约罗的论文,以更好地理解网络结构。
在检测器网络中似乎只有一个可训练的层( 2D Conv 这里)。注意受类数限制的输出的大小:self.nb_box * (4 + 1 + self.nb_class)。
然后用随机分布初始化该层参数。
关于你的最后一个问题,我认为你对转移学习的程序是正确的,这应该是可行的。
发布于 2020-03-27 11:12:57
我将首先回答你问题的第二部分,
在对象检测中,当图像被标记时,生成包含包围框协调和对象/对象的分类/类的标签文件。
在experiencor代码中,加载的预先训练的权重不是分类权重,而是每个图像中转换为权重的对象的协调和类名。一旦您拥有它们或使用标签文件从头开始对模型进行培训,模型将使用图像和相应的标签文件进行培训,其中包含图像中的对象的包围框、协调和类名。
因此,分类和回归训练是同时进行的。
如果你有疑问,可以随意评论,如果它回答了你的问题,就给它打勾。
https://stackoverflow.com/questions/60881576
复制相似问题