我刚刚完成了解释 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
参数?