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

labelme json 标签转yolo txt【记录】

01 labelme json 转 txt(w_convert_labelme_to_yolo.py)

#WT 将labelme json标签格式转换为YOLO txt格式
# 导入所需模块
import cv2  # OpenCV用于图像处理
import os   # 操作系统路径管理
import json  # JSON文件解析
import glob  # 文件通配符搜索
import numpy as np  # 数值计算def convert_json_label_to_yolov_seg_label():# 设置JSON文件路径(本地标注数据目录)json_path = r"data"  # 本地json路径# 获取所有JSON文件列表json_files = glob.glob(json_path + "/*.json")print(json_files)# 创建输出目录(YOLO格式标签存储路径)output_folder = "txt2"  # txt存放路径if not os.path.exists(output_folder):os.makedirs(output_folder)  # 递归创建目录# 遍历处理每个JSON文件for json_file in json_files:print(json_file)# 读取并解析JSON文件with open(json_file, 'r') as f:json_info = json.load(f)# 加载对应图像获取尺寸img = cv2.imread(os.path.join(json_path, json_info["imagePath"]))height, width, _ = img.shapenp_w_h = np.array([[width, height]], np.int32)  # 转换为numpy数组便于计算# 构建输出文件路径(保持与JSON同名,后缀改为.txt)txt_file = os.path.join(output_folder, os.path.basename(json_file).replace(".json", ".txt"))# 写入YOLO格式标签with open(txt_file, "w") as f:for point_json in json_info["shapes"]:txt_content = ""# 转换坐标点为numpy数组np_points = np.array(point_json["points"], np.int32)# 归一化坐标(除以图像宽高)norm_points = np_points / np_w_h# 转换为列表并格式化输出norm_points_list = norm_points.tolist()# 拼接类别标签和坐标点(YOLO格式要求:类别+归一化坐标)txt_content += "0 " + " ".join([" ".join([str(cell[0]), str(cell[1])]) for cell in norm_points_list]) + "\n"f.write(txt_content)if __name__ == "__main__":# 执行转换函数convert_json_label_to_yolov_seg_label()

02 检查图片和标签文件是否对应python脚本(w_check_img_to_label.py) 

#WT:检查图片和标签是否匹配2025-04-06
import osdef get_file_names(directory):file_names = os.listdir(directory)return file_nameslabels_path = 'train/labels'
labels_names_list = get_file_names(labels_path)
images_path = 'train/images'
images_names_list = get_file_names(images_path)
for i in range(len(images_names_list)):filename = images_names_list[i][0:-3] + 'txt'if filename in labels_names_list:continueelse:print(f"【{filename}】标签不存在!")continueprint("检查结束")

03 从labeme标注的json文件提取标签label类别class脚本(w_extract_json_label.py)

#WT:从labeme标注的json文件提取标签label类别class
#WT 将labelme json标签格式转换为YOLO txt格式
# 导入所需模块
import os   # 操作系统路径管理
import json  # JSON文件解析
import glob  # 文件通配符搜索def extract_labelme_json_label():# 设置JSON文件路径(本地标注数据目录)json_path = r"data"  # 本地json路径# 获取所有JSON文件列表json_files = glob.glob(json_path + "/*.json")#print(json_files)label_class_list = []# 遍历处理每个JSON文件for json_file in json_files:print(json_file)# 读取并解析JSON文件with open(json_file, 'r') as f:json_info = json.load(f)json_shapes = json_info["shapes"]#print(json_shapes,type(json_shapes))for i in range(len(json_shapes)):#print(json_shapes[i]["label"])if json_shapes[i]["label"] in label_class_list:continueelse:label_class_list.append(json_shapes[i]["label"])print("完成!")print(label_class_list)if __name__ == "__main__":# 执行函数extract_labelme_json_label()

04 重置图片格式大小【脚本存在一些问题】(w_resize_train_images.py)

