YOLO数据集制作(二)|json文件转txt验证

 以下教程用于验证转成YOLO使用的txt格式,适用场景:矩形框,配合json格式文件转成YOLO使用的txt格式脚本使用。

https://blog.csdn.net/StopAndGoyyy/article/details/138681454

使用方式:将img_path和label_path分别填入对应的图片(文件夹)及标签(文件夹)路径,运行。show_num参数控制最大展示数量,按空格切换。

import os
import numpy as np
import cv2img_format = ['.jpg', '.png', '.jpeg']
colors = [(0, 0, 0), (128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128), (0, 128, 128),(128, 128, 128), (64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0), (64, 0, 128), (192, 0, 128),(64, 128, 128), (192, 128, 128), (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128),(128, 64, 12)]def get_files(img_path, label_path):img_list = []label_list = []datast_img_format = Noneassert os.path.exists(img_path) and os.path.exists(label_path), print("⭐⭐文件夹不存在⭐⭐")if os.path.isdir(img_path):for i in os.listdir(img_path):if os.path.splitext(i)[-1] in img_format:# i = i.replace(os.path.splitext(i)[-1], '')img_list.append(i)datast_img_format=img_list[-1].split('.')[-1]if os.path.isdir(label_path):for i in os.listdir(label_path):if os.path.splitext(i)[-1] == '.txt':i = i.replace(os.path.splitext(i)[-1], '')label_list.append(i)print("路径下无jpg,png,jpeg格式的图片,当前图像路径:" + str(img_path) if len(img_list) == 0 else "图像总数为:" + str(len(img_list)))print("路径下无标签文件,当前标签路径" + str(label_path) if len(label_list) == 0 else "标签总数为:" + str(len(label_list)))img_without_label = []for i in img_list:if i.replace(os.path.splitext(i)[-1], '') not in label_list:img_without_label.append(i)if len(img_without_label) != 0:print("标签丢失的图像有:" + str(img_without_label))ok_img = list(set(img_list) - set(img_without_label))return [i.replace('.jpg', '') for i in ok_img], '.'+datast_img_format# 坐标转换
def xywh2xyxy(x, w1, h1, img):label, x, y, w, h = xx_t = x * w1y_t = y * h1w_t = w * w1h_t = h * h1top_left_x = x_t - w_t / 2top_left_y = y_t - h_t / 2bottom_right_x = x_t + w_t / 2bottom_right_y = y_t + h_t / 2cv2.rectangle(img, (int(top_left_x), int(top_left_y)), (int(bottom_right_x), int(bottom_right_y)),colors[int(label)] if int(label) < len(colors) else colors[0], 2)cv2.putText(img, text=str(int(label)), org=(int(top_left_x), int(top_left_y)), fontFace=cv2.FONT_HERSHEY_COMPLEX,fontScale=1, color=colors[int(label)] if int(label) < len(colors) else colors[0], thickness=3)return imgif __name__ == '__main__':# 修改输入图片文件夹img_path = r"O:\DeepLearningTool\01_handle_dataset\dataset\object\image"# img_path = r"O:\DeepLearningTool\dataset\image"# 修改输入标签文件夹label_path = r"O:\DeepLearningTool\01_handle_dataset\dataset\object\label"# label_path = r"O:\DeepLearningTool\dataset\label"# 输出文件夹outfile = './'# 是否展示绘制的图片if_show = True# 最大展示图片的数量(按空格切换)show_num = 3# 是否保存绘制的图片if_save = Falseif os.path.isdir(img_path):ok_img, datast_img_format = get_files(img_path, label_path)haveShow = 0for i in ok_img:assert os.path.exists(str(img_path) + '\\' + i + datast_img_format)img = cv2.imread(str(img_path) + '\\' + i + datast_img_format)h, w = img.shape[:2]with open(label_path + '\\' + i + '.txt', 'r') as f:lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32)for x in lb:img = xywh2xyxy(x, w, h, img)if if_show:cv2.namedWindow('Image with label', 0)cv2.resizeWindow('Image with label', 600, 500)cv2.imshow('Image with label', img)cv2.waitKey(0)if if_save:outfile = outfile if len(outfile) > 0 else './output/'if not os.path.exists('./output/'):os.mkdir('./output/')print(outfile + i)cv2.imwrite(outfile+i+datast_img_format, img)haveShow += 1if haveShow == show_num:breakelse:img = cv2.imread(str(img_path))h, w = img.shape[:2]assert os.path.isfile(label_path), '标签路径错误'with open(label_path) as f:lb = np.array([x.split() for x in f.read().strip().splitlines()], dtype=np.float32)for x in lb:img = xywh2xyxy(x, w, h, img)if if_show:cv2.namedWindow('Image with label', 0)cv2.resizeWindow('Image with label', 600, 500)cv2.imshow('Image with label', img)cv2.waitKey(0)

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

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

