关于yolov2中损失函数的问题



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

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时,我们使用责任箱的概念。它们是要在培训过程中更新的方框。

请参阅"我的Medium帖子的"负责任的"边界框。

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

最新更新