240718_使用Labelme制作自己的图像分割数据集

240718_使用Labelme制作自己的图像分割数据集

从目标检测入门的朋友们可能更熟悉的是LabelImg,这里要注意做好区分,LabelImg和Labelme不是一个东西,如下经典图:

image-20240718171255970

(a)图像分类(目标检测):一张图像中是否含某种物体
(b)物体定位(目标检测与目标识别):确定目标位置和所属类别。
(c)语义分割(目标分割和目标分类):对图像进行像素级分类,预测每个像素属于的类别,不区分个体;(所有的CUBE一个颜色)
(d)实例分割(目标分割和目标识别):定位图中每个物体,并进行像素级标注,区分不同个体;(CUBE都是不同颜色)

LabelImg做的是b图的工作,拉框框把目标标注出来,通常用于目标检测和识别任务,其输出为.xml或者.txt。

Labelme可以完成图中所有工作,与LabelImg对比,Labelme可以拉多边形的框,准确的把轮廓标注出来,常用于分割,输出为json。

我们在完成图像识别的任务,例如使用YOLO v5时,可能用到的是LabelImg,但如果需要完成分割的任务,例如使用经典的Unet,我们就需要使用Labelme。

在使用该工具开始工作之前,肯定要先安装工具。

安装Labelme

首先新建一个专属于Labelme的虚拟环境,因为该工具是基于PyQt实现的,所以我们也要在该虚拟环境中安装PyQt。

conda create -n Labelme python=3.9
conda activate Labelme
pip install PyQt5
pip install labelme

使用Labelme进行打标

安装完成后直接在该虚拟环境中输入labelme就可以启动该工具。

image-20240718173454466

image-20240718173520497

点击左上角打开,打开我们的图像,同样可以采取打开目录进行批量打开。点击上方创建多边形,就可以开始画框框了,用过ps钢笔工具或者套索工具的同学应该比较熟练。

image-20240718174218754

拉一个多边形框的最后一步点击初始点就可以闭合,然后会有一个弹窗让我们输入标签名称,此时我输入bottle。

image-20240718174449390

同理完成其他图像的标注。

image-20240718175309354

本来这个杯子我是想先把外围整个框好,再去找删除选区工具把他把手包含的空白删掉的,但好像没有这个工具,只能一笔拉好,产生了路线重叠,见谅。

然后点击CTRL+S保存,就可以保存一份json文件。

P:如果没有目标,比如我们做裂缝检测任务,图像中没有裂缝,我们可以不进行标注,直接CTRL+S保存,也可以生成一份json文件,用作正样本。

json转png

但在我们实际投入神经网络下训练的过程中,通常不使用json格式的标签,而是使用png格式,所以此时我们就需要进行格式转换。

针对这个问题,labelme官方给了解决方案,该工具包含一个json_to_dataset.py文件,在自己的虚拟环境目录下,例如我这里就是

D:\SoftWares\Codes\Anaconda\envs\Labelme\Lib\site-packages\labelme\cli

image-20240719122736702

在使用该py脚本进行格式转换时需要在命令行键入(例如我们的json文件路径为D:\l_139\桌面\Snipaste_2024-07-18_17-38-25.json)(需要进入虚拟环境,往后看看)

python json_to_dataset.py D:\l_139\桌面\Snipaste_2024-07-18_17-38-25.json

当然,官方也给我们准备了可执行的exe文件labelme_json_to_dataset.exe,位于虚拟环境目录下的Scripts文件夹下,我这里的路径为

D:\SoftWares\Codes\Anaconda\envs\Labelme\Scripts

在命令行键入以下命令即可实现转换

labelme_json_to_dataset D:\l_139\桌面\Snipaste_2024-07-18_17-38-25.json

注意哦,以上命令都必须在目标路径下执行哦,直接在桌面上开个命令行窗口可没用,要么就cd到py脚本或exe可执行文件所在目录,要么直接在该目录打开命令行。此处使用exe可执行文件直接进行演示

image-20240719123754550

直接使用py脚本进行转换需要进入虚拟环境,不然会报缺失包,多了一步比较麻烦,如果要用py脚本,可参考:

