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_heightnorm_width = box_width / img_widthnorm_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.mzph.cn/news/865356.shtml

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

相关文章

开源之夏|祝贺MatrixOne开源社区项目中选同学!

在本届「开源之夏 2024」活动中&#xff0c;MatrixOne开源社区共计上线3个项目任务&#xff0c;最终有 3位同学成功突围。接下来让我们看看每个项目的详细中选情况&#xff1a; 中选学生公示 项目名称&#xff1a;基于大语言模型的操作系统任务自动识别&#xff0c;拆解&#…

Stable Diffusion教程:如何实现人脸一致

在AI绘画中&#xff0c;一直都有一个比较困难的问题&#xff0c;就是如何保证每次出图都是同一个人。今天就这个问题分享一些个人实践&#xff0c;大家和我一起来看看吧。 一. 有哪些实现方式 方式1&#xff1a;固定Seed种子值。 固定Seed种子值出来的图片人物确实可以做到一…

大语言模型系列-Transformer(二)

Transformer 模型的入门可以从以下几个方面开始&#xff1a; 1. 理解基本概念 序列到序列&#xff08;Sequence-to-Sequence&#xff09;任务&#xff1a;Transformer 模型主要用于这类任务&#xff0c;如机器翻译、文本摘要等。注意力机制&#xff08;Attention Mechanism&a…

PyTorch基础(23)-- Tensor.scatter_()方法

一、前言 本次要介绍的函数为Tensor.scatter_函数&#xff0c;也是PyTorch中常用的函数之一&#xff0c;但遗憾的是&#xff0c;我想在网络上查询该函数的用法时&#xff0c;大部分的文章都是直接给出一个示例&#xff0c;看完之后&#xff0c;其中的原理我还是无法理解&#…

python生成器在读取接口用例中应用解析

Python生成器Generator Python生成器&#xff08;Generator&#xff09;是一种特殊类型的函数&#xff0c;它可以通过yield语句逐步生成值。 生成器提供了一种延迟计算的方式&#xff0c;可以逐步产生结果&#xff0c;而不是一次性生成所有的值。 1、生成器原理&#xff1a; …

2024年【A特种设备相关管理(A4电梯)】试题及解析及A特种设备相关管理(A4电梯)模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;A4电梯&#xff09;试题及解析根据新A特种设备相关管理&#xff08;A4电梯&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将A特种设备相关管理&#xff08;A4电梯&#x…

Mac密室逃脱游戏推荐:Escape Simulator for mac安装包

Escape Simulator 是一款逃生模拟游戏&#xff0c;玩家在游戏中需要寻找线索、解决谜题&#xff0c;以逃离各种房间或环境。这种类型的游戏通常设计有多个关卡或场景&#xff0c;每个场景都有不同的设计和难度。 在 Escape Simulator 中&#xff0c;玩家的目标通常是找到出口或…

东方韵味:红酒与茶道的很好邂逅

在古老的东方&#xff0c;茶道与红酒各自承载着深厚的文化底蕴和历史传承。当这两大传统文化碰撞、交融&#xff0c;仿佛展开了一幅绚烂多姿的画卷&#xff0c;既展现了东方的神秘韵味&#xff0c;又融入了红酒的异国风情。今天&#xff0c;就让我们一同探索这场红酒与茶道的很…

详解微服务应用灰度发布最佳实践

作者&#xff1a;子丑 本次分享是站在 DevOps 视角的灰度发布实践概述&#xff0c;主要内容包括以下四个方面&#xff1a; 第一&#xff0c;灰度发布要解决的问题&#xff1b; 第二&#xff0c;灰度发布的四种典型场景&#xff1b; 第三&#xff0c;如何把灰度发布融入到应…

2024年07月03日 Redis部署方式和持久化

