深度学习指标precision,recall,f1不正常
目前研究方向是做道路分割,做精度评价使用的指标是iou,precision,recall,f1。做测试发现precision,recall,f1总是特别低,百思不得其解。最后只能查看每张测试图像的计算结果。
发现有很多图像iou为1,但是precision,recall,f1都为0,终于恍然大悟,原来有很多图像上是一个道路像素都没有的,求precision,recall,f1指标时我只在分母上加了平滑项。
于是,求指标的代码修改成这样,问题解决:
# 定义一个平滑项,用于防止分母为零
smooth = 1e-6
def precision_score_batch(true: np.ndarray, pred: np.ndarray):
# 获取batch的大小
b = pred.shape[0]
# 将预测值和真实值展平成一维向量
pred = pred.reshape(b, -1)
true = true.reshape(b, -1)
pre = (np.sum(true * pred, axis=1) + smooth) / (np.sum(pred, axis=1) + smooth)
return pre
def recall_score_batch(true: np.ndarray, pred: np.ndarray):
# 获取batch的大小
b = pred.shape[0]
# 将预测值和真实值展平成一维向量
pred = pred.reshape(b, -1)
true = true.reshape(b, -1)
rec = (np.sum(true * pred, axis=1) + smooth) / (np.sum(true, axis=1) + smooth)
return rec
def f1_score_batch(true: np.ndarray, pred: np.ndarray):
# 获取batch的大小
b = pred.shape[0]
# 将预测值和真实值展平成一维向量
pred = pred.reshape(b, -1)
true = true.reshape(b, -1)
pre = (np.sum(true * pred, axis=1) + smooth) / (np.sum(pred, axis=1) + smooth)
rec = (np.sum(true * pred, axis=1) + smooth) / (np.sum(true, axis=1) + smooth)
f1 = (2 * pre * rec + smooth) / (pre + rec + smooth)
return f1