image-20240719125253569

可以看到,以上两种方法都可以执行,但都有警告说这个py脚本即将弃用,取而代之的是labelme_export_json,那我们就顺应大势所趋,使用人家官方建议你用的呗,不然到时候人家弃用了,咱用前朝的剑斩本朝的官当然是斩不掉咯。(此处提供使用labelme_export_json.exe的代码,以下代码在命令行中逐行输入)

# 如果是在目标路径直接打开命令行则无需以下两步操作,路径更换成自己的
D:
cd D:\SoftWares\Codes\Anaconda\envs\Labelme\Scripts
labelme_export_json D:\l_139\桌面\Snipaste_2024-07-18_17-38-25.json

image-20240719130441697

折腾来折腾去我们终于在根目录看到了一个同名文件夹,里面有四个东西,分别是分别是原图png文件、标签png文件、标签名txt文件、掩膜png文件(带有类型标注),到此处也算是回收封面了。

image-20240719130545211

以上处理方法已经成功将一个json转换为png文件,但在实际应用中,我们往往需要的是把成千上万个json文件转换成png标签,并且我们所需要的也只是上图中的label.png,如果每个json都生成这么一个文件夹,我们在处理过程中会有更多的麻烦。

json批量转为png

原来的py脚本中只转换一次是因为代码只执行了一次,我们要批量转换,最简单的不就是在原本的代码上加上一层循环,实现批量转换嘛,把export_json.py复制一份,更名为multiple_export_json.py并打开(我的在D:\SoftWares\Codes\Anaconda\envs\Labelme\Lib\site-packages\labelme\cli目录下,参考一下,别又找不到了)

首先我们来嵌套循环并修改路径读取代码,修改的没多少,可以用PyCharm的对比看一眼,对比是左侧目录中用Ctrl同时选中两个文件,然后右键,会有一个比较文件(或者选中后直接Ctrl+D)

image-20240719140108320

以下是修改部分的代码:

# multiple_export_json.pyimport glob
def main():parser = argparse.ArgumentParser()# 修改变量名为文件夹变量名parser.add_argument("json_dir_file")parser.add_argument("-o", "--out", default=None)args = parser.parse_args()# 使用glob模块查找所有的json文件json_file = glob.glob(os.path.join(args.json_dir_file, '*.json'))# 添加循环,其下代码整体缩进for json_file in json_file:'''处理逻辑不变'''if __name__ == "__main__":main()

此处使用的数据是我随便找的几张素描图,打了简陋的标

image-20240719140456192

在命令行中执行

python multiple_export_json.py D:\l_139\桌面\test

image-20240719140644335

在根目录下得到四个文件夹

image-20240719140704662

至此就实现了批量处理,但是还没有实现批量存放label.png,继续改进。

在代码最后保存部分进行修改,在根目录新建一个mask文件夹,把标签文件改名后都存放到mask文件夹中,以下是部分修改代码

		# PIL.Image.fromarray(img).save(osp.join(out_dir, "img.png"))# 对label.png更名后进行统一存放mask_name = osp.splitext(osp.basename(json_file))[0]mask_dir = osp.join( osp.dirname(json_file),'mask')if not osp.exists(mask_dir):os.mkdir(mask_dir)utils.lblsave(osp.join(mask_dir, mask_name+".png"), lbl)# PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, "label_viz.png"))# with open(osp.join(out_dir, "label_names.txt"), "w") as f:#     for lbl_name in label_names:#         f.write(lbl_name + "\n")logger.info("Saved to: {}".format(out_dir))

image-20240719153800649

以下是效果:

image-20240719153842254

以下是完整代码:

