【深度学习实战(26)】标签处理之语义分割标签转换,数据集划分

一、标签转换

我们在使用labeme标签工具,标注完数据后会获得json文件。在标注结束过后,我们需要通过标签转换操作,生成jpg格式原始图片和png格式mask标签图。
在这里插入图片描述

1.1 使用img_b64_to_arrjson标签中二进制图像数据变成numpy格式数据,再变成jpg图像

/************ Anaconda3\Lib\site-packages\labelme\utils\image.py *************/
def img_b64_to_arr(img_b64):
    img_data = base64.b64decode(img_b64)
    img_arr = img_data_to_arr(img_data)
    return img_arr

在这里插入图片描述
在这里插入图片描述

# 将输出结果保存,
PIL.Image.fromarray(img).save(osp.join(out_jpgs_path, file_name.split(".")[0]+'.jpg'))

在这里插入图片描述

1.2 使用shapes_to_label将分割标签数据变成单通道png mask标签图

/************ Anaconda3\Lib\site-packages\labelme\utils\shape.py *************/
def shapes_to_label(img_shape, shapes, label_name_to_value):
    cls = np.zeros(img_shape[:2], dtype=np.int32)
    ins = np.zeros_like(cls)
    instances = []
    for shape in shapes:
        points = shape["points"]
        label = shape["label"]
        group_id = shape.get("group_id")
        if group_id is None:
            group_id = uuid.uuid1()
        shape_type = shape.get("shape_type", None)

        cls_name = label
        instance = (cls_name, group_id)

        if instance not in instances:
            instances.append(instance)
        ins_id = instances.index(instance) + 1
        cls_id = label_name_to_value[cls_name]

        mask = shape_to_mask(img_shape[:2], points, shape_type)
        cls[mask] = cls_id
        ins[mask] = ins_id

    return cls, ins

在这里插入图片描述
在这里插入图片描述

1.3 语义分割标签转换完整代码

def json2mask(json_file,img_file,filter_cls:list,out_jpgs_path,out_mask_path):
    assert json_file.endswith(".json") 
    file_name = Path(json_file).stem 
    
    if os.path.isfile(json_file):
        data = json.load(open(json_file))

        # 获取json里面的图片数据,也就是二进制数据
        imageData = data.get("imageData")
        # 如果通过data.get获取到的数据为空,就重新读取图片数据
        if not imageData:
            # imagePath = os.path.join(json_file, data["imagePath"])
            imagePath = img_file
            with open(imagePath, "rb") as f:
                imageData = f.read()
                imageData = base64.b64encode(imageData).decode("utf-8")
        #  将二进制数据转变成numpy格式的数据
        img = utils.img_b64_to_arr(imageData)

        if len(filter_cls):
            data["shapes"]=[data_item for data_item in data["shapes"] if not data_item['label'] in filter_cls]

        label_name_2_id =label_name_2_id_sample
        #  将标签数据变成单通道的png mask图
        lbl, _ = utils.shapes_to_label(img.shape, data["shapes"], label_name_2_id)

        label_names = [None] * (max(label_name_2_id.values()) + 1)
        for name, value in label_name_2_id.items():
            label_names[value] = name

        
        lbl_viz = imgviz.label2rgb(
            label=lbl, image=imgviz.asgray(img), label_names=label_names, loc="rb"
        )

        # 将输出结果保存,
        PIL.Image.fromarray(img).save(osp.join(out_jpgs_path, file_name.split(".")[0]+'.jpg'))
        utils.lblsave(osp.join(out_mask_path, "%s.png" % file_name.split(".")[0]), lbl)

在这里插入图片描述

二、验证、训练数据集划分

在经过标签转换后,生成原始jpg图片和png mask标签图。我们还需要进一步进行验证集,训练集划分。

def split_mask(mask_path_list,Base_mask,trainval_percent,train_percent):
    # random.sample随机划分
    num     = len(mask_path_list) 
    _indexes    = range(num)  
    tv      = int(num*trainval_percent)  
    tr      = int(tv*train_percent)  
    trainval= random.sample(_indexes,tv)  
    train   = random.sample(trainval,tr)  
    
    print("train and val size",tv)
    print("train size",tr)
    
    # 创建txt文件
    ftrainval   = open(os.path.join(Base_mask,'trainval.txt'), 'w')  
    ftest       = open(os.path.join(Base_mask,'test.txt'), 'w')  
    ftrain      = open(os.path.join(Base_mask,'train.txt'), 'w')  
    fval        = open(os.path.join(Base_mask,'val.txt'), 'w')  
    
    # 写入txt文件
    for i in _indexes:  
        name = mask_path_list[i].split('.')[0]+'\n'  
        if i in trainval:  
            ftrainval.write(name)  
            if i in train:  
                ftrain.write(name)  
            else:  
                fval.write(name)  
        else:  
            ftest.write(name)  
    # 关闭txt文件
    ftrainval.close()  
    ftrain.close()  
    fval.close()   

生成的验证集,训练集路径txt文件
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/580573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

场外个股期权是什么

场外个股期权是什么 场外个股期权是指在沪深交易所之外交易的个股期权,其本质是一种金融衍生品,允许投资者在股票交易场所外以特定价格买进或卖出证券。这种权利与股价变动情况紧密相关,使得投资者能够根据股价的变动情况对公司进行投票决定…

docker中的资源控制

前言 docker 使用cgrqup控制资源,K8S 里面也有limit(使用上限) docker通过cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 Control …

想要应聘前端工程师——学习路线指南

前端工程师学习路线 按照前端岗位需求,以优先学习工作更需要,面试更常考的内容为原则,由浅入深,层层铺垫,与时俱进,可以较容易地总结出前端学习路线图: HTML / CSS / JavaScript 基础学习 《Web 入门》 MDN 权威入门指南,HTML / CSS / JavaScript 快速上手 《CSS 世界…

