使用keras的YOLO自定义损失

时间:2018-03-09 11:40:40

标签: python keras loss-function

我正在尝试解决像YOLO这样的问题,除非我的盒子旋转了。因此,我需要添加第6个参数来解释θ/旋转。我只有一节课。我的张量是16x16x6

此实现似乎不起作用。无论网络架构或时代如何,我的损失总是一样的。经过多次改变后,我深信我的损失计算是错误的

def my_loss(y_true,y_pred):

# 0,prob / 1,x /2,y/3,a/4,b/5,theta
#params["w_l"]=[5.0,0.5]
#m1=labels[...,5] > 0
#m2=labels[...,5] < 0
#labels[m1][...,5]/=360
#labels[m2][...,5]=(labels[m2][...,5]+360)/360

    lambda_coord=y_true[...,0]*params["w_l"][0]
    lambda_noobj=-(y_true[...,0] -1.0)*params["w_l"][1]

    ly=K.sum(K.square(y_pred[...,1]-y_true[...,1])*lambda_coord)
    lx=K.sum(K.square(y_pred[...,2]-y_true[...,2])*lambda_coord)
    lt=K.sum(K.square(y_pred[...,5]-y_true[...,5])*lambda_coord)
    la=K.sum(K.square(K.sqrt(y_pred[...,3])-K.sqrt(y_true[...,3]))*lambda_coord)
    lb=K.sum(K.square(K.sqrt(y_pred[...,4])-K.sqrt(y_true[...,4]))*lambda_coord)
    lp=K.sum(K.square(y_true[...,0]-y_pred[...,0])*lambda_noobj)
    return ly+lx+lt+la+lb+lp

我的标签数组包含概率/ y / x / a / b / theta。 来自正数(坐标/大小/ theta)的损失乘以一个因子,以加强它们对总损失的损失,而负数的概率损失减少一个因素,以降低其影响。

有什么建议可以改善或者说什么是错的?

由于

JC

1 个答案:

答案 0 :(得分:0)

我编辑了我的问题,以便我的回答有意义。我的损失计算问题与我的实施无关,而与我如何设置标签无关。

由于对称性,在90度或-90度旋转的盒子基本上是相同的盒子。这两个答案都是正确的,这使得我失去的那个词永远不会减少。

由于opencv rotatebox中theta的范围最终为-90,90,因此我的标签=(标签+90)/ 180解决了我的收敛问题。

希望这会有所帮助。