为对象检测实现自定义损失函数

Kit*_*adr 5 python object-detection keras tensorflow

我是 keras 和 tensorflow 的新手。我如何在进行对象检测时实现自定义损失函数,现在我有 5 个参数 - 4 个用于边界框坐标,1 个用于对象是否存在。如果对象存在,损失函数应该返回坐标之间差异的平方,否则如果对象不存在,它应该返回一个巨大的值作为 loss。这是我现在正在尝试的代码:

def loss_func(y_true,y_pred):
  mask = np.array([False, False, False,False,True])   # check column of the class of object
  mask1 = np.array([True, True, True,True,False])     # get the columns of the coordinates of B box
  check_class = K.mean(K.square(tf.subtract(tf.boolean_mask(y_true,mask),tf.boolean_mask(y_pred,mask))))
  mean_square = K.mean(K.square(tf.subtract(tf.boolean_mask(y_true,mask1),tf.boolean_mask(y_pred,mask1))))
  value=K.mean(tf.boolean_mask(y_pred,mask))

  return value*mean_square + check_class
Run Code Online (Sandbox Code Playgroud)

在这里,我屏蔽了其他值以获得最后一个值,即 1000--> 对象存在 0 --> 对象不存在。有没有其他更好的方法来做到这一点?

当我在 Kaggle 中运行时,损失值迅速下降,到第二个时期,损失变为 0。

Din*_*ari 4

首先,我建议使用 1 而不是 1000 作为“图像存在”参数。
您可以操纵 y_true 和 y_pred。

penalty = 100

def lf(y_true,y_pred):
    mean_square = tf.keras.losses.mean_squared_error(y_true[:,0:4], y_pred[:,0:4])
    check_class = tf.subtract(y_true[:,4], y_pred[:,4])
    check_class = check_class * -penalty
    check_class = tf.keras.backend.mean(check_class)
    return mean_square + check_class
Run Code Online (Sandbox Code Playgroud)

上述函数首先检查前 4 个参数的均方误差。
第二部分然后检查“present”参数。
如果不同,则输出-1,如果相同,则输出0。
然后使用惩罚来惩罚错误的参数。

使用一些常量的“惩罚”可能很难训练。我建议将优化器更改为SGD, adam 在这种情况下不会很好地工作,并使用惩罚直到达到满意的结果。