miou
参考结合着看很好
https://www.cnblogs.com/Fish0403/p/17117778.html
只有二标签时
positive为我预测为真,negative为我预测为假,true和false表示我预测的对不对,我预测为真(positive)但他是假(negative),我预测地不对,那就是(FP)
多标签
iou又叫交并比,交intersection,并union
就是交集/并集
示例 猫狗猪三分类评价指标计算
当分类问题是二分问题时,混淆矩阵可以用上面的方法计算。当分类的结果多于两种的时候,混淆矩阵同时适用。以下面的混淆矩阵为例,我们的模型目的是为了预测样本是什么动物,左边是结果。当分析每个类别时,可以将多分类问题看作是每个类别的二分问题:
比如对于猫来说,我预测他不为猫,而且他真的不是猫,这部分我们不管,我们要注意的是我们预测为猫但他不是猫(FP),我们预测不是猫但他真的是猫(FN),以及交集我们预测为猫,他也确实为猫(TP)。
miou具体计算过程
首先求交集和并集
def intersectionAndUnionGPU(output, target, K, ignore_index=255):
# 'K' classes, output and target sizes are N or N * L or N * H * W, each value in range 0 to K - 1.
"""
取交集和并集,为后面计算miou和正确率做铺垫
根据预测标签和真实标签计算出有多少预测对了,以及相应的每一类的预测统计,即每一个标签有多少个点
output:预测标签
target:本来的标签
return 统计数据 area_intersection 预测正确的每一类有多少个 (k,)
area_union area_output + area_target - area_intersection(k,)
area_target 真实标签每一类有多少个(k,)
"""
assert (output.dim() in [1, 2, 3])
assert output.shape == target.shape
output = output.view(-1)#转成1维,其实一直都是1维
target = target.view(-1)
output[target == ignore_index] = ignore_index #如果本身标签为255,则直接将预测标签置为255
intersection = output[output == target] #选出预测正确的的标签
area_intersection = torch.histc(intersection, bins=K, min=0, max=K-1) #预测正确的每一类有多少个
area_output = torch.histc(output, bins=K, min=0, max=K-1)#预测标签每一类有多少个
area_target = torch.histc(target, bins=K, min=0, max=K-1)#真实标签每一类有多少个
area_union = area_output + area_target - area_intersection
return area_intersection, area_union, area_target
intersection = output[output == target]
求交集,就是预测和真实结果一样的位置
area_intersection统计每一类交集TP的数量 tp
area_output 预测标签每一类有多少个 即 tp+fp
area_target 真实标签每一类有多少个 即tp+fn
area_union每一类的并集也就是tp+fp+fn
area_union = area_output + area_target - area_intersection
=tp+fp+fn
然后
miou
np.mean(intersection / (union + 1e-10))
可以看出miou并非是按类中的点进行加权的,而是直接进行平均
正确率
比如猫
就是我预测是猫且对了的个数(tp)/全部猫的总数(这里指真实标签)
也就是target或tp+np
正确率 交集(tp)/target或者是 交集(tp)/tp+np
acc=intersection / (target + 1e-10)
macc=np.mean(intersection / (target + 1e-10))