当前位置: 首页 > news >正文

labelme2yolov8-seg 草稿()

简介:

最近做实例分割分割,使用Labelme生成json格式标签后,需要转换为txt标签,才能供YOLO进行训练。

在参看b站,github后,发现GitHub有相关项目:lableme2yolo

一个是ultralyics官方的JSON2YOLO项目

ultralytics/JSON2YOLO: Convert JSON annotations into YOLO format.

 

参考1:

将labelme数据标注格式转换为YoloV8语义分割数据集,并可自动划分训练集和验证集

import json
import random
import yaml
import argparse
import shutil
from pathlib import Path
from collections import defaultdict
from tqdm import tqdm# 设定随机种子以确保可重复性
random.seed(114514)# yoloV8支持的图像格式
# https://docs.ultralytics.com/modes/predict/?h=format+image#images
image_formats = ["jpg", "jpeg", "png", "bmp", "webp", "tif", ".dng", ".mpo", ".pfm"]def copy_labled_img(json_path: Path, target_folder: Path, task: str):# 遍历支持的图像格式,查找并复制图像文件for format in image_formats:image_path = json_path.with_suffix("." + format)if image_path.exists():# 构建目标文件夹中的目标路径target_path = target_folder / "images" / task / image_path.nameshutil.copy(image_path, target_path)def json_to_yolo(json_path: Path, sorted_keys: list):with open(json_path, "r") as f:labelme_data = json.load(f)width = labelme_data["imageWidth"]height = labelme_data["imageHeight"]yolo_lines = []for shape in labelme_data["shapes"]:label = shape["label"]points = shape["points"]class_idx = sorted_keys.index(label)txt_string = f"{class_idx} "for x, y in points:x /= widthy /= heighttxt_string += f"{x} {y} "yolo_lines.append(txt_string.strip() + "\n")return yolo_linesdef create_directory_if_not_exists(directory_path):# 使用 exist_ok=True 可以避免重复检查目录是否存在directory_path.mkdir(parents=True, exist_ok=True)# 创建训练使用的yaml文件
def create_yaml(output_folder: Path, sorted_keys: list):train_img_path = Path("images") / "train"val_img_path = Path("images") / "val"train_label_path = Path("labels") / "train"val_label_path = Path("labels") / "val"# 创建所需目录for path in [train_img_path, val_img_path, train_label_path, val_label_path]:create_directory_if_not_exists(output_folder / path)names_dict = {idx: name for idx, name in enumerate(sorted_keys)}yaml_dict = {"path": output_folder.as_posix(),"train": train_img_path.as_posix(),"val": val_img_path.as_posix(),"names": names_dict,}yaml_file_path = output_folder / "yolo.yaml"with open(yaml_file_path, "w") as yaml_file:yaml.dump(yaml_dict, yaml_file, default_flow_style=False, sort_keys=False)print(f"yaml created in {yaml_file_path.as_posix()}")# Convert label to idx
def get_labels_and_json_path(input_folder: Path):json_file_paths = list(input_folder.rglob("*.json"))label_counts = defaultdict(int)for json_file_path in json_file_paths:with open(json_file_path, "r") as f:labelme_data = json.load(f)for shape in labelme_data["shapes"]:label = shape["label"]label_counts[label] += 1# 根据标签出现次数排序标签sorted_keys = sorted(label_counts, key=lambda k: label_counts[k], reverse=True)return sorted_keys, json_file_pathsdef labelme_to_yolo(json_file_paths: list, output_folder: Path, sorted_keys: list, split_rate: float
):# 随机打乱 JSON 文件路径列表random.shuffle(json_file_paths)# 计算训练集和验证集的分割点split_point = int(split_rate * len(json_file_paths))train_set = json_file_paths[:split_point]val_set = json_file_paths[split_point:]for json_file_path in tqdm(train_set):txt_name = json_file_path.with_suffix(".txt").nameyolo_lines = json_to_yolo(json_file_path, sorted_keys)output_json_path = Path(output_folder / "labels" / "train" / txt_name)with open(output_json_path, "w") as f:f.writelines(yolo_lines)copy_labled_img(json_file_path, output_folder, task="train")for json_file_path in tqdm(val_set):txt_name = json_file_path.with_suffix(".txt").nameyolo_lines = json_to_yolo(json_file_path, sorted_keys)output_json_path = Path(output_folder / "labels" / "val" / txt_name)with open(output_json_path, "w") as f:f.writelines(yolo_lines)copy_labled_img(json_file_path, output_folder, task="val")if __name__ == "__main__":parser = argparse.ArgumentParser(description="labelme2yolo")parser.add_argument("input_folder", help="输入LabelMe格式文件的文件夹")parser.add_argument("output_folder", help="输出YOLO格式文件的文件夹")parser.add_argument("split_rate", help="调整训练集和测试集的比重")args = parser.parse_args()input_folder = Path(args.input_folder)output_folder = Path(args.output_folder)split_rate = float(args.split_rate)sorted_keys, json_file_paths = get_labels_and_json_path(input_folder)create_yaml(output_folder, sorted_keys)labelme_to_yolo(json_file_paths, output_folder, sorted_keys, split_rate)