相关文章

网络 | 应用层-websocket协议概述与握手过程解析

背景&#xff1a;这里为了实现消息实时传输决定引入websocket协议。 不管是发送消息还是接收消息&#xff0c;都需要实时传输&#xff0c;张三发给李四&#xff0c;李四立马就能收到&#xff0c;基于HTTP实现是有些困难的。 但轮询方式也带来了一些问题 1、消耗更多系统资源&…

Nacos 入门篇---内存注册表:高并发下如何保证注册表读写并发冲突 ?(五)

一、引言 本章来讲解Nacos注册表是如何进行写入数据的&#xff5e; 二、目录 目录 一、引言 二、目录 三、服务注册源码内容回顾 客户端源码回顾&#xff1a; 服务端源码回顾&#xff1a; 四、Nacos 注册表结构详解 五、写时复制概念 六、Nacos服务注册写入注册表源…

【信息系统项目管理师知识点速记】风险管理基础

项目风险管理是确保项目成功的重要组成部分,涉及到识别、分析、规划应对策略及监控风险的过程。 核心概念 风险双面性:风险既包括威胁(负面影响)也包括机会(正面影响),管理旨在最大化机会、最小化威胁。风险层次:分为单一风险和整体项目风险,需全面管理。风险属性: …

5-11晚和360老员工交流感悟

1.代码&#xff0c;技术不是最主要的&#xff0c;好的工作还需要机遇&#xff0c;缘分&#xff0c;以及其他综合素质。不用过分的在技术上进行纠结和转牛角尖&#xff08;但这也不意味着对技术进行过分的忽视&#xff09;&#xff0c;把握好学习技术的态度和尺度。 2.我们所从事…

Logback 日志配置

文章目录 引言I Appender:日志事件输出组件1.1 控制台: ConsoleAppender1.2 文件滚动日志:RollingFileAppender1.3 ` <root>`标签设置默认的日志配置1.4 `<logger>`标签修改其他包的日志输出级别1.5 property标签定义属性1.6 Filter过滤器1.7 健康检查暴露端点II 使…

Lombok注解详解

文章目录 注解详解lombok包下注解汇总- Getter- Setter- ToString- EqualsAndHashCode- Data- Value- NonNull- NoArgsConstructor- AllArgsConstructor- RequiredArgsConstructor- Builder- Synchronized- Cleanup- Singular- Generated- SneakyThrows- val- var experimental…

面试八股之Redis篇2——redis分布式锁

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

互联网引流艺术:精准获客的黄金法则

在如今这个信息爆炸的时代&#xff0c;互联网引流不再是简单地发布广告和等待潜在客户的到来。它变成了一门需要策略、技巧和持续创新的艺术。作为一位资深的互联网营销从业者&#xff0c;我深知精准推广的重要性&#xff0c;以及它在帮助企业获得理想客户中的关键作用。以下是…

用HAL库改写江科大的stm32入门例子_1、按键控制led灯

