ExDark数据集标签转yolo格式(易懂)

ExDark数据集标签转yolo格式(易懂)

一、前言

知道大家为何而来,因此作者不必废话直接上代码。代码已经详细注释,如果读者还有不懂的地方,在评论区留言,我将在48小时内回复你(如果我没毕业的话)。

二、代码

import os
import cv2
import re

# 定义类别列表
categSrces = ['Bicycle', 'Boat', 'Bottle', 'Bus', 'Car', 'Cat', 'Chair', 'Cup', 'Dog', 'Motorbike', 'People', 'Table']


# 函数:将类别名称转换为类别索引
def Get_Cls_Index(Cls_Name):
    if Cls_Name in categSrces:
        return categSrces.index(Cls_Name)
    else:
        raise ValueError(f"Class '{Cls_Name}' not found in the category list.")


# 函数:将标签文件内容转换为 YOLO 格式
def Convert_to_yolo_label(Img_Folder, Src, Dst):
    # 检查源文件夹是否存在
    if not os.path.exists(Src):
        raise ValueError("Src does not exist.")

    # 检查目标文件夹是否存在,如果不存在,则创建它
    if not os.path.exists(Dst):  
        os.makedirs(Dst)

    for file in os.listdir(Src):
        with open(os.path.join(Src, file), 'r') as LabelFile:
            # 正则表达式匹配
            match = re.findall('([0-9]+_[0-9]+)(.[a-zA-z]+)(.[a-zA-Z]+)', file)[0]
            Prefix = match[0]  # 真实文件名(不带扩展名)
            Img_Format = match[1]  # 图像格式

            lines = LabelFile.readlines()  # 读取源标签文件内容
            Yolo_File_Content = []  # 存储转换后的标签文件内容(每一个列表元素是一个目标的标签)
            Save_File_Name = os.path.join(Dst, Prefix + '.txt')  # 存储转换后的标签文件路径

            # 读取对应的图片,并获取形状参数(高和宽)
            img = cv2.imread(os.path.join(Img_Folder, Prefix+Img_Format))
            img_height, img_width, _ = img.shape  # 获取图像的高度和宽度

            for line in lines[1:]:  # 跳过文件版本行
                # 解析标签文件内容,将标签信息读取出来
                Labelinfo = line.strip().split()

                # 解析标签文件内容,将标签信息读取出来
                Cls_Name = Labelinfo[0]
                x_min = float(Labelinfo[1])
                y_min = float(Labelinfo[2])
                box_width = float(Labelinfo[3])
                box_height = float(Labelinfo[4])

                # 计算Yolo标签格式:类别索引 标签框的中心点x坐标 标签框的中心点y坐标 宽度 高度
                # 最后每一个参数计算参数都要归一化,后面除以高或宽就是为了归一化处理
                Cls_Index = Get_Cls_Index(Cls_Name)
                x_center = (x_min + box_width / 2) / img_width 
                y_center = (y_min + box_height / 2) / img_height
                norm_width = box_width / img_width
                norm_height = box_height / img_height

                # 构建 YOLO 格式的标签行,并保存
                yolo_label = f"{Cls_Index} {x_center:.6f} {y_center:.6f} {norm_width:.6f} {norm_height:.6f}\n"
                Yolo_File_Content.append(yolo_label)

            # 将转换后的标签文件内容写入目标文件
            with open(Save_File_Name, 'w') as TargetFile:
                TargetFile.writelines(Yolo_File_Content)


# 定义图像文件夹路径、源标签文件目录路径和目标标签文件目录路径
Img_Folder = r'E:\Datasets\ExDark\images'
Src = r'E:\Datasets\ExDark\Annotations'
Dst = r'E:\Datasets\ExDark\Annotations_yolo'

# 调用函数,将ExDark的标签文件转换为 YOLOv 格式
Convert_to_yolo_label(Img_Folder, Src, Dst)

