FROC曲线

两次了,问这个froc,我都不知道是个啥,所以来学习了

froc曲线其实与roc曲线类似

froc把横坐标换成了平均的假阳性个数

这里主要对着这个代码讲https://github.com/M3DV/RibFrac-Challenge/blob/master/ribfrac/evaluation.py

前置知识

这是一个肋骨骨折的比赛,有2个任务,第1个是检测(实例分割),第2个是对分割的结果进行分类
froc针对第一个任务

这个比赛要求提交
1.实例分割的.nii.gz文件
2.一个csv
每一行是一个骨折的区域的信息

第一列是图片
第二列是第几个骨折区域
第三列是这个区域骨折的置信度
第四列是骨折类型(对froc不重要)
FROC曲线_第1张图片
这个是ground truth
含义与上面一样
FROC曲线_第2张图片

FROC

首先对每一个图片进行处理

遍历预测的骨折区域,计算这个区域与每一个真实骨折的区域的iou
那么这个预测的骨折区域命中的真实骨折区域,就是iou最大的那个

举个例子
比如第 k k k个预测的骨折区域,与真实的肋骨骨折区域的iou为 [ 0.5 , 0.7 , 0.6 , 0.3 ] \left[0.5,0.7,0.6,0.3\right] [0.5,0.7,0.6,0.3]
那么算命中1号(下标从0计算)

当然如果真的这么算iou,可能复杂度比较高
这份代码的做法是
对预测图和真实的图,取交集和并集,分别计算连通域
遍历交集的连通域,计算那个连通域所属的骨折的iou
其实效果是一样的

计算的结果如下图
第一列是预测的骨折区域的编号
第二列是命中的iou
第三列是命中的真实的骨折的区域的类别
第四列是预测的骨折区域的类别的名字(不重要)
第五列是预测的骨折区域的置信度
第六列是命中的真实的骨折的区域的类别的名字(不重要)
第七列是真实的骨折的个数
FROC曲线_第3张图片
接下来有两个阈值
一个是预测的阈值p_thresh
一个是iou的阈值 iou_thresh

iou的阈值就是控制你的预测不能太离谱(这里固定是0.2)
预测的阈值就和roc曲线的那个阈值类似
通过调整这个阈值,我们可以得到不同的坐标(平均假阳性个数,召回率)
FROC曲线_第4张图片
接着是比赛里的一些指标
FROC曲线_第5张图片

这个1,2,4,8,0.5的recall的计算方法
首先1,2,4,8,0.5代表的是每一张图的平均的假阳性个数
(比如你阈值贼高,那你可能就预测1个阳性,那自然假阳性个数就低了)

首先对计算出来的(平均假阳性个数,召回率),按照假阳性排序
以1为例,找到平均假阳性个数中<=1的点当最接近1的点
找到平均假阳性个数中>=1的点当最接近1的点
然后对这两个点做一阶线性插值,代入1
这里看一下代码就懂了
FROC曲线_第6张图片

比如这个例子中就是取
(0.96250,0.24138)
(1.1,0.25287)
这两个点
做一阶线性插值,代入1
FROC曲线_第7张图片
插值完算出来就是这样
FROC曲线_第8张图片
average_recall就是这5个召回率的平均
max_recall就是不同的阈值下算出来的的召回率中最大的
average_fp_at_max_recall就是不同的阈值下算出来的的平均假阳性个数中最大的(不是特别懂这命名)
FROC曲线_第9张图片

你可能感兴趣的:(深度学习,深度学习,计算机视觉,机器学习)