#重置图片格式大小
import os
import cv2
import numpy as np# 定义letterbox函数,用于对图像进行缩放和填充,使其适应指定尺寸
def letterbox(img, new_shape=(640, 640), color=(255, 255, 255), auto=False, scale_fill=False, scale_up=False, stride=32):shape = img.shape[:2]  # 获取图像的原始高度和宽度if isinstance(new_shape, int):new_shape = (new_shape, new_shape)  # 如果new_shape是整数,则将其转换为方形尺寸# 计算缩放比例r,确保图像不会拉伸变形r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])if not scale_up:r = min(r, 1.0)  # 如果scale_up为False,则缩放比例不大于1,避免放大ratio = r, r  # 记录宽高的缩放比例new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))  # 根据比例计算缩放后的尺寸dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # 计算需要填充的宽度和高度if auto:dw, dh = np.mod(dw, stride), np.mod(dh, stride)  # 如果auto为True,将填充尺寸调整为步长的倍数elif scale_fill:dw, dh = 0.0, 0.0  # 如果scale_fill为True,则不进行填充,直接拉伸到目标尺寸new_unpad = (new_shape[1], new_shape[0])ratio = new_shape[1] / shape[1], new_shape[0] / shape[0]  # 重新计算缩放比例dw /= 2  # 左右填充的宽度dh /= 2  # 上下填充的高度if shape[::-1] != new_unpad:  # 如果原始尺寸和缩放后的尺寸不同,进行图像缩放img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)  # 线性插值进行图像缩放top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))  # 上下填充像素数left, right = int(round(dw - 0.1)), int(round(dw + 0.1))  # 左右填充像素数img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)  # 使用指定颜色填充return img, ratio, (dw, dh)  # 返回处理后的图像、缩放比例以及填充的宽高# 保存经过letterbox处理的图像
def save_letterboxed_image(image_bytes, output_filename, new_shape=(1280, 1280)):im0 = cv2.imdecode(np.frombuffer(image_bytes, np.uint8), cv2.IMREAD_COLOR)  # 从字节数据解码出图像if im0 is None:raise ValueError("Failed to decode image from image_bytes")  # 如果图像解码失败,抛出异常img, _, _ = letterbox(im0, new_shape=new_shape)  # 对图像进行letterbox处理# 保存处理后的图像cv2.imwrite(output_filename, img)  # 将处理后的图像写入文件print(f"Saved letterboxed image to {output_filename}")  # 输出保存成功的信息# 处理文件夹中的所有图像
def process_images_in_folder(folder_path, output_folder, new_shape=(1280, 1280)):if not os.path.exists(output_folder):os.makedirs(output_folder)  # 如果输出文件夹不存在,则创建# 遍历文件夹中的所有图像文件for filename in os.listdir(folder_path):if filename.endswith(('.jpg', '.png', '.jpeg')):  # 仅处理特定格式的图像文件image_path = os.path.join(folder_path, filename)  # 获取图像的完整路径with open(image_path, 'rb') as f:image_bytes = f.read()  # 读取图像文件的字节数据output_filename = os.path.join(output_folder, filename)  # 构建输出文件的完整路径save_letterboxed_image(image_bytes, output_filename, new_shape=new_shape)  # 保存处理后的图像# 使用示例
if __name__ == "__main__":folder_path = r'train/images'  # 替换为你的图片文件夹路径output_folder = 'resizeimg'  # 替换为保存处理后图片的文件夹路径process_images_in_folder(folder_path, output_folder, new_shape=(640, 640))  # 处理文件夹中的图像

05 class.txt

desquamatehollow
cracking

06 data.yaml

train: ../train/images
val: ../valid/images
test: ../test/imagesnc: 3
names: ['desquamate', 'hollow', 'cracking']

代码参考:

Labelme的安装与使用教程_labelme安装及使用教程-CSDN博客 

YOLO11 图像缩放 | 图像填充 | 自适应不同尺寸的图片_yolo训练 图片不同大小-CSDN博客

相关文章:

labelme json 标签转yolo txt【记录】

01 labelme json 转 txt(w_convert_labelme_to_yolo.py) #WT 将labelme json标签格式转换为YOLO txt格式 # 导入所需模块 import cv2 # OpenCV用于图像处理 import os # 操作系统路径管理 import json # JSON文件解析 import glob # 文件通配符搜索…...

Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发

Unity3D 交互式AI桌面宠物开发系列【三】ASR 语音识别 该系列主要介绍怎么制作AI桌面宠物的流程,我会从项目开始创建初期到最终可以和AI宠物进行交互为止,项目已经开发完成,我会仔细梳理一下流程,分步讲解。 这篇文章主要讲有关于…...

Qt -信号与槽

博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 前言引入connect调用链模板类型的connectQObject::connectImplQObjectPrivate::connectImpl qobject_p_p.hconnect作用总结ai对信号与槽的模拟实现 前言 面向对象&am…...

深度解析新能源汽车研发测试中的关键信号采集技术

摘要 随着新能源汽车的快速发展,研发测试环节对信号采集的需求日益复杂。本文结合行业前沿技术方案,系统梳理了新能源汽车测试中需要关注的核心信号类型、采集方法及技术难点,涵盖高压电气、动力电池、热管理、智能驾驶、网络通信等全维度数据…...

Django中使用不同种类缓存的完整案例

Django中使用不同种类缓存的完整案例 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 Django中使用不同种类缓存的完整案例步骤1:设置Django项目步骤2:设置URL路由步骤3:视图级别…...

