在我看论文:《?Holistically-nested Edge Detection (HED) 》的时候,对论文中有关边缘结果的评价指标很感兴趣,于是我就研究了如何计算这些指标
如果有同样感兴趣或者有需要的小伙伴可以下载这里的代码:GitHub - xwjabc/hed: A PyTorch reimplementation of Holistically-Nested Edge Detection?进行学习,相信会给你带来收获的!
其中,我在运行文件 eval_edge.m 的时候总是会报错,如图所示:
看错误的位置是在文件 edgesEvalImg.m 第55行处:引用了不存在的字段 ' groundTruth '?,打开该文件,可以看到有这样一句代码:
通过我对该文件源码的理解,此处的G是真实边缘标签图像数据所在的路径,所以我应该将我的tif格式的图像数据转换为字段为groundTruth的MAT文件
这是我的40张真实边缘标签图像
在这里,我使用如下图所示的代码对40张真实边缘标签图像数据进行转换
转换结果如下图所示:
可以看到每张tif图像数据都对应着其mat文件,说明转换成功了!
But
当我再次运行eval_edge.m文件的时候,又出现了新的错误,如图所示:
这个错误依然发生在文件 edgesEvalImg.m 中,在该文件的第77行处:此类型的变量不支持使用花括号进行索引
这说明数据依然不符合这里要求的格式
经过上网查找资料,我意识到这里需要的是由cell数组封装的struct的mat文件
所以不但需要将边缘标签图像数据转换为.mat文件,而且还应该是由cell数组封装的结构体mat文件
故,使用如下图所示代码可以将40张真实边缘标签图转换为符合要求的数据格式
# 每张tif格式的图像数据转换为mat文件,该mat文件是由cell数组封装的struct类型的
import scipy.io as sio
data_dir = 'images/test_mat/'
for filename in os.listdir(data_dir):
name_extracted = filename.rsplit('.', maxsplit=1)[0] # 使用 rsplit() 函数以 '_' 分割文件名,仅获取前两个部分
print(f"基本名称为:{name_extracted}")
print(f"图像路径为:{os.path.join(data_dir,filename)}")
# img = cv2.imread(os.path.join(data_dir,filename))
img = cv2.imread(os.path.join(data_dir,filename),0)
label_name = f"images/test_mat/{name_extracted}.mat"
sio.savemat(label_name, {'groundTruth':[{'Boundaries':img}]})
运行结果如下图所示:
可以得到新的转换后的mat文件,将它们用matlab打开,可以看到如图所示的数据存储结构:
首先是一个cell数组,其次cell数组是一个1x1的struct(结构体),结构体中是大小为512x512的图像矩阵
此时再次运行文件 eval_edge.m,可以看到成功了!