边缘检测BSDS500数据集处理
数据集链接: 官网链接.
BSDS500就不过多介绍了,这里记录一下我在处理这个数据集用于网络训练的过程。
数据集下载下来以后label是以.m格式保存的,需要处理成.jpg或.png格式。
直接上代码:
from scipy import io
import scipy
import imageio
import os
#读取mat文件中所有数据
#mat文件里面是以字典形式存储的数据
#包括 dict_keys(['__globals__', 'groundTruth', '__header__', '__version__'])
#我们要用到'groundTruth']中的轮廓
#x['groundTruth'][0][0][0][0][1]为轮廓
#x['groundTruth'][0][0][0][0][0]为分割图
def bsds_trans(root, num_anno):
PATH = os.path.join(root, 'data\\groundTruth')
for sub_dir_name in ['train','test','val']:
sub_pth = os.path.join(PATH,sub_dir_name)
##为生成的图片新建个文件夹保存
save_pth = os.path.join(root,'data\\GT_convert_{}'.format(num_anno),sub_dir_name)
os.makedirs(save_pth,exist_ok=True)
print('开始转换'+sub_dir_name+'文件夹中内容')
for index in range(len(os.listdir(sub_pth))):
filename = os.listdir(sub_pth)[index]
data = io.loadmat(os.path.join(sub_pth,filename))
try:
if len(data['groundTruth'][0]) < num_anno+1: raise IndexError
edge_data = data['groundTruth'][0][num_anno][0][0][1]
edge_data_255 = edge_data * 255
new_img_name = filename.split('.')[0]+'.jpg'
print(new_img_name)
imageio.imsave(os.path.join(save_pth,new_img_name), edge_data_255)
except IndexError:
index = min(len(os.listdir(sub_pth))-1, index+1)
filename = os.listdir(sub_pth)[index]
if __name__ == '__main__':
#运行时需要改变root值为BSD500所在的相应根目录
root = 'D:\\桌面\\bsds500\\BSR\\BSDS500'
#选取不同标注者标注的label,范围(0,5)
num_anno = 5
bsds_trans(root, num_anno)
代码大部分来源于网络,说要说明的几点是:
1.这个数据集并非一人标注完成,有好几个标注者,更改函数的num_anno参数就可以得到不同标注者标注的label。
2.标注者不止(0-5)六个人,而是从5开始的标注者就没标几张图片了。 实际上从num_anno = 4开始就有几张图片没标注了,所以这里加了一个异常处理。(不知道是不是我解压过程有问题~)
得到不同标注者标注的真值以后,就要进行图像叠加了。(本来打算直接从网上下载处理好的BSDS500数据集的,可惜没找到)
img_0 = cv2.add(0.5*img_0 , 0.5*img_i)
图像叠加主要用的就是这个函数,不断用其余的label与某一个label做叠加。(代码写的很low就不献丑了~)
我这里上传以下处理后的数据集,没有做任何增广的。
处理后的数据集链接: 百度云链接.
提取码:ea88
第一个与最后一个分别是从官方下载的原始的gt与image;GT_convert_0-5为转成jpg格式的6个不同标注者标注的label,gt_fusion_results是最后叠加后的label。
在训练网络的时候,按照RCF的做法,把label归一化到(0,1)之间,将像素值大于0.5的视为正样本(也就是大于0.5的像素置为1),0的视为负样本,0到0.5之间的把loss置为0。
但是我在实验的时候发现把大于0.5的置为1,会导致label不连续,甚至很多轮廓消失,不知道是不是我上面的处理思想有问题,写这个贴子的主要目的就是欢迎各位评论纠正,我不清楚是不是我的原因。
在我的实验里,我将阈值设为0.25的时候发现效果才较好~
欢迎各位评论指导!!!