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

news2024/11/24 4:41:24

有任何问题我们一起交流,让我们共同学习

    • 标注的json格式以及转换后的yolo格式示例
    • 希望得到您的指导
    • 背景及代码可用范围
    • 一、yolo关键点检测数据集格式
    • 二、labelme的安装和使用
      • (一)labelme的安装
      • (二)labelme的使用
    • 三、json2yolo


标注的json格式以及转换后的yolo格式示例

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

在这里插入图片描述

yaml文件:
需要部分修改


希望得到您的指导

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

背景及代码可用范围

  1. 如果你要标注的仅是矩形框,可以有直接导出为yolo格式的标注工具。如:make sense 或labelimg
  2. 本博客仅针对于使用labelme标注用于yolo的json格式关键点检测数据集

一、yolo关键点检测数据集格式

yolo官网
用于训练YOLO 姿态模型的数据集标签格式如下:

每幅图像一个文本文件:数据集中的每幅图像都有一个相应的文本文件,文件名与图像文件相同,扩展名为".txt"。
每个对象一行:文本文件中的每一行对应图像中的一个对象实例。
每行对象信息:每行包含对象实例的以下信息
    对象类别索引:代表对象类别的整数(如 0 代表人,1 代表汽车等)。
    对象中心坐标:对象中心的 x 和 y 坐标,归一化为 0 和 1 之间。
    对象宽度和高度:对象的宽度和高度,标准化后介于 0 和 1 之间。
    对象关键点坐标:对象的关键点,归一化为 0 至 1。

格式为DIM = 2

<class-index> <x> <y> <width> <height> <px1> <py1> <px2> <py2> ... <pxn> <pyn>
# 采用这种格式、 <class-index> 是对象的类索引、<x> <y> <width> <height> 是边界框的坐标及宽和高,而 <px1> <py1> <px2> <py2> ... <pxn> <pyn> 是关键点的像素坐标。坐标之间用空格隔开。

格式为DIM = 3

<class-index> <x> <y> <width> <height> <px1> <py1> <p1-visibility> <px2> <py2> <p2-visibility> <pxn> <pyn> <p2-visibility>
<pn-visibility>:0代表不可见、1代表遮挡、2代表可见
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8-pose  # dataset root dir
train: images/train  # train images (relative to 'path') 4 images
val: images/val  # val images (relative to 'path') 4 images
test:  # test images (optional)

# Keypoints
kpt_shape: [17, 3]  # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
#17个关键点,3维
flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
#反转后关键点的对应关系

# Classes dictionary
names:
  0: person

根据官方文档,标注文件时首先要标注一个矩形框将目标框起来,然后再标注关键点数据

二、labelme的安装和使用

(一)labelme的安装

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

在这里插入图片描述

(二)labelme的使用

A:上一个图片
D:下一个图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述标注后类似
在这里插入图片描述

三、json2yolo

json_path:标注的json文件所在位置
yolo_path:转换后的yolo文件存放位置
image_path:标注的图片所在位置

import json
import os
from pathlib import Path
import requests
import yaml
from PIL import Image
from tqdm import tqdm   # 进度条

def count_inner_list(nested_list):
    count = 0
    for lst in nested_list:
        if isinstance(lst,list):
#             检查对象是否为指定类型
            count += 1
    return count

def output_label(json_path,yolo_path,image_path):
    # os.makedirs(yolo_path,exist_ok=True)
    json_path = Path(json_path).resolve()
    yolo_path = Path(yolo_path).resolve()
    json_parentpath = json_path.parent
    names_dict = {0: "person"}
    flipped_names = {v: k for k, v in names_dict.items()}
    for 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_data
            last_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_str = ""
            previous_person_data = ""
            cnt = 0
            for label in data.get("shapes"):
                if label.get("label") == "person" :
                    cnt += 1
                    if cnt > 1:
                        current_person_data = f"{previous_person_data} {temp_str} \n"
                        previous_person_data = current_person_data
                    label_list = label.get("points")
                    x_1,y_1 = label_list[0]
                    x_2,y_2 = label_list[1]
                    x_centre = round(((x_1+x_2)/2)/width,2)
                    y_centre = round(((y_1+y_2)/2)/height,2)
                    person_width = round(abs(x_1-x_2)/width,2)
                    person_height = round(abs(y_1-y_2)/height,2)
                    temp_str = (f"{flipped_names['person']} {x_centre} {y_centre} {person_width} {person_height} ")

                else:
                    label_list = label.get("points")
                    x,y=label_list[0]
                    # 根据json文件的特征,points内部是双重列表,且内层只有一个列表,所以我们将第一个列表的值分别赋值给x,y
                    x = round(x/width,2)
                    y = round(y/height,2)

                    temp_str = (f"{temp_str} {x} {y} ")
            current_person_data = f"{previous_person_data} {temp_str}"

            with open(label_path,"a") as f:
                f.write(current_person_data + "\n")
     # Save dataset.yaml
    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)",
        "names": names_dict,
    }  # dictionary
    file_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.coloradmin.cn/o/1558103.html

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

相关文章

Unity-C#进阶——3.27更新中

文章目录 数据结构类ArrayListStackQueueHashtable 泛型泛型类、泛型方法、泛型接口ListDictionaryLinkedList泛型栈&#xff0c;泛型队列 委托和事件委托事件匿名函数Lambad 表达式**闭包** List 排序逆变协变多线程进程线程多线程方法&#xff1a;线程之间共享数据&#xff1…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《强沙尘暴下新能源基地的弹性评估及其提升方法 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

mysql 条件/系统/加密/其它函数

