昨天写了一个使用CNN检测MRI图片心室的感兴趣区域,输入为512*512,输出为100*100的ROI。在这里的检验指标我是用的是DICE Index,公式如下,其中A指自动分割区域,M是专家已经标记好的ground truth。因为此前是用传统方法进行ROI提取(主要是通过canny边缘检测和霍夫圆形检测),以及使用中心区域直接提取的方法,在这里一并进行比较。
计算Dice指数时需要计算各个分割出的mask的对应坐标的像素值是否匹配,此前使用了两重for循环遍历像素点,感觉是又长又丑,真的是又长又丑,如图2所示:
秉着简洁的原则,对代码进行了精简,添加了两个类,最后精简后的代码如下:
这看着就舒服多了,其中ground_roi是提取出的ground truth类,ground_roi.point为原始图片中已经被划分好的为ROI区域的坐标;ground_roi.sum为ROI总点数,为10201(是101*101的结果,可能是resize过程有一些小问题,明天再解决);ground_roi.location提取每个坐标。pre_roi是预测的ROI类,pre_roi.roi为被自动预测的ROI坐标;pre_roi.sum对ROI总点数求和;pre_roi.location提取每个预测ROI的坐标;pre_roi.mask求出预测ROI与ground truth的重叠的像素个数。
最终求的CNN检测的DICE指数:0.833;直接提取中心区域ROI的DICE指数:0.757;传统方法提取ROI的的DICE指数:0.728,还是有一定效果的。