Labelme工具标注格式转化为PaddleSeg格式

labelme标注

关于该软件的详细介绍可以参考以下两篇文章,这里不做详细说明。

json格式转数据文件格式

转换后的格式如下

img.png 
label.png 
label_names.txt 
label_viz.png

转换代码

import os,glob
json_file = glob.glob('Dataset/*.json')#匹配文件,返回一个列表
for file in json_file:
    os.system("labelme_json_to_dataset %s"%(file))#命令行json转数据集文件

转换成功截图,每个文件夹下包含的文件就是上面的4个文件。

labelme格式转PaddleSeg格式

查看训练样本数量

images_path = "/dataset" #设置数据集路径
image_count = len([os.path.join(images_path, image_name) 
          for image_name in os.listdir(images_path)])
print("用于训练的图片样本数量:", image_count)

转换函数

def _sort_images(image_dir):
    """
    对文件夹内的图像进行按照文件名排序
    """
    images = []
    labels = []
​
    for image_name in os.listdir(image_dir):
        if os.path.isdir(os.path.join(image_dir, image_name)):
            images.append(os.path.join(os.path.join(image_dir, image_name), 'img.png'))
            labels.append(os.path.join(os.path.join(image_dir, image_name), 'label.png'))
​
    return sorted(images), sorted(labels)
"""
这里的分割符是\t,后面使用PaddleSeg的时候要注意修改相关代码,因为PaddleSeg读取文件时默认的分割符是空格。
当然也可以将这里的\t替换为空格。
"""
def write_file(mode, images, labels):
    with open('./{}.txt'.format(mode), 'w') as f:
        for i in range(len(images)):
            #f.write('{}\t{}\n'.format(images[i], labels[i]))
            f.write('{} {}\n'.format(images[i], labels[i]))            
    
"""
由于所有文件都是散落在文件夹中,在训练时我们需要使用的是数据集和标签对应的数据关系,
所以我们第一步是对原始的数据集进行整理,得到数据集和标签两个数组,分别一一对应。
这样可以在使用的时候能够很方便的找到原始数据和标签的对应关系,否则对于原有的文件夹图片数据无法直接应用。
"""
images, labels = _sort_images(images_path)
eval_num = int(image_count * 0.15)
​
"""
由于图片数量有限,这里的测试集和验证集采用相同的一组图片。
"""
write_file('train', images[:-eval_num], labels[:-eval_num])
write_file('test', images[-eval_num:], labels[-eval_num:])
write_file('eval', images[-eval_num:], labels[-eval_num:])

看下格式对不对

with open('./train.txt', 'r') as f:
    i = 0
​
    for line in f.readlines():
        image_path, label_path = line.strip().split(' ')
        image = np.array(PilImage.open(image_path))
        label = np.array(PilImage.open(label_path))
    
        if i > 2:
            break
        # 进行图片的展示
        plt.figure()
​
        plt.subplot(1,2,1), 
        plt.title('Train Image')
        plt.imshow(image.astype('uint8'))
        plt.axis('off')
​
        plt.subplot(1,2,2), 
        plt.title('Label')
        plt.imshow(label.astype('uint8'), cmap='gray')
        plt.axis('off')
​
        plt.show()
        i = i + 1

总结

关于数据转换就到这里就结束,下期利用paddleseg实现自己的图像分割项目

参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值