我的第一篇深度学习相关文章
从我的其他博文可以看出,我以前是搞WebGIS开发的,研究生阶段开始接触深度学习,如今刚开始工作,从事的也是深度学习相关的工作。就在博客记录一下工作上遇到的问题做个笔记。
第一篇就来谈谈深度学习中的Precision,Recall,Accuracy,F1-score,IoU的计算吧,这几种指标容易混淆,他们的计算方式以及含义,这篇文章讲的非常清楚,过多的就不介绍了。
今天主要记录一下在学习这些指标计算的过程中,看到的一些代码的实现方式的理解,如果大家还不熟悉这几种指标的计算可以先看上面提到的文章。
看了一些这几个指标的代码实现,主要实现方式有两种,一种是套公式型,一种是理解型,接下来以语义分割中的二值分割来说明:
1、套公式型
套公式其实就是上面提到的文章,先计算TP,FP,FN,TN,再通过这四个值根据以下公式分别计算出Precision,Recall,Accuracy,F1-score,IoU:
P r e c i s i o n = t p t p + f p Precision = \frac{tp}{tp+fp}Precision=tp+fptp
R e c a l l = t p t p + f n Recall= \frac{tp}{tp+fn}Recall=tp+fntp
A c c u r a c y = t p + t n t p + t n + f p + f n Accuracy= \frac{tp+tn}{tp+tn+fp+fn}Accuracy=tp+tn+fp+fntp+tn
F 1 − s c o r e = 2 ∗ R e c a l l ∗ P r e c i s i o n R e c a l l + P r e c i s i o n F1-score= \frac{2*Recall*Precision}{Recall+Precision}F1−score=Recall+Precision2∗Recall∗Precision
I o U = t p t p + f n + f p IoU= \frac{tp}{tp+fn+fp}IoU=tp+fn+fptp
具体的代码实现如下:
#二值分割图是一个波段的黑白图,正样本值为1,负样本值为0
#通过矩阵的逻辑运算分别计算出tp,tn,fp,fn
seg_inv, gt_inv = np.logical_not(premask), np.logical_not(groundtruth)
true_pos = float(np.logical_and(premask, groundtruth).sum()) # float for division
true_neg = np.logical_and(seg_inv, gt_inv).sum()
false_pos = np.logical_and(premask, gt_inv).sum()
false_neg = np.logical_and(seg_inv, groundtruth).sum()
#然后根据公式分别计算出这几种指标
prec = true_pos / (true_pos + false_pos + 1e-6)
rec = true_pos / (true_pos + false_neg + 1e-6)
accuracy = (true_pos + true_neg) / (true_pos + true_neg + false_pos + false_neg + 1e-6)
F1 = 2 * true_pos / (2 * true_pos + false_pos + false_neg + 1e-6)
IoU = true_pos / (true_pos + false_neg + false_pos + 1e-6)
当然了这几种指标也是可以理解其含义的,比如Precision就是表示预测为正的样本中有多少预测对了,Recall表示真实标签为正的有多少预测对了,Accuracy表示有多少比例的样本预测对了…,但是只要把TP,FP,FN,TN计算出来了,剩下的套公式就行了,知道指标的含义,就不需要再从指标含义出发理解再去计算。
2、理解型
理解型就是通过理解各个指标的含义,不需要再通过计算tp,fp,fn,tn,经过矩阵的直接逻辑运算得到最终的指标,代码如下:
#统计groundtruth中正样本的个数
GT_pos_sum = np.sum(groundtruth == 1)
#统计预测的mask中正样本的个数
Mask_pos_sum = np.sum(premask == 1)
#统计在groundtruth和mask相同位置都是正样本的个数,即实际为正样本,预测也是正样本的个数
True_pos_sum = np.sum((groundtruth == 1) * (premask == 1))
#那么实际为正样本,预测也为正样本占预测的mask中正样本的比例就是Precision
Precision = float(True_pos_sum) / (Mask_pos_sum + 1e-6)
#实际为正样本,预测也为正样本占groundtruth中正样本的比例就是Recall
Recall = float(True_pos_sum) / (GT_pos_sum + 1e-6)
#IoU就是交并比,True_pos_sum就是正样本的交集,groundtruth与premask的正样本相加减去多加了一次的交集,就是最终的交并比
m_Iou = float(True_pos_sum) / (GT_pos_sum + Mask_pos_sum - True_pos_sum + 1e-6)
#这里的F1-score还是通过公式计算出来的,哈哈哈哈
F1_score = 2 * Seg_Precision * Seg_Recall / (Seg_Precision + Seg_Recall + 1e-6)