我阅读了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预测并非全部应用的成本,而仅是那些未分配真值的框分配了真相,并且与所有真相没有太多重叠,并且是应用成本。为什么会这样,很复杂。
答案 0 :(得分:1)
1
在YOLOv2的实施中,随机裁剪用于扩充训练数据。随机裁剪会裁剪图像的一部分并将其扩展为与原始图像相同的大小。
训练数据的这种增加使训练后的网络能够在训练数据中看不到的不同大小的对象上变得强大。因此,不应在此过程中更改锚框。
请记住,在训练和预测之前,锚定框是对物体形状的假设。但是,如果网络做出这样的假设,则形状与假设有很大不同的对象将变得不那么健壮。数据扩充解决了这个问题。
2
这是因为我们不知道中心坐标和盒子形状的真相。培训YOLO时,我们使用的是负责任的盒子。它们是要在培训过程中更新的方框。
请参阅“ my Medium post的“负责任的边界框”。
3 这是因为YOLO的输出来自卷积层的目录,而不是来自完全连接的激活的目录。因此输出不受限制在0到1之间。因此,我们应用S形函数以使其代表概率。