三、注意事项

  • 代码拷贝后记得修改路径
  • 文章对于源标签文件名的各部分(真实文件名图像格式文本文件后缀)提取使用了正则表达式
  • 正则表达式是非常强大的东西,本着授人以鱼不如授人以渔的初心和目的,希望大家能理解上述正则表达式,这里我提供了大家网页学习的路径
    • 正则表达式 – 语法 | 菜鸟教程 (runoob.com)
  • 如果嫌麻烦,那么下面是简单的对正则表达式语法的介绍(已足够读者理解代码中的正则表达式)
    • 匹配字符
      • .:匹配任意字符(除了换行符)
      • \w:匹配任意字母数字字符(相当于 [a-zA-Z0-9_]
      • \W:匹配任意非字母数字字符
      • \d:匹配任意数字字符(相当于 [0-9]
      • \D:匹配任意非数字字符
      • \s:匹配任意空白字符(相当于 [ \t\n\r\f\v]
      • \S:匹配任意非空白字符
    • 边界匹配
      • ^:匹配字符串的开头
      • $:匹配字符串的结尾
      • \b:匹配一个单词边界
      • \B:匹配非单词边界
    • 字符集
      • [abc]:匹配方括号内的任意一个字符(此处为 abc
      • [^abc]:匹配不在方括号内的任意一个字符
      • [a-z]:匹配小写字母范围内的任意一个字符
      • [A-Z]:匹配大写字母范围内的任意一个字符
      • [0-9]:匹配数字范围内的任意一个字符
    • 量词
      • *:匹配前一个字符零次或多次
      • +:匹配前一个字符一次或多次
      • ?:匹配前一个字符零次或一次
      • {n}:匹配前一个字符恰好 n
      • {n,}:匹配前一个字符至少 n
      • {n,m}:匹配前一个字符至少 n 次,但不超过 m
    • 分组和引用
      • ():匹配括号内的表达式,并记住匹配的文本
      • |:匹配 | 左右任意一个表达式
      • \num:匹配 num 所表示的分组
      • (?P<name>...):匹配 ... 并将匹配结果命名为 name
      • (?P=name):引用命名为 name 的分组匹配结果
    • 特殊序列
      • \A:匹配字符串的开头
      • \Z:匹配字符串的结尾
      • \:将后面的字符转义为原始字符
      • \g<name>:引用命名为 name 的分组匹配结果
      • \number:引用编号为 number 的分组匹配结果

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

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

相关文章

java+mysql教师管理系统

完整源码地址 教师信息管理系统使用命令行交互的方式及数据库连接实现教师信息管理系统&#xff0c;该系统旨在实现教师信息的管理&#xff0c;并根据需要进行教师信息展示。该软件的功能有如下功能 (1)基本信息管理(教师号、姓名、性别、出生年月、职称、学历、学位、教师类型…

【Git 学习笔记】1.3 Git 的三个阶段

1.3 Git 的三个阶段 由于远程代码库后续存在新的提交&#xff0c;因此实操过程中的结果与书中并不完全一致。根据书中 HEAD 指向的 SHA-1&#xff1a;34acc370b4d6ae53f051255680feaefaf7f7850d&#xff0c;可通过以下命令切换到对应版本&#xff0c;并新建一个 newdemo 分支来…

【STM32 RTC实时时钟如何配置!超详细的解析和超简单的配置,附上寄存器操作】

STM32 里面RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域&#xff0c;即在系统复位或从待机模式唤醒后&#xff0c;RTC的设置和时间维持不变。因为系统对后备寄存器和RTC相关寄存器有写保护&#xff0c;所以如果想要对后备寄存器和RTC进行访问&#xff0c;则需要通过操作…

社交媒体优化的智能顾问:Kompas.ai如何提升品牌社交表现

在社交媒体盛行的数字时代&#xff0c;品牌必须在社交平台上保持活跃和互动&#xff0c;以增强品牌社交互动和提升在线可见性。社交媒体优化不仅能够扩大品牌的影响力&#xff0c;还能够加深与消费者的联系。Kompas.ai&#xff0c;作为一款智能社交媒体顾问工具&#xff0c;能够…

【前端项目笔记】7 商品管理

商品管理 效果展示&#xff1a; 在功能开发之前&#xff0c;创建商品列表的子分支 git branch 查看所有分支 git checkout -b goods_list 创建并切换到新分支goods_list git push -u origin goods_list 将新分支goods_list推送到云端仓库origin并命名为goods_list保存 通过…

LLM学习记录

概述 语言模型的发展 语言模型经历过四个阶段的发展&#xff0c;依次从统计语言模型到神经网络语言模型&#xff08;NLM&#xff09;&#xff0c;到出现以 BERT 和 Transformer 架构为代表的预训练语言模型&#xff08;PLM&#xff09;&#xff0c;最终到大型语言模型阶段&am…

竞赛选题 交通目标检测-行人车辆检测流量计数 - 竞赛选题

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测&#xff1f;1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

【Java环境配置过程详解(包括IDEA配置Java)】

目录 一、JDK下载安装 1. 官网下载JDK 2. 本地安装JDK 3. 配置环境变量 4. 验证是否安装成功 ​编辑二、IDEA进行安装下载 1. 官网下载 IDEA 2、IDEA进行Java开发 1. 创建Java项目 2. 程序测试 一、JDK下载安装 1. 官网下载JDK 1&#xff09;官网链接: https://www.o…

PTrade如何获取技术值班?如get_RSI - 相对强弱指标;PTrade量化软件如何获取?

get_RSI - 相对强弱指标 get_RSI(close, n6) 使用场景 该函数仅在回测、交易模块可用 接口说明 获取相对强弱指标RSI指标的计算结果 PTrade是恒生公司开发的一款专业量化软件&#xff0c;部分合作券商可提供&#xff0c;↑↑↑&#xff01; 参数 close&#xff1a;价格…

C语言的数据结构:图的基本概念

前言 之前学过了其它的数据结构&#xff0c;如&#xff1a; 集合 \color{#5ecffd}集合 集合 —— 数据元素属于一个集合。 线型结构 \color{#5ecffd}线型结构 线型结构 —— 一个对一个&#xff0c;如线性表、栈、队列&#xff0c;每一个节点和其它节点之间的关系 一个对一个…

rpm包下载

内网无法下载、选择外网的一台机器下载rpm包 下载后上传rpm包 1、创建下载目录 mkdir /data/asap/test 2、下载能留存包的工具 sudo yum install yum-utils -y 报错就是环境问题没下载成功&#xff0c;我换了个环境正常的机器就可以了 3、下载rpm包到指定目录/data/asa…

一文彻底搞懂Transformer - Input(输入)

一、输入嵌入&#xff08;Input Embedding&#xff09; 词嵌入&#xff08;Word Embedding&#xff09;&#xff1a;词嵌入是最基本的嵌入形式&#xff0c;它将词汇表中的每个单词映射到一个固定大小的向量上。这个向量通常是通过训练得到的&#xff0c;能够捕捉单词之间的语义…

GAMES104:04游戏引擎中的渲染系统1:游戏渲染基础-学习笔记

文章目录 概览&#xff1a;游戏引擎中的渲染系统四个课时概览 一&#xff0c;渲染管线流程二&#xff0c;了解GPUSIMD 和 SIMTGPU 架构CPU到GPU的数据传输GPU性能限制 三&#xff0c;可见性Renderable可渲染对象提高渲染效率Visibility Culling 可见性裁剪 四&#xff0c;纹理压…

如何在《中小学电教》期刊上发表论文?

如何在《中小学电教》期刊上发表论文&#xff1f; 《中小学电教》知网 学术期刊 教育厅25年下半年 3版 ①其他学科 不收甘肃和幼儿园 ②数学、英语、历史、政治&#xff08;道德与法治&#xff09;、音体美、科学学科的稿件 全bao 全bao不带课题 文章需要和信息…

【TS】TypeScript 原始数据类型深度解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript 原始数据类型深度解析一、引言二、基础原始数据类型2.1 boolean2.2 …

数据治理体系建设方案

数据治理体系建设方案 在当前的大数据时代&#xff0c;数据已经成为企业核心资产之一&#xff0c;其管理与治理的重要性愈加凸显。有效的数据治理体系不仅能提升数据质量和数据使用的效率&#xff0c;还能为企业创造更多的商业价值。本文将详细阐述数据治理的重要性、核心要素…

SpringBoot 如何处理跨域请求?你说的出几种方法?

引言&#xff1a;在现代的Web开发中&#xff0c;跨域请求&#xff08;Cross-Origin Resource Sharing&#xff0c;CORS&#xff09;是一个常见的挑战。随着前后端分离架构的流行&#xff0c;前端应用通常运行在一个与后端 API 不同的域名或端口上&#xff0c;这就导致了浏览器的…

AI生成电商模特图应用定制

&#x1f31f; 广州AI生成电商模特图应用定制案例剖析— 触站AI&#xff0c;绘制智能图像的未来 &#x1f680; &#x1f3a8; 触站AI&#xff0c;让创意与智能共绘辉煌 &#x1f3a8;在这座充满创新活力的广州城&#xff0c;触站AI以其尖端AI技术&#xff0c;开启了企业AI图像…

动态代理--通俗易懂

程序为什么需要代理&#xff1f;代理长什么样&#xff1f; 例子 梳理 代理对象(接口)&#xff1a;要包含被代理的对象的方法 ---Star 被代理对象&#xff1a;要实现代理对象(接口) ---SuperStar 代理工具类&#xff1a;创建一个代理&#xff0c;返回值用代理对象&#xff0c…

yolov5实例分割跑通以及C#读取yolov5_Seg实例分割转换onnx进行检测部署

一、首先需要训练yolov5_seg的模型&#xff0c;可以去网上学习&#xff0c;或者你直接用我的&#xff0c; 训练环境和yolov5—7.0的环境一样&#xff0c;你可以直接拷过来用。 yolov5_seg算法 链接&#xff1a;https://pan.baidu.com/s/1m-3lFWRHwg5t8MmIOKm4FA 提取码&…