Linux 高级命令与常见操作:文本处理、系统管理与网络调试

下面是一份针对已经熟悉 Linux 基础命令的用户所整理的「高级命令与常见操作」笔记,涵盖文本处理、系统管理、网络调试与其他常用的进阶技巧。请你审核下面笔记,检查是否有过时的内容,如有请进行替换,确保其符合现代化需求&#x…...

解锁健康密码,拥抱品质生活

在生活节奏不断加快的今天,健康养生已成为人们关注的焦点。它不仅关乎当下生活质量,更是对未来幸福的投资。从日常生活的点滴出发,掌握正确养生方法,我们就能轻松收获健康。​ 饮食是健康的基石。我们应当遵循 “食物多样&#x…...

TLS 1.2 握手过程,每个阶段如何保证通信安全?​​

TLS 1.2 握手是确保客户端和服务器之间安全通信的关键过程。它涉及多个步骤,包括身份验证、加密算法协商和会话密钥交换。 目录 TLS 1.2 握手是确保客户端和服务器之间安全通信的关键过程。它涉及多个步骤,包括身份验证、加密算法协商和会话密钥交换。…...

ABAP 新语法 - corresponding

在 ABAP 中,CORRESPONDING 操作符用于根据字段名称自动映射结构体(Structure)或内表(Internal Table)的字段值。它比传统的 MOVE-CORRESPONDING 语句更灵活,支持更多控制选项。 基础用法 data: begin of …...

C++ 中为什么构造函数不需要实现虚函数,而析构函数需要?

在C中,构造函数不需要是虚函数,而析构函数往往需要,原因如下: 构造函数 对象创建顺序:构造函数的主要任务是初始化对象的成员变量,创建对象时需要先调用基类的构造函数,再调用派生类的构造函数…...

vscode使用方式

一、常用快捷键与代码操作 注释与代码排版 行注释:Ctrl /;块注释:Shift Alt A。 代码缩进:选中代码段后按 Tab(右移)或 Shift Tab(左移)。 代码导航与编辑 快速跳转文件&…...

存储模块cache

参考:存储模块 --- Cache_cache模块-CSDN博客 一级缓存(L1 Cache) 和 二级缓存(L2 Cache) 都是处理器内的高速缓存,用来减少访问主内存的延迟,提高处理器的性能。它们在计算机体系结构中发挥着…...

HTML零基础入门笔记:狂神版

前言 本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。 【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 第1-2章:Java零基础入门笔记:(1-2)入门(简介、基础知识)-CSDN博客 第3章&…...

java.util.Collections中常用api

在Java中&#xff0c;java.util.Collections 是一个工具类&#xff0c;提供了大量静态方法用于操作或返回集合&#xff08;如List、Set、Map等&#xff09;。以下是常用的API分类整理&#xff1a; 1. 排序与顺序操作 sort(List<T> list) 对List进行自然顺序排序&#xff…...

FreeRTOS移植笔记:让操作系统在你的硬件上跑起来

一、为什么需要移植&#xff1f; FreeRTOS就像一套"操作系统积木"&#xff0c;但不同硬件平台&#xff08;如STM32、ESP32、AVR等&#xff09;的CPU架构和外设差异大&#xff0c;需要针对目标硬件做适配配置。移植工作就是让FreeRTOS能正确管理你的硬件资源。 二、…...

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理

c语言修炼秘籍 - - 禁(进)忌(阶)秘(技)术(巧)【第五式】动态内存管理 【心法】 【第零章】c语言概述 【第一章】分支与循环语句 【第二章】函数 【第三章】数组 【第四章】操作符 【第五章】指针 【第六章】结构体 【第七章】const与c语言中一些错误代码 【禁忌秘术】 【第一式…...

树莓派超全系列教程文档--(22)使用外部存储设备的相关操作

使用外部存储设备的相关操作 外部存储设备相关操作安装存储设备设置自动挂载卸载存储设备处理 target is busy 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 外部存储设备相关操作 您可以将外部硬盘、SSD或U盘连接到Raspberry Pi上的任何USB端…...

MySQL表的增删改查基础版

这一部分内容比较多&#xff0c;请大家结合目录查看&#x1f440; 增删改查 这一部分内容比较多&#xff0c;请大家结合目录查看&#x1f440; 一、新增1.插入2.指定列插入3.一次插入多行记录 二、查询1.全列查询2.指定列查询3.查询字段为表达式4.别名5.去重6.多列去重7.排序8.…...

PDF预览-搜索并高亮文本

