labelme的安装与使用以及如何将labelme标注的json格式关键点标签转为yolo格式的标签

文章目录

    • 本文只关于将关键点json标签转为yolo标签
    • 希望得到您的指导
    • 背景及代码可用范围
    • 一、labelme的安装和使用
      • (一)labelme的安装
      • (二)labelme的使用
    • 二、json2yolo


本文只关于将关键点json标签转为yolo标签

如果您的json标签格式如下,进行较为轻松的修改即可使用
在这里插入图片描述转换结果展示:
在这里插入图片描述在这里插入图片描述


希望得到您的指导

非常感谢您观看我的博客,我写博客的目的是为了记录我的学习过程同时保留我的某些可重复利用代码以方便下次使用。如果您对我的内容有任何建议还请您不吝指出,非常感谢您对我的指导。

背景及代码可用范围

在我针对人体姿态估计项目准备数据集时,将json格式的数据转变为yolo格式的路上遇到了重重阻碍。
我先是使用make sense标注数据集,但是在标注完成一部分后发现它只能导出标注类型为矩形的标签。我也尝试使用labelimg,但是它只能标注矩形标签。由此我便选择使用labelme进行标注,但是它的标注格式为json。
在网上有很多关于将标注的json文件转换为yolo格式的标签,但是他们有些需要先转为coco,再转为yolo,或者代码需要对我这个项目也需要大量修改,于是我便想自己写一段代码将其格式进行转换。

一、labelme的安装和使用

(一)labelme的安装

中文labelme的百度网盘
链接:https://pan.baidu.com/s/1puJdLZO-z4CPOIbiq4tFvA?pwd=1111
提取码:1111
界面如图所示

在这里插入图片描述

(二)labelme的使用

A:上一个图片
D:下一个图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、json2yolo

json_path:你标注的json文件所在位置
yolo_path:你想将转换后的位置放在哪里
image_path:你标注的图片所在位置

import json
import os
from pathlib import Path
import requests
import yaml
from PIL import Image
from tqdm import tqdm   # 进度条def output_label(json_path,yolo_path,image_path):# os.makedirs(yolo_path,exist_ok=True)names = []  # class names 定义一个空列表json_path = Path(json_path).resolve()yolo_path = Path(yolo_path).resolve()json_parentpath = json_path.parentfor filename in tqdm(os.listdir(json_path),desc="Converting"):if filename.endswith('.json'):with open(os.path.join(json_path,filename), 'r',encoding='utf-8') as f:data = json.load(f)  # json files to dict:json_datalast_part = os.path.basename(data.get("imagePath"))im_path = os.path.join(image_path,last_part)img = Image.open(requests.get(im_path,stream=True).raw if im_path.startswith("http") else im_path)width,height = img.size
#                 size属性获得图像宽度和高度的元组,通常形式为(width, height)label_filename = last_part+"txt"label_path = os.path.join(yolo_path,Path(label_filename).with_suffix(".txt"))# 转换后标签存放路径temp_dict = {}for label in data.get("shapes"):clsn = label.get("label")if clsn not in names:names.append(clsn)label_list = label.get("points")x,y=label_list[0]# 根据json文件的特征,points内部是双重列表,且内层只有一个列表,所以我们将第一个列表的值分别赋值给x,yx = round(x/width,2)y = round(y/height,2)if names.index(clsn) not in temp_dict:temp_dict[names.index(clsn)] = []temp_dict[names.index(clsn)].append(f"{x} {y} ")with open(label_path,"a") as f:for idx in temp_dict:line = f"{idx} {''.join(temp_dict[idx])}"f.write(line + "\n")# Save dataset.yamlnames_formatted = {i: str(name) for i,name in enumerate(names)}# 字典推导式 将一个列表转换为一个字典,其中字典的键是列表中每个元素的索引,值是列表中对应索引位置的元素# enumerate()函数用于将一个可迭代对象(比如列表、元组或者其他序列类型)转换为一个枚举对象d = {"path": f"{json_parentpath}  # dataset root dir".replace('\\','/'),"train": f"{json_parentpath}/images/train  # train images (relative to path) 128 images".replace('\\','/'),"val": f"{json_parentpath}/images/val  # val images (relative to path) 128 images".replace('\\','/'),"test": " # test images (optional)","nc": len(names),"names": names_formatted,}  # dictionaryfile_path = os.path.join(json_parentpath, "data.yaml")with open(file_path,"w",encoding='utf-8')as f:yaml.dump(d,f,sort_keys=False)print("Conversion completed successfully!")if __name__ == '__main__':output_label(r"E:\datasets\jsons",r"E:\datasets\labels",r"E:\datasets\images")

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

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

