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