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

news2024/11/18 7:41:41

 以下教程用于验证转成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)

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

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

相关文章

分布式光伏监控系统功能模块详解

目前&#xff0c;分布式光伏发电系统的总容量比较小&#xff0c;并且光伏电站的功率受外界环境影响容易出现大起大落的现象。这使电压调整变得很困难。光伏电站运行维护人员不足&#xff0c;长时间不保养维护会影响光伏电站的发电效率。针对上述问题&#xff0c;鹧鸪云基于无线…

pip镜像源

1.1 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple 1.2 阿里云 https://mirrors.aliyun.com/pypi/simple/ 1.3 网易 https://mirrors.163.com/pypi/simple/ 1.4 豆瓣 https://pypi.douban.com/simple/ 1.5 百度云 https://mirror.baidu.com/pypi/simple/ 1.6 中科大 ht…

LLM Agent智能体综述(超详细)

前言 &#x1f3c6;&#x1f3c6;&#x1f3c6;在上一篇文章中&#xff0c;我们介绍了如何部署MetaGPT到本地&#xff0c;获取OpenAI API Key并配置其开发环境&#xff0c;并通过一个开发小组的多Agent案例感受了智能体的强大&#xff0c;在本文中&#xff0c;我们将对AI Agent…

Java获取请求参数

1.简单参数接收 前端请求参数与Controller接受变量名一致 如果参数名不一致&#xff0c;接受不成功。 可以用RequestParam指定参数名&#xff0c;可以用username接收&#xff08;不推荐&#xff09;。 required true&#xff0c;表示参数必须传递&#xff0c;如果不传递会报错…

c#多态性的应用

设计一个电脑游戏&#xff0c;游戏中有猪、牛、兔子、青蛙、鸭子等动物&#xff0c;这些动 物都继承于Vertebrata 类&#xff08;脊椎动物类&#xff09;&#xff0c;Vertebrata类有一个抽象方法Display()&#xff0c;每个动 物都从Vertebrata 类那里继承并重写了Display()方法…

upload-labs靶场通关详解(1-15)

1.pass-01 查看源代码 是js&#xff0c;属于前端校验 可以通过禁用js来上传文件 2.pass-02 根据提示是MIME绕过 MIME&#xff1a;是设定某种扩展名的文件 用一种应用程序来打开的方式类型&#xff0c;当该扩展名文件被访问的时候&#xff0c;浏览器会自动使用指定应用程序来…

基于springboot+vue+Mysql的在线BLOG网

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

业务上云--从Container+BuildKitd打镜像到在Kubernetes上部署LNMP

一、背景 在基于kubeasz部署kubernetes高可用集群-CSDN博客文章部署的kubernetes集群上部署LNMP 1.1、Kubernetes环境 1.2、Harbor环境 【docker基础】使用Harbor搭建私有仓库-docker-compose使用示例--第二周作业_harbor docker-compose-CSDN博客 Harbor环境升级&#xff…

算法练习day8

反转字符串 代码随想录 0344.反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; &#xff08;用时&#xff1a;0.05小时&#xff09; 思路 这道题很简单也很经典。 字符串的反转方法有很多&#xff0c;我这里是用for循环通过数组长度和下标计算来交换。…

Git使用(2):远程仓库

一、创建远程仓库 登录码云Gitee - 基于 Git 的代码托管和研发协作平台。 点击右上角&#xff0c;新建仓库。 创建完成&#xff0c;复制仓库地址接下来要使用。 二、将idea项目推送到码云 首先创建本地仓库VCS -> Create Git Repository。然后选择Manage Remotes&#xff0…

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代码 QComboBox QComboBox 是 PyQt&#xff08;中的一个控件&#xff0c;它允许用户从下拉列表中选择一个选项。这个控件在需要用户从预定义选项中进行选择时非常有用。 效果 代码 import sys from PyQt5.QtWidgets import QAppl…

谈谈 Spring 的过滤器和拦截器

前言 我们在进行 Web 应用开发时&#xff0c;时常需要对请求进行拦截或处理&#xff0c;故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢&#xff1f;本文将详细讲解两者的区别和对应的使用场景。 &#xff08;本文的代码实现首先是基于 Sprin…

暗区突围TWITCH掉宝关联帐号不了 无法关联帐号 关联不上

Twitch&#xff0c;作为全球知名的游戏直播平台&#xff0c;常常携手热门游戏如《暗区突围》举办互动活动&#xff0c;为玩家带来独特的参与体验。在这个过程中&#xff0c;“绑定关联”成为了连接直播观众与游戏世界的桥梁。简单来说&#xff0c;Twitch绑定关联《暗区突围》指…

【架构-17】通信系统架构设计理论

通信系统网络架构 1. 局域网网络架构 拓扑结构&#xff1a;星型、总线型、环型、树型。 网络架构&#xff1a;单核心架构&#xff08;结构简单&#xff0c;地理范围受限&#xff09;、双核心架构&#xff08;网络拓扑结构可靠&#xff0c;投资较单核高&#xff09;、环型架构…

四天学会JS高阶(学好vue的关键)——作用域解构箭头函数(理论+实战)(第一天)

一、作用域 提到作用域&#xff08;作用域又分为局部作用域和全局作用域&#xff09;&#xff0c;就要想到变量。因为作用域规定了变量能够被访问的范围&#xff08;也就是作用域是为变量而服务的&#xff09;&#xff0c;为了避免全局变量污染这一情况&#xff0c;所以需要使…

ollama离线部署llama3(window系统)

首先介绍下ollama是什么&#xff1f;Ollama是一个开源的大型语言模型服务工具&#xff0c;旨在为用户提供本地化的运行环境&#xff0c;满足个性化的需求。具体来说&#xff0c;Ollama是一个功能强大的开源框架&#xff0c;可以简化在Docker容器中部署和管理大型语言模型&a…

leetcode算法笔记-算法复杂度

对于时间复杂度&#xff0c;主要包括三种情况&#xff1a; 渐进紧确界&#xff1a; O渐进上界&#xff1a; 渐进下界&#xff1a; 加法原则&#xff1a;不同的时间复杂度相加取阶数最高的 乘法原则&#xff1a;不同的时间复杂度相乘&#xff0c;结果为时间复杂度的乘积 阶乘…

计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程

当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”&#xff0c;这通常意味着系统中缺少了Visual C Redistributable for Visual Studio 2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。小编将…

SwiftUI中的常用图形(Shapes)

概述 在SwiftUI中&#xff0c;常用的图形&#xff08;Shape&#xff09;主要有&#xff1a; Circle&#xff1a;圆形 Ellipse&#xff1a;椭圆形 Capsule&#xff1a;胶囊形 Rectangle&#xff1a;矩形 RoundedRectangle&#xff1a;圆角矩形 上面的这些图形都继承了Shape协议…

ssl证书免费申请指南

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、购买证书二、创建证书三、 验证证书等待出现如下页面&#xff0c;说明申请成功&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6b6c1dd11d4c467687318552da7cdbb2.png) 总结 前言 今天为大…