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 cv2

img_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 = None
    assert 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 = x
    x_t = x * w1
    y_t = y * h1
    w_t = w * w1
    h_t = h * h1
    top_left_x = x_t - w_t / 2
    top_left_y = y_t - h_t / 2
    bottom_right_x = x_t + w_t / 2
    bottom_right_y = y_t + h_t / 2

    cv2.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 img


if __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 = False

    if os.path.isdir(img_path):
        ok_img, datast_img_format = get_files(img_path, label_path)
        haveShow = 0
        for 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 += 1
            if haveShow == show_num:
                break
    else:
        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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图鸟UI vue3:基于Vue3和UniApp的酷炫简洁UI框架

引言 随着前端技术的不断发展&#xff0c;开发效率和用户体验成为了前端开发中的两大关键因素。为了提高开发效率和提供更好的用户体验&#xff0c;各种UI框架应运而生。其中&#xff0c;TuniaoUI作为一款基于Vue3和UniApp开发的UI组件库&#xff0c;以其酷炫简洁的设计和丰富…

JVM调优:JVM中的垃圾收集器详解

JVM&#xff08;Java Virtual Machine&#xff09;垃圾收集器是Java虚拟机中的一个重要组件&#xff0c;负责自动管理Java堆内存中的对象。垃圾收集器的主要任务是找出那些不再被程序使用的对象&#xff0c;并释放它们占用的内存&#xff0c;以便为新的对象分配空间。这个过程被…

客户端机器访问服务端Harbor

书接上回&#xff1a;Docker私有仓库Harbor-CSDN博客 修改客户端机器名称 [roothost01 ~]# hostnamectl hostname client [roothost01 ~]# bash [rootclient ~]# 安装docker [rootclient ~]# yum -y install yum-utils.noarch [rootclient …

分布式任务调度框架xxl-job使用手册

官网地址和文档地址&#xff1a;https://www.xuxueli.com/xxl-job/ 一、快速入门 1.1 下载源码 https://github.com/xuxueli/xxl-job https://gitee.com/xuxueli0323/xxl-job 下载完成后有以下模块 1.2 初始化数据库 官方指定mysql8.0&#xff0c;但我是mysql5.7 执行/xxl…

Git系列:git tag 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【web开发网页制作】Html+Css明星网页主题开发之邓超(5页面附源码)

HTMLCSS影视主题网页目录 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果Page1、首页Page2、个人经历Page3、个人生活Page4、个人作品Page5、个人公益 &#x1f40b;三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书…

C++––初识C++

目录 一.绪言 1.什么是C 2.C语言和C的关系 2.1数据类型 2.2数据类型的长度 2.3变量和常量 2.4字符串操作 2.5判断和选择语句&#xff0c;循环语句 2.6逻辑运算符 2.7函数的声明和调用 2.8数组 2.9操作符 二.C入门的基本知识 1.命名空间 2.输入&输出 3.缺省…

Node.js全栈:从一个简单的例子开始

第一章&#xff1a;从一个简单的例子开始第二章&#xff1a;看官方文档的艺术第三章&#xff1a;浏览器显示一个网页 首先&#xff0c;在VSCode编辑器中打开一个没有任何文件的空目录&#xff0c;然后创建一个package.json文件。 为了方便大家复制&#xff0c;我把文件内容放到…

【C语言项目】贪吃蛇(下)

个人主页~ 源码在Gitee仓库~ 上一篇贪吃蛇&#xff08;上&#xff09;~ 贪吃蛇 四、核心的实现游戏测试1、GameStart&#xff08;1&#xff09;控制台窗口大小和名字设置&#xff08;2&#xff09;光标隐藏&#xff08;3&#xff09;打印欢迎界面&#xff08;4&#xff09;创建…

