边缘检测BSDS500数据集处理

边缘检测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,范围(05)
    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的时候发现效果才较好~
欢迎各位评论指导!!!

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值