使用STM32CubeMX生成Keil工程并完成流水灯 ,就不重复了&#xff1a;直接参考&#xff1a; 使用STM32CubeMX生成Keil工程并完成流水灯 进入主题&#xff0c;用中断实现&#xff0c;操作步骤如下&#xff1a; 1 如下图设置PB11 管脚 2 设置PB11为下降沿中断&#xff1a; 3 PA…

java 动态代理详解

cglib 动态代理 介绍 CGLIB是一个功能强大&#xff0c;高性能的代码生成包。它为没有实现接口的类提供代理&#xff0c;为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理&#xff0c;但当要代理的类没有实现接口或者为了更好的性能&#xff0c;CGLIB 是一…

【xrframe】优化ar相机中加载模型效果

方法一&#xff1a;定义渲染width和height //组件生命周期&#xff1a;在视图层布局完成后执行ready() {const info wx.getSystemInfoSync();//在小程序中同步获取系统信息const width info.windowWidth;//获取屏幕的宽度&#xff08;单位为物理像素&#xff09;const heigh…

PC适配移动端

**手机端适配** 媒体查询 组件统一样式 媒体查询写四套样式 手机 屏幕宽小于768px 平板 屏幕宽 大于等于768px 小于992px 桌面显示器 屏幕宽大于等于992px 小于1200px 大屏幕 屏幕宽大于等于1200px **页面整体及页面内容** 页面看是需要主PC还是主移动端 主移动端的话…

探索设计模式的魅力:权力集中,效率提升,中心化模式的优势与挑战

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索中心化模式之旅✨ 大家好啊&#xff01;&#x1f44b; 这次我们要聊的是IT界一…

AI绘画动漫转真人详细教程

从小到大&#xff0c;我们看过的动漫、玩过的游戏有很多很多 但我们会发现里面的角色或者人物都是二次元的 我就会好奇这些动漫人物在现实中会长什么样 而现在&#xff0c;我们通过AI绘画竟然就能还原出来他们现实中的样子 除了动漫角色和游戏人物&#xff0c;古代的画像、经典…

day11-StreamFile

1.Stream流 1.1 体验Stream流 需求&#xff1a;按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"杨"开头的元素存储到一个新的集合 把"杨"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得到…

【笔记】从零开始做一个男性人体的流程/躯干篇(超级详细)

躯干整体 大体 1.创建一个正方体&#xff0c;摆好位置 2.实例呀啥的都搞好 3.胸部它是一个前窄后宽的结构 斜方肌 臀部 1.臀部是前宽后窄的结构 2.我们再去侧面调整以下 胸椎向上倾斜&#xff0c;盆骨向下倾斜。脊椎是s形的 3.真实的身体没有这么方正&#xff0c;所以微调…

青少年软件编程(Python)等级考试试卷(三级)2024年3月

2024.03电子学会青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;三级&#xff09; 一、单选题 1.在 Python 中&#xff0c;hex(2023)的功能是? ( ) A.将十进制数 2023 转化为十六进制数 B.将十进制数 2023 转化为八进制数 C.将十六进制数 2023…

第四步->手撕spring源码之bena注入实现和依赖

本步骤目标 上述几个步骤 定义和注册Bean (opens new window)、实例化Bean (opens new window)&#xff0c;按照是否包含构造函数实现不同的实例化策略 (opens new window)&#xff0c;那么在创建对象实例化这我们还缺少什么&#xff1f;其实还缺少一个关于类中是否有属性的问题…

Android 13.0 系统限制上网系列之iptables用IOemNetd实现app某个时间段禁止上网的功能实现

1.前言 在13.0的系统rom定制化开发中,对于系统限制网络的使用的这块需求开发中,在system中netd网络这块的产品需要中,会要求设置app某个时间段禁止上网的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app某个时间段禁止上网的的相关功能,就是在…

ctfshow web274

web274 thinkphp框架序列化漏洞 EXP <?php namespace think; abstract class Model{protected $append[];private $data[];function __construct(){$this->append["lin">["ctf","show"]];$this->data["lin">new Req…