加入全球少儿编程运动:Scratch让每个孩子都能成为创造者(Scratch最新版客户端和初/中/高级学习资料整理分享)

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f3e1; 演示环境 &#x1f3e1;&#x1f4d2; 文章内容 &#x1f4d2;&#x1f4dd; 安装与使用&#x1f4dd; 社区与资源 &#x1f388; 获取方式 &#x1f388;⚓️ 相关链接 ⚓️ &#x1f4d6; 介绍 &#x1f4d6; 你知道…

没有公网ip,如何实现外网访问内网?

目前拨号上网是最广泛的上网方式&#xff0c;这种方式优点是价格便宜&#xff0c;缺点是没有固定公网ip&#xff0c;每次重新您拨号ip地址都会变。如果有一台服务器&#xff0c;需要实现外网访问&#xff0c;在没有固定公网ip的环境下&#xff0c;该如何实现呢&#xff1f;使用…

2.4 输入和显示

本节必须掌握的知识点&#xff1a; 示例五源代码 代码分析 汇编解析 2.4.1 示例五 ■格式化输入函数scanf scanf函数可以从键盘读取输入的信息。scanf函数同样可以像printf函数那样&#xff0c;通过转换说明“%d”来限制函数只能读取十进制数。scanf函数的参数为可变参数…

外网如何访问内网?快解析

由于公网IP资源短缺&#xff0c;我们的电脑大多处于内网环境&#xff0c;如何在外网访问内网电脑&#xff0c;成为一个令人头疼的问题&#xff0c;下面我给大家推荐一个非常实用的方法。 1&#xff1a;访问快解析下载安装快解析服务器 2&#xff1a;运行软件&#xff0c;点击“…

08.4.grafana自定义图形并直接数据库取值

grafana自定义图形并直接数据库取值 自定义添加油表图形 选择gauge图形&#xff0c;并且配置对应设定值&#xff0c;点击应用 如图所示&#xff0c;可以看到仪表盘上的值是zabbix上取得值 配置grafana直接数据库取值 添加mysql数据源 添加后进行配置&#xff0c;我这…

计算机毕业设计python+spark知识图谱音乐推荐系统 音乐数据分析可视化大屏 音乐爬虫 LSTM情感分析 大数据毕设 深度学习 机器学习

本科毕业设计&#xff08;论文&#xff09;开题报告 课题名称 基于Spark的音乐推荐与数据分析系统 的设计与实现 课题类型 系统设计 学院 大数据与人工智能学院 班级 专业 数据科学与大数据技术 指导教师 职称 学生姓名 学号 重庆工程学院教务处制 1.课…

函数模板底层本质

#include<iostream> using namespace std;template<typename T1> T1 ave(T1 a, T1 b) { return a b; }int main() {ave(100, 200);ave(short(100), short(200));return 0; }反汇编代码 模板本质是编译器帮忙生成了不同的函数 就算非类型参数值不一样编译器也重新…

开发一款相亲交友小程序

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

STM32F407-驱动SHT41采集温湿度

STM32F407-驱动SHT41采集温湿度 SHT41 SHT41通过I2C方式进行驱动 从机地址&#xff1a; 0x44 获取数据方式 1&#xff09;先发送I2C写&#xff0c;写入特定指令 2&#xff09;延时一段时间&#xff0c;等待SHT41处理 3&#xff09;再进行I2C读&#xff0c;读数据即可 一些…

【谷粒商城】02安装和配置git

1.下载和安装git 地址&#xff1a;https://git-scm.com/download/win 傻瓜式安装 2.配置git DELLLJL MINGW64 ~/Desktop $ git config --global user.name "yufuabu"DELLLJL MINGW64 ~/Desktop $ git config --global user.email "463999534qq.com"DELL…

智慧管家物业管理系统(小组项目)

目录 前言 一、项目介绍 1、目的和背景 2、项目主要内容 3、技术介绍 二、功能模块 1、重要文件结构 2、功能实现&#xff08;部分个人负责模块功能&#xff09; 2.1 展示房源信息页面 2.2 房屋详情页面 2.3 房源信息管理 三、功能模块页面 1、前台模块 2、后台…