参考资料 

1.参考1:KdaiP/labelme2YoloV8-segment: 将labelme数据标注格式转换为YoloV8语义分割数据集,并可自动划分训练集和验证集

2.rooneysh/Labelme2YOLO: 帮助将 LabelMe 注释工具 JSON 格式转换为 YOLO 文本文件格式。如果您已经通过 LabelMe 标记了分割数据集,则可以轻松使用此工具来帮助转换为 YOLO 格式的数据集。 

 

相关文章:

labelme2yolov8-seg 草稿()

简介: 最近做实例分割分割,使用Labelme生成json格式标签后,需要转换为txt标签,才能供YOLO进行训练。 在参看b站,github后,发现GitHub有相关项目:lableme2yolo 一个是ultralyics官方的JSON2YO…...

开源简史与概览

Think 1.论述“自由软件”与“开源软件”的区别与联系? 2.GitHub Trending 是一个能够快速找到有趣的新项目的地方;而 OpenLeaderboard 也是一个能够发现有趣而有影响力项目的地方。尝试从这两个网站中找到感兴趣的若干项目,挖掘并分析出上…...

充电桩语音提示芯片方案-支持平台自定义语音NV128H让充电更便捷

随着工业化与城市化进程的加速推进,传统燃油汽车的数量急剧攀升,这直接导致了石油资源的过度开采与消耗。石油,作为不可再生的化石燃料,其储量日益枯竭,价格波动频繁,给全球能源安全带来了前所未有的挑战。…...

277-基于八路256Ksps 24bit AD生物电震动检测FMC子卡

一、板卡概述 板卡基于AD7768 AD芯片设计的八路低速采集的FMC 子卡,支持直流耦合,产品应用于生物电、脑电波、声音,震动等信号采集。 二、板卡参数及性能 板卡功能 参数 内容 ADC 芯片型号 AD7768 路数 8路ADC, 采样率 2…...

【电路理论四】正弦电流电路

正弦电流 正弦量是随时间按正弦规律变动的电路变量。 随时间按正弦规律变动的电流称为正弦电流。 正弦电流的瞬时值表达式: 称为正弦电流的三要素。 分别为振幅/幅值,角频率,初相。 幅值为正弦电流的最大值,恒为正。 为正弦电…...

【PyCharm】如何把本地整个项目同步到服务器?

在PyCharm中,您可以使用部署功能将项目同步到服务器。以下是步骤和示例配置: 打开PyCharm,选择您的项目。 点击菜单栏的 “File” -> “Settings” -> “Build, Execution, Deployment”。 在左侧菜单中,选择 “Deployme…...

露营小程序搭建有哪些步骤?小程序里面可以找个露营搭子

露营不仅仅是走进大自然的旅程,它也成为了一种社交和体验式的活动。随着小程序的普及,露营活动也越来越多地开始在线上开展。通过搭建一个露营小程序,商家不仅可以为用户提供更多的露营选择,还可以帮助他们找到合适的露营搭子。那…...