相关文章

Axure中后台系统原型模板,B端页面设计实例,高保真高交互54页

作品概况 页面数量:共 50 页(长期更新) 兼容版本:Axure RP 9/10,不支持低版本 应用领域:网页模板、网站后台、中台系统、B端系统 作品特色 本品为「web中后台系统页面设计实例模板」,默林原创…

备考ICA----Istio实验10---为单个主机配置TLS Istio Ingress Gateway实验

备考ICA----Istio实验10—为单个主机配置 TLS Istio Ingress Gateway实验 1. 环境准备 部署httpbin kubectl apply -f istio/samples/httpbin/httpbin.yaml 2. 证书生成 2.1 生成根证书 生成根证书keyfile和crt文件 mkdir example_certs_root openssl req -x509 -sha256 …

强化基础-Java-泛型

什么是泛型? 泛型其实就参数化类型,也就是说这个类型类似一个变量是可变的。 为什么会有泛型? 在没有泛型之前,java中是通过Object来实现泛型的功能。但是这样做有下面两个缺陷: 1 获取值的时候必须进行强转 2 没有…

学透Spring Boot — 创建一个简单Web应用

从今天开始,我们将开始学习一个新的系列,那就是在项目中用得非常广泛的一个框架 —— Spring Boot,我们会循序渐进地介绍 Spring Boot 的方方面面,包括理论和实战,也会介绍和Spring Boot一些热点面试题。 概论 本文是…

C#学生信息成绩管理系统

一、系统功能描述 本系统包括两类用户:学生、管理员。管理员可以通过系统来添加管理员信息、修改管理员信息、添加学生信息、修改学生信息;开设课程、查询课程、录入成绩、统计成绩、修改成绩、修改个人密码等,而学生则可以通过系统来选择课…

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵 目录 前言 一、Givens旋转简介 二、Givens旋转解释 三、Givens旋转进行QR分解 四、Givens旋转进行QR分解数值计算例子 五、求逆矩阵 六、MATLAB仿真 七、参考资料 总结 前言 在进行QR分解时,HouseHolder变换…

YOLOv8项目实践——目标检测、实例分割、姿态估计、目标追踪算法原理及模型部署(Python实现带界面)

简介 Ultralytics YOLOv8是一种前沿的、最先进的(SOTA)模型,它在前代YOLO版本的成功基础上进行了进一步的创新,引入了全新的特性和改进,以进一步提升性能和灵活性。作为一个高速、精准且易于操作的设计,YO…

量化交易入门(二十三)什么是MTM指标,原理是什么

MTM指标全称是Momentum指标,翻译为动量指标。它用来衡量市场价格在一定时间内上涨或下跌的幅度,属于趋势型指标。其计算公式是: MTM(N) 当前收盘价 - N日前的收盘价 其中N表示统计的周期数,常用参数有6日、12日和24日。 MTM指标的应用要点如下: 判断趋势强弱:MTM数值越大,表…

uniapp 微信小程序 canvas 手写板文字重复倾斜水印

核心逻辑 先将坐标系中心点通过ctx.translate(canvasw / 2, canvash / 2) 平移到canvas 中心,再旋转设置水印 假如不 translate 直接旋转,则此时的旋转中心为左上角原点,此时旋转示意如图所示 当translate到中心点之后再旋转,此…

P8649 [蓝桥杯 2017 省 B] k 倍区间:做题笔记

