我正在尝试解决像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
答案 0 :(得分:0)
我编辑了我的问题,以便我的回答有意义。我的损失计算问题与我的实施无关,而与我如何设置标签无关。
由于对称性,在90度或-90度旋转的盒子基本上是相同的盒子。这两个答案都是正确的,这使得我失去的那个词永远不会减少。
由于opencv rotatebox中theta的范围最终为-90,90,因此我的标签=(标签+90)/ 180解决了我的收敛问题。
希望这会有所帮助。