SOLID-开闭原则

单一职责原则:https://blog.csdn.net/dmk877/article/details/143447010 在前面我们学习了单一职责原则,今天来一起学习一下SOLID原则中的开闭原则(Open-Closed Principle, OCP) 通过本篇博客你将学到到以下内容 ①什么是开闭原则 ②如何实现开闭原则 ③…...

前端经典面试合集(二)——Vue/React/Node/工程化工具/计算机网络

1. 说说 Vue 中的 Diff 算法 Vue 的 Diff 算法 主要用于优化虚拟 DOM 和实际 DOM 之间的比较过程。它通过以下几种策略来提高性能: 最小化对 DOM 的操作:Vue 通过在内存中构建一个虚拟 DOM 树,在虚拟 DOM 树与真实 DOM 树之间进行比较和更新…...

PH47代码框架 24241231 重要更新

仪式感一下:2024年最后一天,发布 PH47 代码框架的一次重要更新。当然这并不是有意的,而是直到现在才把更新的所有工作全部做完(希望确实如此)。 本次更新要点: 1、加入多IMU支持。本次更新正式加入对 MPU65…...

Qt6之QML——作用域

作用域定义了表达式可以访问哪些变量、属性或对象,并决定了在变量重名时的优先级如何处理。以下将从作用、绑定、组件作用域和使用技巧四个方面详细解析 QML 中的作用域。 1. 作用:表达式的变量访问与优先级 在 QML 中,表达式能够访问的变量…...

119.【C语言】数据结构之快速排序(调用库函数)

目录 1.C语言快速排序的库函数 1.使用qsort函数前先包含头文件 2.qsort的四个参数 3.qsort函数使用 对int类型的数据排序 运行结果 对char类型的数据排序 运行结果 对浮点型数据排序 运行结果 2.题外话:函数名的本质 1.C语言快速排序的库函数 cplusplus网的介绍 ht…...

C#封送类

封送类(Marshaling classes)在.NET框架中扮演着至关重要的角色,尤其是在托管代码与非托管代码之间进行数据交换时。封送过程涉及到将托管环境中的对象转换为非托管环境中可以理解的形式,并且反之亦然。这一过程确保了两种不同类型…...

2024年度学习总结

2024年是我学业生涯的结束,是我职业生涯的开始。2024年6月19日我顺利研究生毕业,进入体制内,陆止于此,海始于斯,知识和文化最大的魅力,大概就是教会人谦卑和敬畏。读研的目的不是为了单纯拿到哪个证书&…...

我的博客年度之旅:感恩、成长与展望

目录 感恩有你 技能满点 新年新征程 嘿,各位技术大佬、数码潮咖还有屏幕前超爱学习的小伙伴们!当新年的钟声即将敲响,我们站在时光的交汇点上,回首过往,满心感慨;展望未来,豪情满怀。过去的这…...

undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12

目录 我的解决方法: 测试: 报错: undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12 from torch._C import * # noqa: F403 ImportError: /mnt/pfs/users/lbg/envs/mmpano/lib/python3.9/site-packages/torch/lib…...

【OTA】论文笔记--《智能网联汽车整车OTA功能设计研究》智能网联汽车OTA系统设计分析报告

智能网联汽车OTA系统设计分析报告 引言 随着汽车智能化、网联化水平不断提升,现代汽车中电子控制单元(ECU)的数量和复杂度持续增加。据统计,高级轿车上电子电气元件的成本已占整车开发成本的60%~70%。为了实现对这些电控单元的软件开发调试、数据标定、文件更新和故障修复,…...

c#String和StringBuilder