目录 思路 代码思路 代码 推荐 P8649 [蓝桥杯 2017 省 B] k 倍区间 思路 额嗯,这道题我刚上来是想到了前缀和,但是还要判断每个子序列,我就两层for嵌套,暴力解了题。就是我知道暴力肯定过不了但是写不出来其他的[留下了苦…

【ESP32S3 Sense接入语音识别+MiniMax模型对话】

1. 前言 围绕ESP32S3 Sense接入语音识别MiniMax模型对话展开,首先串口输入“1”字符,随后麦克风采集2s声音数据,对接百度在线语音识别,将返回文本结果丢入MiniMax模型,进而返回第二次结果文本,实现语言对话…

libVLC 动态视频壁纸

在 Windows 上,你可能需要使用 Windows API 来设置壁纸,而在 Linux 上,你可能需要使用某种桌面环境特有的方法。在 macOS 上,这一功能可能受到限制。 效果图如下所示: 以下是一个简单的示例,说明了如何在 …

[Qt] QString::fromLocal8Bit 的使用误区

QString::fromLocal8Bit 是一个平台相关的函数。默认情况下在 Windows 下 就是 gbk 转 utf-8 ,在 Linux就应该是无事发生。因为Linux平台默认的编码方式就是 utf-8 可以通过 void QTextCodec::setCodecForLocale(QTextCodec *c)来修改 Qt默认的编码方式。如下 第一输出乱码的…

vue组件如何使用?

今天我随便试两个组件 第一个轮播图 在minn.js 引入 import { createApp } from vue; import { Swipe, SwipeItem } from vant; const app createApp(); app.use(Swipe); app.use(SwipeItem); <van-swipe class"my-swipe" :autoplay"3000" indica…

python学习15:python中的input语句

python中的input语句 我们前面学习过print语句&#xff0c;可以将内容输出到屏幕上&#xff1b;在python中&#xff0c;与之对应的还有一个input语句&#xff0c;用来获取键盘输入。 数据输出&#xff1a;print 数据输入&#xff1a;input 使用上也很简单&#xff1a; 使用inp…

视图的作用

目录 视图的作用 创建视图 为 scott 分配创建视图的权限 查询视图 复杂视图的创建 视图更新的限制问题 更新视图中数据的部门编号&#xff08;视图的存在条件&#xff09; 限制通过视图修改数据表内容 创建只读的视图 复杂视图创建 oracle从入门到总裁:​​​​​​h…

快速创建zookeeper集群

先说明&#xff0c;我很穷&#xff01;&#xff01;&#xff0c;开不了多个虚拟机&#xff0c;zookeeper集群的3个节点都放在同一个虚拟机&#xff0c;所以搭建是一个伪集群&#xff0c;因为一个服务器挂机&#xff0c;所有节点都会停止。工作实际情况安装到三个服务器&#xf…

H5抓包——Android 使用电脑浏览器 DevTools调试WebView

H5抓包——Android 使用电脑浏览器 DevTools调试WebView 一、使用步骤 1、电脑通过数据线连接手机&#xff0c;开启USB调试&#xff08;打开手机开发者选项&#xff09; 2、打开待调试的H5 App&#xff0c;进入H5界面 3、打开电脑浏览器&#xff0c;调试界面入口 如果用ed…

第十一章:位运算符与位运算

文章目录 第十一章&#xff1a;位运算符与位运算1.按位与运算&#xff1a;&2.按位或运算&#xff1a;|3.按位异或运算&#xff1a;^4.取反运算符&#xff1a;~5.左移运算符&#xff1a;<<6.右移运算符&#xff1a;>>总结 第十一章&#xff1a;位运算符与位运算…

免费SSL证书和付费SSL证书的区别点

背景&#xff1a; 在了解免费SSL证书和付费SSL证书的区别之前&#xff0c;先带大家了解一下SSL证书的概念和作用。 SSL证书的概念&#xff1a; SSL证书就是基于http超文本传输协议的延伸&#xff0c;在http访问的基础上增加了一个文本传输加密的协议&#xff0c;由于http是明…