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

news2024/7/7 18:29:33

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.coloradmin.cn/o/1894578.html

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

相关文章

JavaScript中的this指向

1. 全局环境下的this 在全局环境中&#xff08;在浏览器中是window对象&#xff0c;在Node.js中是global对象&#xff09;&#xff0c;this指向全局对象。 console.log(this window); // 在浏览器中为true console.log(this.document ! undefined); // true&#xff0c;因为…

测试引擎模拟接口实战

在上一章的内容中&#xff0c;我简单介绍了整个微服务的各个子模块&#xff0c;还封装了一些工具类。 当然&#xff0c;若还没完成上次内容的也可以点击右侧的传送门------传送门 EngineApplication 在开发测试引擎模拟接口之前&#xff0c;还需要给xxx-engine创建一个Sprin…

盛元广通打造智慧校园实验室安全管理系统

盛元广通智慧校园实验室安全管理系统以安全为重点&#xff0c;构建由学校、二级单位、实验室组成的三级联动的实验室安全多级管理体系、多类用户角色&#xff0c;内置教育部标准检查表&#xff0c;支撑实验室相关业务过程的智慧管理。实现通过PC端/手机移动端开展检查工作、手机…

上位机图像处理和嵌入式模块部署(mcu项目1:实现协议)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 这种mcu的嵌入式模块理论上都是私有协议&#xff0c;因为上位机和下位机都是自己开发的&#xff0c;所以只需要自己保证上、下位机可以通讯上&…

【SQL】⼀棵 B+树能存储多少条数据

B树的存储容量取决于多个因素&#xff0c;包括树的阶&#xff08;即每个节点的最大子节点数&#xff09;、键的大小和每个节点的容量。计算一棵B树能存储多少条数据&#xff0c;通常需要了解以下参数&#xff1a; 节点大小&#xff1a;一般情况下&#xff0c;节点大小等于数据…

2024Datawhale-AI夏令营——机器学习挑战赛——学习笔记

#ai夏令营#datawhale#夏令营 Day1:入门级demo运行 这个其实比较简单&#xff0c;按照操作来做就行了&#xff0c;特征工程和调参暂时都没有做&#xff0c;后续的才是重头戏。 Day2:正式比赛开始 赛题&#xff1a;数据挖掘赛道——利用机器学习方法根据给定的特征判断PROTACs…

选微调、RAG还是微调+RAG?

RAG技术是一种结合了检索与生成的方法。它通常依赖于两个核心组件&#xff1a;一个大型语言模型&#xff08;如GPT-3&#xff09;和一个检索系统&#xff08;如向量数据库&#xff09;。RAG先使用检索系统从大量数据中检索出相关信息&#xff0c;然后将这些信息提供给语言模型&…

python自动化内存管理

引用 在编程中&#xff0c;引用是指用来标识、访问或操作某个对象的值的标识符或变量。我们可以将引用看作是对象的别名&#xff0c;通过引用可以操作对象&#xff0c;包括读取、修改和传递对象的值。 举例来说&#xff0c;假设我们有一个字符串对象name&#xff0c;我们可以创…

Kafka集群部署(手把手部署图文详细版)

1.1.1 部署zookpeer 在node02下载并解压zookeeper软件包 cd /usr/local wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 或者&#xff1a;scp cat192.168.28.100:/home/cat/zookeeper-3.4.6.tar.gz /tmp&#xff08;注意目录&#xf…

AI:开发者的超级助手,而非取代者

AI&#xff1a;开发者的超级助手&#xff0c;而非取代者 引言 在这个日新月异的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已悄然渗透到我们生活的方方面面&#xff0c;尤其是在软件开发领域&#xff0c;它正以一种前所未有的方式改变着我们的工作方式。作为一名…

【产品经理】订单处理11-订单修改场景梳理

为了应对订单修改的场景&#xff0c;电商ERP系统应该如何设计相应模块&#xff1f; 电商ERP系统&#xff0c;经常遇到需要修改订单的情况&#xff0c;修改订单主要以下几种场景&#xff1a; 一、修改商品 修改商品&#xff0c;包括对正常商品的换货、以及对赠品的增删改。 1…

《米小圈日记魔法》边看边学,轻松掌握写日记的魔法!

在当今充满数字化娱乐和信息快速变迁的时代&#xff0c;如何创新引导孩子们学习&#xff0c;特别是如何培养他们的写作能力&#xff0c;一直是家长和教育者们关注的焦点。今天就向大家推荐一部寓教于乐的动画片《米小圈日记魔法》&#xff0c;该系列动画通过其独特的故事情节和…

web的学习和开发

这个使同步和异步的区别 今天主要就是学了一些前端&#xff0c;搞了一些前端的页面&#xff0c;之后准备学一下后端。 我写的这个项目使百度贴吧&#xff0c;还没有写er图。 先看一下主界面是什么样子的。 这个是主界面&#xff0c;将来后面的主要功能点基本上全部是放在这个上…

电气-伺服(4)CANopen

一、CAN Controller Area Network ,控制器局域网&#xff0c;80年的德国Bosch的一家公司研发可以测量仪器直接的实时数据交换而开发的一款串行通信协议。 CAN发展历史 二、CAN 的osi 模型 CAN特性&#xff1a; CAN 的数据帧 三、CANopen 什么是CANopen CANopen 的网络模型 …

Python28-7.1降维算法之LDA线性判别分析

线性判别分析&#xff08;Linear Discriminant Analysis, LDA&#xff09;是一种用于模式识别和机器学习的分类和降维技术。LDA通过找到能最大化类别间方差和最小化类别内方差的投影方向&#xff0c;实现样本的降维和分类。 LDA的基本思想 LDA的核心思想是通过线性变换将数据…

[数据库原理]事务

如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#xff01; 期末考了冲突可串行化

qt6 获取百度地图(一)

需求分析&#xff1a; 要获取一个地图&#xff0c; 需要ip 需要根据ip查询经纬度 根据经纬度查询地图 另外一条线是根据输入的地址 查询ip 根据查询到的ip查地图‘ 最后&#xff0c;要渲染地图 上面这这些动作&#xff0c;要进行http查询&#xff1a; 为此要有三个QNet…

科比老大职业生涯数据预测(基于随机森林模型)

1.实验背景 科比布莱恩特&#xff0c;作为NBA历史上最伟大的篮球运动员之一&#xff0c;他的职业生涯充满了无数精彩瞬间。 科比于1996年以13顺位的选秀身份进入联盟&#xff0c;一生都效力于洛杉矶湖人队。于2016年宣布退役&#xff0c;职业生涯获奖无数&#xff0c;5次NBA总…

暑假学习DevEco Studio第2天

学习目标&#xff1a; 掌握页面跳转 学习内容&#xff1a; 跳转页面 创建页面&#xff1a; 在“project”窗口。打开“entry>src>main>ets”,右击“pages”&#xff0c;选择“New>ArkTS File”,命名“Second”&#xff0c;点击回车键。 在页面的路由&#xff0…

8.ApplicationContext常见实现

ClassPathXmlApplicationContext 基于classpath下xml格式的配置文件来创建 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…