0

我阅读了 yolov2 的实现。我对它的损失有一些疑问。下面是损失函数的伪代码,希望我做对了。

costs = np.zeros(output.shape)
for pred_box in all prediction box:  
    if (max iou pred_box has with all truth box < threshold):
        costs[pred_box][obj] = (sigmoid(obj)-0)^2 * 1
    else:
        costs[pred_box][obj] = 0
    costs[pred_box][x] = (sigmoid(x)-0.5)^2 * 0.01  
    costs[pred_box][y] = (sigmoid(y)-0.5)^2 * 0.01  
    costs[pred_box][w] = (w-0)^2 * 0.01  
    costs[pred_box][h] = (h-0)^2 * 0.01  
for truth_box all ground truth box:  
    pred_box = the one prediction box that is supposed to predict for truth_box
    costs[pred_box][obj] = (1-sigmoid(obj))^2 * 5  
    costs[pred_box][x] = (sigmoid(x)-truex)^2 * (2- truew*trueh/imagew*imageh)  
    costs[pred_box][y] = (sigmoid(y)-truey)^2 * (2- truew*trueh/imagew*imageh)  
    costs[pred_box][w] = (w-log(truew/anchorw))^2 * (2- truew*trueh/imagew*imageh)  
    costs[pred_box][h] = (h-log(trueh/anchorh))^2 * (2- truew*trueh/imagew*imageh)  
    costs[pred_box][classes] = softmax_euclidean  
total loss = sum(costs)

我对此有一些疑问:

1. 代码每 10 批随机将火车图像的尺寸调整为 320 到 608 之间的尺寸,但锚框没有相应地调整大小。为什么不调整锚的大小。我的意思是你在 13 中选择了一组最常见的锚*13 特征图,这些锚点在 19*19 特征图中并不常见,所以为什么不根据图像大小调整锚点大小。

2. 对未分配真值的框的 x,y,w,h 预测应用成本,这会促使 w,h 完全适合锚点,默认情况下 x,y 会在单元格中居中,这很有帮助,为什么那。为什么不将位置预测的成本仅应用于分配了事实的那些,而忽略未分配的那些。

3.为什么不简单地应用 (obj-0)^2 作为所有未分配真值框的 obj 预测成本。在 yolov2 中,对未分配真值框的 obj 预测并非全部应用成本,只有那些未分配真值的框和不要与所有事实重叠太多,并且是应用成本。为什么会这样,很复杂。

4

1 回答 1

1

1

在 YOLOv2 的实现中,随机裁剪用于增强训练数据。随机裁剪裁剪图像的一部分并将其扩展,使其具有与原始图像相同的大小。

训练数据的这种增强使得经过训练的网络具有在训练数据中没有看到的不同大小的对象的鲁棒性。因此,不应通过此过程更改锚框。

请记住,锚框是对在训练和预测之前输入的对象形状的假设。但是,如果网络做出这样的假设,那么对于形状与假设大不相同的对象,它就会变得不健壮。数据增强解决了这个问题。

2

这是因为我们不知道中心坐标和盒子形状的真相。当我们训练 YOLO 时,我们使用了责任盒子的概念。它们是要通过培训过程更新的框。

请参阅我的 Medium 帖子的“'负责任的'边界框”部分。

3 这是因为 YOLO 的输出来自卷积层的目录,而不是来自全连接的激活。因此输出不限制在 0 和 1 之间。所以我们应用 sigmoid 函数来表示概率。

于 2018-12-18T13:12:53.277 回答