安装库后JupyterLab一直报ModuleNotFoundError问题解决

背景: 先安装的Python3.10,安装在默认路径: C:\Users\#用户名省略#\AppData\Local\Programs\Python\Python310\ 后安装的Anaconda,更改过路径在D盘: D:\ProgramData\anaconda3 此时C盘Python安装路径下Scripts文件…

通过阿里云OOS实现定时备份redis实例转储到OSS

功能背景 随着企业业务数据的快速增长,Redis 作为高性能的内存数据存储方案,在多种应用场景下承担着重要的角色。为确保数据安全,定时备份成为了不可或缺的一环。Redis 实例定时备份是关键数据库管理任务的一个重要组成部分,它主…

修改Ubuntu22.04系统图标

在Ubuntu 22.04中更改开机时显示的Ubuntu图标需要修改的设置。 主要思路是用自己图片替换系统图片,保持系统图片同名,同格式。 以下是一般的步骤: 修改启动界面的logo: sudo cp 新logo.png /usr/share/plymouth/themes/spinn…

【mysql】mysql命令使用大全,你想要的都在这里

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

21物联1班作业DES分组密码

DES加密 !!!以下加密自己学号姓名 将密钥zw改为abcde 学号加密 密钥为zw 密钥为abcde DES解密 !!!将desdecode中内容替换成DES加密密文。 学号解密 代码解释 加密代码 问我QQ上要 解密代码 问我QQ上…

【一般排查思路】针对银河麒麟高级服务器操作系统磁盘空间已满

1. 本身磁盘空间已满 有时候我们会看到服务器上有提示“设备上没有空间”,如图1。 图 1 如果是磁盘本身空间已满,我们可以借助du工具来排查,比如首先cd / 切换到根目录,然后 du -sh * | sort -rh | head -n 3查看空间占用最大的…

ardupilot开发 --- RealSense-D400 篇

目录 0. 一些概念1. 用windows检查设备是否正常1. 使用 Intel RealSense SDK 2.0 查看相机图像数据 0. 一些概念 官网:添加链接描述选型:D455 1. 用windows检查设备是否正常 用USB连接D455与PC 下载 Intel.RealSense.Viewer.exe 并打开,设…

无监督学习的评价指标

轮廓系数(Silhouette Coefficient) 轮廓系数用于判断聚类结果的紧密度和分离度。轮廓系数综合了样本与其所属簇内的相似度以及最近的其他簇间的不相似度。 其计算方法如下: 1、计算簇中的每个样本i 1.计算a(i) &#x…

使用Canal实现MySQL主从同步

说明:本文介绍如何使用Canal实现MySQL主从同步的效果,关于Canal入门使用参考:Canal入门使用 启动Canal 首先,设置Canal服务器里,目标节点(即监测的MySQL节点)的配置,启动Canal服务…

多目标果蝇算法及其MATLAB实现

果蝇算法最早的文献是由台湾华夏科技大学的潘文超教授于2011年提出来的。该算法是基于果蝇觅食行为的仿生学原理而提出的一种新兴群体智能优化算法,被称为果蝇优化算法(Fruit Fly Optimization Algorithm, FOA)。通过模拟果蝇利用敏锐的嗅觉和视觉进行捕食的过程&am…

APQC是美国生产力与质量中心

APQC简介 APQC是美国生产力与质量中心( American Productivity and Quality Center)的简称。该中心自1991年开始研究开发流程分类框架(简称PCF),1992年发布PCF1.0。PCF将运营与管理等流程汇总成12项企业级流程类别,每个流程类别包…

项目经理学习PMP对自己工作有多大帮助?

PMP是一种项目管理认证,也是最流行和含金量较高的认证之一。因此,你问它对项目管理有多大帮助,我可以说PMP可以被视为量身定制给项目管理岗人员的一个证书,你能理解它的重要性吗? 随着国家经济建设由基础设施向高端产业…

【新手入门】Git的使用方法,上传自己的项目到GitHub上

Git新手教程 一、Git下载安装二、初始化设置1.网端设置2.用户设置 三、开始上传自己项目1.创建新文件夹,克隆项目地址2.上传文件3.成功运行并上传的界面 报错1.fatal: unable to access https://github.com/ssrzero123/STF-YOLO.git/: error setting certificate fi…

mars3d开发过程中点击面图层飞行定位,设置俯仰角度后,layer.flyTo({没有生效的排查思路

mars3d开发过程中点击面图层飞行定位,设置俯仰角度后,layer.flyTo({没有生效的排查思路记录,给大家提供一下以后排查定位问题的方向 问题场景相关代码: 1.项目本身代码: 2.精简了关键性代码后,就可以去ge…

39-数组 _ 二维数组

39-1 二维数组的创建 行和列编号依旧是从0开始: //arr数组: //1 2 3 4 //2 3 4 5 //2 4 5 6 //三行四列int main() {int arr[3][4]; //存放整数char arr1[5][10]; //存放字符return 0; } 39-2 二维数组的初始化 创建之后,利用初始化赋值…

MySQL-多表查询-练习

练习 1.写一个查询显示所有雇员的 last name、department id、anddepartment name。 SELECT e.LAST_NAME,e.DEPARTMENT_ID,d.DEPARTMENT_NAME FROM employees e,departments d WHERE e.DEPARTMENT_ID d.DEPARTMENT_ID;2.创建一个在部门 80 中的所有工作岗位的唯一列表&#x…

我与C++的爱恋:模板初阶和STL库

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​朋友们大家好,本篇文章介绍一下模版和对STL进行简单的介绍,后续我们进入对STL的学习! ​ 一、模板 1.泛型模板 泛型编程:…