# multiple_export_json.py
import argparse
import base64
import json
import os
import os.path as ospimport imgviz
import PIL.Imagefrom labelme import utils
from labelme.logger import loggerimport glob
def main():parser = argparse.ArgumentParser()# 修改变量名为文件夹变量名parser.add_argument("json_dir_file")parser.add_argument("-o", "--out", default=None)# args = parser.parse_args()args = parserargs.json_dir_file="D:\\l_139\\桌面\\test"args.out=None# 使用glob模块查找所有的json文件json_file = glob.glob(os.path.join(args.json_dir_file, '*.json'))# 添加循环,其下代码整体缩进for json_file in json_file:if args.out is None:out_dir = osp.splitext(osp.basename(json_file))[0]out_dir = osp.join(osp.dirname(json_file), out_dir)else:out_dir = args.out# if not osp.exists(out_dir):#     os.mkdir(out_dir)data = json.load(open(json_file))imageData = data.get("imageData")if not imageData:imagePath = os.path.join(os.path.dirname(json_file), data["imagePath"])with open(imagePath, "rb") as f:imageData = f.read()imageData = base64.b64encode(imageData).decode("utf-8")img = utils.img_b64_to_arr(imageData)label_name_to_value = {"_background_": 0}for shape in sorted(data["shapes"], key=lambda x: x["label"]):label_name = shape["label"]if label_name in label_name_to_value:label_value = label_name_to_value[label_name]else:label_value = len(label_name_to_value)label_name_to_value[label_name] = label_valuelbl, _ = utils.shapes_to_label(img.shape, data["shapes"], label_name_to_value)label_names = [None] * (max(label_name_to_value.values()) + 1)for name, value in label_name_to_value.items():label_names[value] = namelbl_viz = imgviz.label2rgb(lbl, imgviz.asgray(img), label_names=label_names, loc="rb")# PIL.Image.fromarray(img).save(osp.join(out_dir, "img.png"))# 对label.png更名后进行统一存放mask_name = osp.splitext(osp.basename(json_file))[0]mask_dir = osp.join( osp.dirname(json_file),'mask')if not osp.exists(mask_dir):os.mkdir(mask_dir)utils.lblsave(osp.join(mask_dir, mask_name+".png"), lbl)# PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, "label_viz.png"))# with open(osp.join(out_dir, "label_names.txt"), "w") as f:#     for lbl_name in label_names:#         f.write(lbl_name + "\n")logger.info("Saved to: {}".format(out_dir))if __name__ == "__main__":main()

如果做的是一个二分类任务,可能会涉及需要将label的像素值归一化为黑白0-1。具体参考240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1]-CSDN博客

参考博客:

labelImg和labelme的区别、安装和基本使用_labelme和labelimg区别-CSDN博客

Labelme做数据标签、批量处理json文件转换为png方法_labelme json文件转换-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql深入讲解(索引、事务、锁机制)

一、MySQL索引 1、何为索引? MySQL中的索引是一种数据结构,用于加快对数据库表中数据的查询速度【查询速度提升】。它类似于书本目录,使得用户可以根据特定字段快速定位到所需的数据行,而无需扫描整个表。 2、索引分类 Hash索…

怎样对 PostgreSQL 中的慢查询进行分析和优化?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 怎样对 PostgreSQL 中的慢查询进行分析和优化?一、理解慢查询的危害二、找出慢查询&#x…

Linux可视化工具-netdata之docker安装

版本要求 docker cli安装 docker pull netdata/netdata docker run -d --namenetdata \ --pidhost \ --networkhost \ -v netdataconfig:/etc/netdata \ -v netdatalib:/var/lib/netdata \ -v netdatacache:/var/cache/netdata \ -v /:/host/root:ro,rslave \ -v /etc/passwd…

[集成学习]基于python的Stacking分类模型的客户购买意愿分类预测

1 导入必要的库 import pandas as pd import numpy as np import missingno as msno import matplotlib.pyplot as plt from matplotlib import rcParams import seaborn as sns from sklearn.metrics import roc_curve, auc from sklearn.linear_model import LogisticRegres…

业务架构、数据架构、应用架构和技术架构分析

一文看懂:什么是业务架构、数据架构、应用架构和技术架构 TOGAF(开放集团架构框架)是企业广泛应用的架构设计和管理利器。其核心在于四大架构领域:业务、数据、应用和技术,助力组织高效运作。TOGAF,让架构设…

【深度学习入门篇 ⑩】Seq2Seq模型:语言翻译

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】 大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

【Sklearn-混淆矩阵】一文搞懂分类模型的基础评估指标:混淆矩阵ConfusionMatrixDisplay