学习了日期时间函数&#xff0c;接着学习条件、系统、加密和其它函数。 3&#xff0c;条件判断函数 条件判断函数也称为控制流程函数&#xff0c;根据满足的条件的不同&#xff0c;执行相应的流程。MySQL中进行条件判断的函数有IF、IFNULL和 CASE。 函数 说明 IF(expr,v1,v2…

单例设计模式(3)

单例模式&#xff08;3&#xff09; 实现集群环境下的分布式单例类 如何理解单例模式中的唯一性&#xff1f; 单例模式创建的对象是进程唯一的。以springboot应用程序为例&#xff0c;他是一个进程&#xff0c;可能包含多个线程&#xff0c;单例代表在这个进程的某个类是唯一…

跨境电商IP防关联是什么?有什么作用?

做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢&#xff1f;今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中&#xff0c;通过采取一系列技术手段&#xff0c;确保每个跨境电商账号使用独立的IP地址&#xff0c;以避免账号之间因为IP地址…

【Linux实践室】Linux用户管理实战指南:用户权限切换操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;图形化界面登录2.2 &#x1f514;使用login…

【java苍穹外卖项目实战四】新增员工功能

文章目录 1、需求设计分析2、接口设计3、表设计4、设计DTO类5、Controller层功能实现6、Service层功能实现7、Mapper层功能实现 1、需求设计分析 一般在做需求分析时&#xff0c;往往都是对照着产品原型进行分析&#xff0c;因为产品原型比较直观&#xff0c;便于我们理解业务…

Unreal的Quixel Bridge下载速度过慢、下载失败

从Quixel Bridge下载MetaHuman模型&#xff0c;速度非常慢&#xff0c;而且经常下载失败&#xff0c;从头下载。 可以从Quixel Bridge的右上角我的图标->Support->Show Logs打开日志目录 downloaded-assets目录下为下载的资源 bridge-plugin.log文件记录了下载URL和下载…

矩阵间关系的建立

参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …

leetcode 331. 验证二叉树的前序序列化【计数器】

原题链接&#xff1a;331. 验证二叉树的前序序列化 题目描述&#xff1a; 序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如…

鸿蒙OS开发实例:【瀑布流式图片浏览】

介绍 瀑布流式展示图片文字&#xff0c;在当前产品设计中已非常常见&#xff0c;本篇将介绍关于WaterFlow的图片浏览场景&#xff0c;顺便集成Video控件&#xff0c;以提高实践的趣味性 准备 请参照[官方指导]&#xff0c;创建一个Demo工程&#xff0c;选择Stage模型熟读Har…

思维题,LeetCode331. 验证二叉树的前序序列化

一、题目 1、题目描述 序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如&#xff0c;上面的二叉树可以被序列化为字符串 &quo…

数字孪生|山海鲸可视化软件Windows版安装步骤

哈喽&#xff0c;大家好啊&#xff0c;我是雷工&#xff01; 今天尝试下该数字孪生软件&#xff0c;以下为安装步骤&#xff0c;我这里安装的是Windows版本。 1、系统配置要求 由于该软件主要功能是为了编辑可视化大屏&#xff0c;因此该软件必须安装在有桌面的系统内。 2、…

动态规划详细讲解c++|经典例题讲解认识动态规划|0-1背包问题详解

引言 uu们&#xff0c;你们好&#xff01;这次的分享是动态规划&#xff0c;其中介绍了动态规划的相关概念和做题模板&#xff08;三要素&#xff09;&#xff0c;同时为了uu们对动态规划方法有更加形象的认识&#xff0c;特地找了两个经典问题&#xff0c;和大家一起分析。并…

关于未来自我的发展和一些学习方法(嵌入式方向)

我是一名大二的学生&#xff0c;考研还是就业&#xff0c;到底是重视专业课还是重视数学英语&#xff0c;这些问题一直困扰了我很久&#xff0c;但如今已经有了一些浅显的认识&#xff0c;所以才会想写这样一篇文章来记录一下自己的状态和未来的规划 下面的看法都是个人的看法&…

WMware虚拟机配置静态IP

注意&#xff1a;如果是克隆的虚拟机&#xff0c;需要先重新生成mac地址&#xff0c;如下图所示 修改配置文件 &#xff1a;/etc/sysconfig/network-scripts/ifcfg-ens33 注意&#xff1a;1. BOOTPROTO设置为static 2.将下面的IPADDR地址替换为你实际要设置的ip地址 3.NAT模式…

Unity urp渲染管线下,动态修改材质球surfaceType

在项目中遇到了需要代码动态修改材质球的surfaceType&#xff0c;使其动态切换是否透明的需求。 urp渲染管线下&#xff0c;动态修改材质球的surfaceType&#xff0c;查了大部分帖子&#xff0c;都有一些瑕疵&#xff0c;可能会造成透明后阴影投射有问题。 其次在webgl平台上…

postcss安装和使用(详细)

1,安装postcss&#xff1a; 在此之前需要安装有node.js 第一步 命令&#xff1a;cnpm install postcss-cli -g 第二步 命令&#xff1a;cnpm install postcss –g 推荐内容 2,下载autoprefixer插件&#xff0c;并创建postcss.config.js文件并写入配置代码 autoprefixer插件…

Node.js中Router的使用

文章目录 介绍router的优点1.导入Express和创建Router&#xff1a;2. 定义路由&#xff1a;3.将router暴露到模块外&#xff1a;4. 将Router挂载到Express应用中&#xff1a;4.1.引入router4.2.使用中间件让router在Express应用中生效(三种写法) 5. 完整示例&#xff1a;5.1.编…

【Canvas与艺术】三斜齿齿轮联动效果展示

【关键点】 1.斜齿齿轮的具体画法&#xff1b; 2.相邻两齿轮的啮合角是多少。 【图示】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head>&…