Redis持久化方式&#xff1a;RDB和AOF&#xff0c;和混合式 RDB&#xff1a;周期备份模式&#xff0c;每隔一段时间备份一份快照文件&#xff0c;从主线程Fork一个备份线程出来备份&#xff0c;缺点是会造成数据的丢失。 AOF&#xff1a;日志模式&#xff0c;每条命令都以操作…

Java8环境安装(jdk1.8安装)详细教程

Java 8环境安装&#xff08;jdk1.8安装&#xff09;详细教程 Java 8&#xff08;也称为JDK 1.8&#xff09;&#xff0c;是Oracle公司于2014年3月发布的一个重要的Java语言版本。这个版本自发布以来&#xff0c;因其众多的新特性和改进&#xff0c;被认为是Java语言发展历程中…

itk::ShapedNeighborhoodIterator类C2516问题

错误问题&#xff1a; 1>C:\itk\src-5.3.0\Modules\Core\Common\include\itkShapedNeighborhoodIterator.h(183,1): error C2516: itk::ShapedNeighborhoodIterator<TImage,TBoundaryCondition>::ConstIterator: is not a legal base class 1>C:\itk\src-5.3.0\Mo…

【FFmpeg】avcodec_send_frame函数

目录 1.avcodec_send_frame1.1 将输入的frame存入内部buffer&#xff08;encode_send_frame_internal&#xff09;1.1.1 frame的引用函数&#xff08;av_frame_ref &#xff09;1.1.1.1 帧属性的拷贝&#xff08;frame_copy_props&#xff09;1.1.1.2 buffer的引用函数&#xf…

Appium 使用隐式等待,无法执行代码怎么办?

简介 添加等待是为了确保自动化脚本在执行过程中与应用程序之间的同步和稳定性。 应用程序的响应时间是不确定的&#xff0c;可能存在网络延迟、加载时间、动画效果等因素。如果在执行自动化脚本时没有适当的等待机制&#xff0c;脚本可能会在应用程序还未完成相应操作或加载完…

转让5000万无区域能源公司要求和流程

国家局的公司&#xff0c;也就是无地域无区域性的公司名称。这样的公司是还可以继续注册的&#xff0c;但是想要拥有国家局无区域的名称就不是那么容易的了。总局的企业要求高&#xff0c;也是实力的体现。对字号有保护。所以有很多人都对无地域的名称一直情有独钟。现有一家名…

智能视频监控平台LntonCVS视频监控汇聚平台系统详细介绍

视频监控综合管理平台是专为大中型用户设计的安防管理软件&#xff0c;旨在实现跨区域网络化视频监控的集中管理。该平台集成了信息资源管理、设备管理、用户管理、网络管理和安全管理等多项功能&#xff0c;能够集中管理监控中心的所有视频图像&#xff0c;支持多品牌设备联网…

AI基准测评(下):视频生成、代码能力、逻辑推理,AI是否已经超越人类?

本文作者&#xff1a;王加龙&#xff0c;阿里云高级算法专家 文章推荐 AI实测&#xff5c;基于图像、语言与声音&#xff0c;人工智能是否已经超越了人类&#xff1f; 知乎AI产品“直答”正式上线&#xff01;文心一言4.0 Turbo来袭&#xff0c;可为农民提供专业指导&#x…

Fork/Join框架

什么是 Fork/Join Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架&#xff0c; 是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 分治 我们再通过 Fork 和 Join 这两个单词来理解下 Fork/Join 框架&#xff0c;F…

数据库设计规范(DOC文件)

1 编写目的 2 数据库策略 2.1 数据库对象长度策略 2.2 数据完整性策略 2.3 规范化设计与性能之间的权衡策略 2.4 字段类型的定义与使用策略 3 命名规范 3.1 数据库命名规则 3.2 数据库对象命名的一般原则 3.3 表空间(Tablespace)命名规则 3.4 表(Table)命名规则 3.5…

Java 虚拟机 一

运行时数据区 我们先看线程隔离的数据区 程序计数器 程序计数器&#xff08; Program Counter Register&#xff09; 是一块较小的内存空间&#xff0c; 它可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执…