【Sklearn-混淆矩阵】一文搞懂分类模型的基础评估指标:混淆矩阵ConfusionMatrixDisplay 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! &…

unity渲染人物模型透明度问题

问题1:有独立的手和衣服的模型,但最终只渲染出来半透明衣服 问题2:透明度贴图是正确的但显示却不正确 这上面两个模型的问题都是因为人物模型是一个完整的,为啥有些地方可以正常显示,有些地方透明度却有问题。 其中…

使用C#实现无人超市管理系统——数据结构课设(代码+PPT+说明书)

说明:这是自己做的课程设计作业,得分情况98/100 如果想要获取私信我 本项目采用线性表中的链表来进行本次系统程序的设计。链表分为两条线,分别是存储用户信息和商品信息,并且都设为公共属性,方便对用户信息和商品信息…

艺术与技术的交响曲:CSS绘图的艺术与实践

在前端开发的世界里,CSS(层叠样式表)作为网页布局和样式的基石,其功能早已超越了简单的颜色和间距设置。近年来,随着CSS3的普及,开发者们开始探索CSS在图形绘制方面的潜力,用纯粹的代码创造出令…

基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用

目录 专题一、深度学习发展与机器学习 专题二、深度卷积网络基本原理 专题三、TensorFlow与Keras介绍与入门 专题四、PyTorch介绍与入门 专题五、卷积神经网络实践与遥感图像场景分类 专题六、深度学习与遥感图像检测 专题七、遥感图像检测案例 专题八、深度学习与遥感…

字节码编程之bytebuddy结合javaagent支持多种监控方式

写在前面 打印方法执行耗时是监控,获取程序运行的JVM信息是监控,链路追踪也是监控。 本文看下如何实现一个通用的监控解决方案。 1:程序 定义premain: package com.dahuyou.multi.monitor;import com.dahuyou.multi.monitor.…

数据库内核研发学习之路(五)创建postgres系统表

写在前面 在使用postgres的时候,有很多表是我们一开始安装好数据库就存在的,这些表称为系统表,他们记载一些数据库信息,比如我们做运维工作常用的pg_stat_activity;我们在数据库中查询这张表可以发现他存储了一些数据库连接信息。…

GO:Socket编程

目录 一、TCP/IP协议族和四层模型概述 1.1 互联网协议族(TCP/IP) 1.2 TCP/IP四层模型 1. 网络访问层(Network Access Layer) 2. 网络层(Internet Layer) 3. 传输层(Transport Layer&#…

WPF+Mvvm 项目入门完整教程(一)

WPF+Mvvm 入门完整教程一 创建项目MvvmLight框架安装完善整个项目的目录结构创建自定义的字体资源下载更新和使用字体资源创建项目 打开VS2022,点击创建新项目,选择**WPF应用(.NET Framework)** 创建一个名称为 CommonProject_DeskTop 的项目,如下图所示:MvvmLight框架安装…

【JavaScript 算法】双指针法:高效处理数组问题

🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现示例问题1:两数之和 II - 输入有序数组示例问题2:反转字符串中的元音字母注释说明: 三、应用场景四、总结 双指针法(Two Pointer Technique&#xff…

深入理解Java并发线程阻塞唤醒类LockSupport

LockSupprot 用来阻塞和唤醒线程,底层实现依赖于Unsafe类 该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕 park 和 unpark 展开 public class LockSupportDemo1 {public static void main(String[] args) {Thread mainThread Thread.cu…

微信小程序(百战商城)的实战项目的首页的制作及讲解

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【人工智能】基于香橙派AIpro和昇腾AI计算芯片的面部口罩检测(详细教程)

目录 前言 1.介绍开发板 2.应用场景 3.安装操作系统 3.1 下载工具 3.2 烧录系统 3.3 系统装载 4.配置操作系统 4.1 登录系统账户 4.2 配置网络连接 4.3 查看设备网络 4.4 配置远程连接 5.部署目标检测应用 5.1 准备运行环境 5.2 模型二次训练 ​5.3 热成像温度…

数据结构 day4

目录 思维导图: 学习内容: 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…