在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器&#xff0c;它允许你在网页上嵌入PDF文件&#xff0c;并提供基本的阅读功能。要实现搜索并高亮显示文本&#xff0c;你可以通过以下几个步骤来完成&#xff1a; 1. 引入PDF…...

【备赛】蓝桥杯嵌入式实现led闪烁

原理 由于蓝桥杯的板子带有锁存器&#xff0c;并且与lcd屏幕有冲突&#xff0c;所以这个就成了考点。 主要就是用定时器来实现&#xff0c;同时也要兼顾lcd的冲突。 一、处理LCD函数 首先来解决与lcd屏幕冲突的问题&#xff0c;把我们所有用到的lcd函数改装一下。 以下是基…...

【Python】贝叶斯,条件概率是怎么回事儿

【Python】贝叶斯&#xff0c;条件概率是怎么回事儿 一、原理简介1.1 贝叶斯定理1.2 朴素贝叶斯假设 二、算法实现过程2.1 数据准备与预处理2.2 模型训练与预测2.2.1 高斯朴素贝叶斯 - 对应连续型数据2.2.2 多项式朴素贝叶斯 - 离散型数据 2.3 模型评估 三、算法优缺点分析3.1 …...

Flink介绍——实时计算核心论文之Storm论文详解

引入 我们通过以下两篇文章&#xff0c;深入探索了S4是如何抽象流式计算模型&#xff0c;如何设计架构和系统&#xff0c;存在那些局限&#xff1a; 论文详解论文总结 Yahoo推出的S4 并没有在历史舞台上站稳脚跟&#xff0c;在S4的论文发表的同一年&#xff0c;我们今天的主…...

001 使用单片机实现的逻辑分析仪——吸收篇

本内容记录于韦东山老师的毕设级开源学习项目&#xff0c;含个人观点&#xff0c;请理性阅读。 个人笔记&#xff0c;没有套路&#xff0c;一步到位&#xff0c;欢迎交流&#xff01; 00单片机的逻辑分析仪与商业版FPGA的逻辑分析仪异同 对比维度自制STM32逻辑分析仪商业版逻…...

es基本概念

Elasticsearch 的架构与基本概念 Elasticsearch&#xff08;简称 ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于全文搜索、日志分析、实时数据分析等场景。以下是其架构概述及其基本概念的详细解释。 Elasticsearch 的架…...

可以使用费曼学习法阅读重要的书籍

书本上画了很多线&#xff0c;回头看等于没画出任何重点。 不是所有的触动都是有效的。就像你曾经看过很多好文章&#xff0c;当时被触动得一塌糊涂&#xff0c;还把它们放进了收藏夹&#xff0c;但一段时间之后&#xff0c;你就再也记不起来了。如果让你在一本书上画出令自己…...

11-产品经理-创建产品

在“产品”-“仪表盘”内&#xff0c;可以查看系统中关于产品及相关需求的统计。 在“产品”-“产品列表”页面&#xff0c;可以按项目集、项目查看其关联产品。还可以添加产品、编辑产品线、或者导出产品列表。 产品看板&#xff0c;通过看板方式查看产品、产品计划和产品下的…...

JavaScript学习教程,从入门到精通,JavaScript 基础语法全面指南(5)

JavaScript 基础语法全面指南 一、JavaScript 基本概念 JavaScript 是一种轻量级的解释型或即时编译型的编程语言&#xff0c;主要用于网页开发&#xff0c;为网页添加交互功能。 1.1 JavaScript 的特点 解释型语言&#xff1a;不需要编译&#xff0c;由 JavaScript 引擎直…...

低代码开发平台:飞帆制作网页并集成到自己的网页中

应用场景&#xff1a; 有时&#xff0c;我们的网页使用了某个模版&#xff0c;或者自己写的 html、css、javascript 代码。只是网页中的一部分使用飞帆来制作。这样的混合网页如何实现呢&#xff1f; 其实很容易&#xff0c;来体验一下飞帆提供的功能&#xff01; 还记得这个…...

语法: result=log (x);

LOG( ) 语法: resultlog (x); 参数: x是一个浮点数; 返回值: result等于返回值,是一个浮点数; 功能: 该函数是用来计算浮点数x的自然对数(即ln x);如果x小于或等于0,或x太大,则行为没有定义; 注意:存在error挂起; 如果在编写程序里包含了errno.h头文件,则范围和等级…...

Hibernate核心方法总结

Session中的核心方法梳理 1、save方法 这个方法表示将一个对象保存到数据库中&#xff0c;可以将一个不含OID的new出来的临时对象转换为一个处于Session缓存中具有OID的持久化对象。 需要注意的是&#xff1a;在save方法前设置OID是无效的但是也不会报错&#xff0c;在save方…...