目录 一,String 1,string的特点: 2,string常用方法 (1)Length (2)Substring() (3)ToUpper() (4)ToLower() (5&…...

【Linux】HTTP协议

之前,我们已经做过了自定义协议,事实上,已经有很多现成已经做好又非常好用的协议,它们都是相同的,比如HTTP协议。所谓HTTP协议,就是超文本传输协议,定义了客户端和服务器之间是如何通信的&#…...

计算机网络 (14)数字传输系统

一、定义与原理 数字传输系统,顾名思义,是一种将连续变化的模拟信号转换为离散的数字信号,并通过适当的传输媒介进行传递的系统。在数字传输系统中,信息被编码成一系列的二进制数字,即0和1,这些数字序列能够…...

解锁论文写作新境界:书匠策AI,你的毕业论文智能导航员!

在学术的浩瀚海洋中,每一位即将毕业的大学生或研究生都像是勇敢的航海家,驾驶着知识的帆船,向着那座名为“毕业论文”的灯塔奋力前行。然而,航程中难免会遇到风浪与迷雾,如何高效、准确地完成一篇高质量的毕业论文&…...

终极指南:10分钟搞定网易云音乐NCM加密文件转换

终极指南:10分钟搞定网易云音乐NCM加密文件转换 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐的加密NCM文件无法在其他播放器使…...

Wan2.2-I2V-A14B与Visio流程图结合:让架构图“动”起来

Wan2.2-I2V-A14B与Visio流程图结合:让架构图"动"起来 1. 静态架构图的痛点与动态化需求 在日常技术方案沟通中,我们经常使用Visio绘制各类架构图、网络拓扑图和业务流程图。这些静态图表虽然能清晰展示系统结构,但在演示数据流向…...

PyTorch 2.8镜像基础教程:NumPy/Pandas数据预处理与torch.Tensor转换要点

PyTorch 2.8镜像基础教程:NumPy/Pandas数据预处理与torch.Tensor转换要点 1. 环境准备与快速验证 在开始数据预处理之前,我们需要先确认PyTorch环境已经正确配置并能够使用GPU加速。这个预装PyTorch 2.8的镜像已经为我们准备好了所有必要的组件。 1.1…...

Nano-Banana模型安全防护:对抗样本检测与防御

Nano-Banana模型安全防护:对抗样本检测与防御 在AI模型日益普及的今天,安全性已成为不可忽视的核心议题。Nano-Banana模型通过引入先进的对抗样本检测与防御机制,在鲁棒性上实现了显著突破,有效提升了模型在复杂环境下的可靠性。…...

基于Spring Boot+Vue3的烹饪交流学习系统 设计与实现

基于 Spring Boot Vue3 的烹饪交流学习系统 设计与实现 一、项目概述 随着人们对烹饪学习与交流需求的增加,传统线下学习模式在菜谱管理、内容发现、交流共享与个性化推荐等方面存在明显不足。为此,本项目基于 Spring Boot Vue3 技术栈,构建…...

Spoon与Gradle插件集成:现代化Android项目的最佳实践指南 [特殊字符]

Spoon与Gradle插件集成:现代化Android项目的最佳实践指南 🚀 【免费下载链接】spoon Distributing instrumentation tests to all your Androids. 项目地址: https://gitcode.com/gh_mirrors/sp/spoon Spoon是一个强大的Android测试分发工具&…...

碧蓝航线Alas脚本新手通关指南:从安装到精通的4个关键阶段

碧蓝航线Alas脚本新手通关指南:从安装到精通的4个关键阶段 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 碧蓝航…...

【GD32F407】内部Flash高效读写策略与实战优化

1. GD32F407内部Flash特性解析 GD32F407作为国产MCU中的明星产品,其内部Flash设计颇具特色。第一次拿到芯片手册时,我发现它的存储架构比想象中复杂得多。最让我印象深刻的是前512KB空间的零等待特性——这意味着在此范围内的代码执行速度堪比RAM&#x…...

2026年花洒产品推荐:四款热门花洒横评,闭眼入不踩雷

其实选花洒不用盲目追大牌,核心看体验、看品质、看适配性。今天就带来四款热门花洒的深度横评,涵盖瑞尔特、飞利浦、小米米家、九牧四大主流品牌,每款都结合真实使用体验拆解,不罗列参数、不夸大宣传,让每天的沐浴都能…...