如何在 YOLO 网络中训练预测框?

数据挖掘 神经网络 深度学习 美国有线电视新闻网
2021-09-26 23:23:07

我刚刚完成了解释 YOLO 网络如何工作的教程。作者没有使用训练集来训练网络的权重,而是加载预训练的权重并使用它们来测试网络。我对你将如何训练这个网络很感兴趣。

我想在大小为 1000 x 1000 的图像上运行网络,并且可以容纳具有 10 个不同类别的对象。网络的前向函数返回一个具有维度的张量

[1, num_bounding_boxes * final_layer_grid_width * final_layer_grid_height, 15].

对于最后一层中的每个单元格和边界框,网络预测 15 个值:

x_center, y_center, bbox_width, bbox_height, object_confidence_score, class_1_confidence_score, ...,class_10_confidence_score

我有一个与图像相对应的标签列表。列表中的每个元素(对应于一张图片)如下所示:

[[313,567,47, 23, 4],
[398, 122, 57, 32, 6],
 ...,
[499, 993, 47, 19, 8]]

第一个元素表示原始H x W图像的点 (313, 567) 是对象的中心,对应的边界框宽度为 47,高度为 23,类别为 4。

我的计划是检查每个对象应根据其坐标和最后一层的步幅分配到最后一层中的哪个网格单元。假设最后一层是 100 x 100 并且输入图像是 1000 x 1000 那么示例标签中的第一个元素应该由网格单元 [31,56] 预测,因为步幅是 10。我认为我可以创建一个基于这种方法的目标张量,我认为我可以通过这种方式训练对象置信度分数和 10 个不同的类别分数。

我不太确定的是如何训练x_center, y_center, bbox_width, bbox_height. 如果最后一层的网格单元不应该预测边界框,这些参数应该保持什么值?

问题:如何训练x_center, y_center, bbox_width, bbox_height参数?

1个回答

这是一个很好的问题,概括了 YOLO 是如何工作的。

所以首先你说你的前进路径给了你一个张量

[1, num_bounding_boxes * final_layer_grid_width * final_layer_grid_height, 15].

为简单起见,让我们将其重新整形为[grid_width, grid_height, num_boxes, x_center, y_center, bbox_width, bbox_height, object_confidence_score, class1, ..., class10],这意味着对于每个 Gridcell 和每个 Boundingboxprior,x_center、y_center、bbox_width、bbox_height 都有一个值。

x_center 和 y_center 预测一个值,该值是 sigmoid 激活的从网格单元边界到边界框实际中点的偏移量。因此b_x = sigmoid(x_center)+ c_x,其中 c_x 是网格单元的 x 坐标,对于b_y = sigmoid(y_center)+ c_y,相应地。

bbox_width 和 bbox_height 是 BBoxprior 在日志空间中的偏移值,因此BB_width = BB_prior*e^(bbox_width)分别为 BB_height。

你可以这样想:如果一个对象在一个网格单元中,object_confidence_score 会告诉你。所以你只需要调整边界框。第一步是计算IOU最高的边界框,下一步是用x_center,y_center调整它的中心,用bbox_width,bbox_height调整高度/宽度。

查看Yolo-V3 论文中使用的公式,尤其是图 2 描述了您要求的参数。