最近在复现《DeepCrack》论文的程序,苦恼于找不到他文章中的evaluation代码,花费大量时间寻求解决,终于有了一些进展,故记录于此,希望能够帮助到有需要的人。步骤是先看hed评估代码连接中的官方步骤,然后再实施本文的内容。
工具
基于hed论文的评估代码,因为hed的评估代码仅仅针对于BSDS500的数据集进行的,有些特殊的设定是自己的数据集不具备的因此需要对代码和自己的数据集进行修改。修改后的代码在:
数据集
我自己用的数据集是DeepCrack文章所使用的的数据集
CrackLS315/CrackTree260/CRKWH100/Stone331,但是因为eval代码中需要的特定的数据结构,因此还需要自己写脚本去得到特定结构的评估对象和真值。
过程
1、通过自己的模型得到自己的预测结果图像,要保存成.mat文件
根据hed源代码可知,应当在train代码中的val的时候加入保存结果为.mat文件的代码,其中最终保存下来的mat文件应当具有这样的格式:所有的预测值保存在result的变量之中,mat文件的大小正是你的图像大小。
具体代码如下:
其中,DeepCrack采用全卷积框架,因此没有sigmoid激活函数这一步,因此得到的裂缝预测结果图像的值有正有负,而eval工具代码中只接受图像值在(0,1)之间的预测图像,因此要自己在预测结果上加一个sigmiod函数做一个变换,如上图。
2、处理lab图像集
eval工具中也要求lab图像也就是真值groundTrue具有特殊的结构,首先保存进6个cell的groundTrue的变量中。
点进groundTrue:
点进第一个1*1struct:
Segmentation中保存着语义分割的类别,分别是1到你的分割类别数。看了matlab源代码,Segmentation这个有无应该都可。
Boundaries是我们所需要的,里面是0和1,是边缘的像素标签。因此下面我们就要编写生成这样数据结构的脚本。
生成特定结构的lab脚本
在遍历val_loader的代码下加入如下代码:
if epoch==1 : #只需要在一个epoch中生成就行了
Gt_mat=join(cfg.val_save_dir,'groundTrue/mat')
Gt_png=join(cfg.val_save_dir,'groundTrue/png')
if not isdir(Gt_mat):
os.makedirs(Gt_mat)
if not isdir(Gt_png):
os.makedirs(Gt_png)
one=torch.ones_like(val_target)#以下3行代码是为了让lab的mat矩阵中的值是0/1 bool值,0表示非边缘,1表示是边缘
val_target=torch.where(val_target>0.001,one,val_target)
val_target=val_target.bool()
arget_mat=val_target.detach().cpu().numpy()#因为sio.savemat接受的是numpy类因此需要转换以下
for i in range(len(name)):
sio.savemat(join(Gt_mat,'{}.mat'.format(name[i])),{'groundTruth':[{'Boundaries':target_mat[i]}]}) #主要是这一行代码 {'groundTruth':[{'Boundaries':target_mat[i]}]} 即可生成目标格式
至此评估准备工作就做完了,只需要在eval_edge.m文件中data_dir='./val_DeepCrack/epoch-299-test';
和gtDir = './True/groundTrue/mat';
这两个地方修改成自己的数据即可进行评估。