xy_loss = object_mask * box_loss_scale * K.binary_crossentropy(raw_true_xy, raw_pred[...,0:2], from_logits=True)
wh_loss = object_mask * box_loss_scale * 0.5 * K.square(raw_true_wh-raw_pred[...,2:4])
confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True)+ \
(1-object_mask) * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True) * ignore_mask
class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[...,5:], from_logits=True)
坐标xy采用的二分类交叉熵损失,因为坐标xy的预测实际进行了归一化,是一个相对值。
而宽高wh则采用的差方和,等于1/2*(真值-预测的值)^2。这里使用1/2只是为了方便求导时约掉系数。
这里值得一提的是box_loss_scale 这个值,它等于2-目标面积,这个值是用于平衡大小目标之间的损失不均的问题,因为小目标在wh和xy的损失和大目标在wh和xy的损失不相同,大的目标的检测框的预测相对偏移值由于和大的anchor相比,所以相对值较小,但是小目标和小的anchor相比,所以小目标对于坐标和高宽的精确程度更加严格,所以采用box_loss_scale 来加重其损失权重。