首页 > 编程语言 >【Python快速入门和实践011】Python常用脚本-目标检测之VOC格式转YOLO格式脚本

【Python快速入门和实践011】Python常用脚本-目标检测之VOC格式转YOLO格式脚本

时间:2024-08-15 11:55:25浏览次数:12  
标签:xml 脚本 Python YOLO 图像 格式 txt 标注

一、数据集介绍

        NEU-DET 数据集是由东北大学(Northeastern University, 简称 NEU)发布的一个用于钢材表面缺陷检测的数据集。这个数据集特别设计用于支持和促进工业领域中的缺陷检测研究。

NEU-DET 数据集的一些主要特点包括:

  • 多样性和复杂性:数据集包含了多种类型的钢材表面缺陷,如裂纹、划痕、凹坑、斑点等。
  • 高质量标注:每张图像都经过仔细标注,包括缺陷的位置、大小以及类别等详细信息。
  • 应用场景:主要用于训练和评估计算机视觉模型,特别是用于缺陷检测的任务,可以用于训练目标检测模型。
  • 规模:虽然具体的数据集大小没有详细说明,但作为一个专业研究数据集,它应该包含足够的图像样本以支持深度学习模型的训练。

二、VOC格式介绍

        VOC(Visual Object Classes)格式是一种广泛使用的图像注释标准,常用于计算机视觉任务,如物体检测、分类和分割。VOC 数据集最初是由 Pascal Visual Object Classes Challenge 发起的,该挑战赛自 2005 年开始举办,旨在推动计算机视觉技术的发展。

VOC 数据集的特点

  • 标准化:VOC 格式定义了一套标准化的数据结构和文件组织方式,使得不同的研究人员能够方便地共享和使用相同的数据集。
  • 多样化:VOC 数据集通常包含多个类别的物体,如人、车、动物等。
  • 详细标注:每个图像都附有详细的标注信息,包括物体的位置(用边界框表示)、类别标签、分割掩码等。
  • 评估工具:VOC 数据集提供了用于评估检测算法性能的工具,包括计算平均精度(Average Precision, AP)等指标的方法。

数据集组成

  • 图像:每个数据集中包含一系列 JPEG 图像。
  • 标注文件:对于每个图像,有一个 XML 文件存储了图像中所有物体的标注信息。
    • XML 文件结构
      • <annotation>:根节点。
      • <filename>:图像文件名。
      • <folder>:图像所在的文件夹。
      • <source>:数据源信息。
      • <size>:图像尺寸信息,包括宽度、高度和通道数。
      • <segmented>:是否进行了分割标注。
      • <object>:每个物体的标注信息。
        • <name>:物体类别名称。
        • <pose>:物体的姿态(可选)。
        • <truncated>:物体是否被截断。
        • <difficult>:物体是否难以检测。
        • <bndbox>:物体的边界框坐标。
          • <xmin><ymin><xmax><ymax>:边界框的四个角坐标。

VOC格式如下:

<?xml version="1.0" encoding="utf-8"?>
	<annotation>
		<folder>driving_annotation_dataset</folder>
		<filename>crazing_1.jpg</filename>
		<size>
			<width>200</width>
			<height>200</height>
			<depth>3</depth>
		</size>
		<object>
			<name>crazing</name>
			<pose>Unspecified</pose>
			<truncated>0</truncated>
			<difficult>0</difficult>
			<bndbox>
				<xmin>3</xmin>
				<ymin>3</ymin>
				<xmax>194</xmax>
				<ymax>195</ymax>
			</bndbox>
		</object>
	</annotation>

三、YOLO格式介绍

        YOLO (You Only Look Once) 格式是一种广泛应用于目标检测任务的数据标注格式。这种格式非常简洁且易于处理,非常适合用于训练和评估基于 YOLO 的目标检测模型。

YOLO 格式的特点

  • 简洁性:YOLO 格式非常简单,每个标注文件只包含一个文本文件,其中包含图像中每个目标对象的标注信息。
  • 标准化:YOLO 格式定义了一个统一的数据结构,便于数据的处理和模型的训练。
  • 高效性:由于其简洁性,YOLO 格式非常适合大规模数据集的处理和模型训练。

数据集组成

  • 图像:每个数据集包含一系列 JPEG 或 PNG 格式的图像文件。
  • 标注文件:对于每个图像,都有一个对应的文本文件(通常是 .txt 扩展名)来存储标注信息。

标注文件结构

每个标注文件(.txt 文件)包含一行或多行文本,每一行对应图像中的一个目标对象。每行文本包含以下信息:

  • 类别编号:目标对象所属类别的编号(从 0 开始)。
  • 中心点 x 坐标:目标对象中心点的 x 坐标,相对于图像宽度归一化。
  • 中心点 y 坐标:目标对象中心点的 y 坐标,相对于图像高度归一化。
  • 宽度:目标对象的宽度,相对于图像宽度归一化。
  • 高度:目标对象的高度,相对于图像高度归一化。

YOLO格式如下:

0 0.45 0.50 0.35 0.40
1 0.80 0.75 0.10 0.15

这表示:

  • 第一个对象属于类别 0,在图像中的位置为 (0.45, 0.50),宽度为 0.35,高度为 0.40。
  • 第二个对象属于类别 1,在图像中的位置为 (0.80, 0.75),宽度为 0.10,高度为 0.15。

使用场景

  • 训练模型:用于训练 YOLO 及其变体的目标检测模型。
  • 评估性能:用于评估模型的性能,通过计算平均精度(mAP)等指标来衡量模型的准确性。

获取方式

  • 创建自己的数据集:可以自己收集图像并使用相应的工具对其进行标注,生成 YOLO 格式的标注文件。
  • 现成的数据集:许多开源数据集已经提供了 YOLO 格式的标注文件,可以在 GitHub 或其他数据集共享平台上找到它们。

四、VOC转YOLO格式脚本

import xml.etree.ElementTree as ET
import os


# 定义函数将坐标转换为YOLO格式
def convert(size, box):
    x_center = (box[0] + box[1]) / 2.0
    y_center = (box[2] + box[3]) / 2.0
    x = x_center / size[0]
    y = y_center / size[1]
    w = (box[1] - box[0]) / size[0]
    h = (box[3] - box[2]) / size[1]
    return (x, y, w, h)


# 定义函数将VOC格式的XML标签文件转换为YOLO格式的TXT标签文件
def convert_annotation(xml_files_path, save_txt_files_path, classes):
    xml_files = os.listdir(xml_files_path)
    for xml_name in xml_files:
        xml_file = os.path.join(xml_files_path, xml_name)
        base_name = os.path.splitext(xml_name)[0]  # 获取文件名的基本名称
        out_txt_path = os.path.join(save_txt_files_path, base_name + '.txt')
        out_txt_f = open(out_txt_path, 'w')
        tree = ET.parse(xml_file)
        root = tree.getroot()
        size = root.find('size')
        w = int(size.find('width').text)
        h = int(size.find('height').text)

        for obj in root.iter('object'):
            difficult = obj.find('difficult').text
            cls = obj.find('name').text
            if cls not in classes or int(difficult) == 1:
                continue
            cls_id = classes.index(cls)
            xmlbox = obj.find('bndbox')
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
                 float(xmlbox.find('ymax').text))
            bb = convert((w, h), b)
            out_txt_f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


# 主程序入口
if __name__ == "__main__":
    # 1、需要转化的类别
    classes = [ 'rolled-in_scale', 'patches','crazing','pitted_surface','inclusion','scratches' ]  # 根据自己的类别名称及种类自行更改
    # 2、VOC格式的XML标签文件路径
    xml_files1 = r'E:\pythonProject\pythonProject\NEU-DET\xmls'
    # 3、转化为YOLO格式的TXT标签文件存储路径
    save_txt_files1 = r'E:\pythonProject\pythonProject\NEU-DET\txt'

    convert_annotation(xml_files1, save_txt_files1, classes)

转换代码只需要改变你数据集的类别,然后指定xml和保存yolo格式的txt文件夹路径即可。

标签:xml,脚本,Python,YOLO,图像,格式,txt,标注
From: https://blog.csdn.net/2403_83044722/article/details/141174809

相关文章

  • 40、Python之面向对象:扩展的对象属性解析顺序(描述符 + MRO)
    引言在上一篇文章中,我们简单回顾了Python中在继承语境下的属性解析顺序,同时补充了能够控制、影响属性解析的3个函数/方法(2个魔术方法+1个内置函数),相信对Python中属性的解析,相较于MRO,有了更进一步的认识。今天这篇文章中,我们将考虑属性描述符存在的情况下,对于Python中的属性......
  • python之numpy (5 分割和复制)
    分割分割指将矩阵分割为几个小部分,以便于后续的计算需要。splitimportnumpyasnpm=np.random.random((3,3))print(m)sp=np.split(m,3,axis=0)ssp=np.split(m,3,axis=1)print(sp,ssp,sep='\n')[[0.373247510.933194940.18961048][0.814330810.377225750.00708......
  • python之numpy(4 选择数据及合并)
    选择数据importnumpyasnpm=np.random.random((3,3))print(m)print(m[0],m[1][1],sep='\n')print(m[1,1])print(m[1,:])print(m[:,1])结果:[[0.25960570.047399260.76332494][0.865032270.290489970.79591841][0.50535280.201822340.19601046]][......
  • windows保姆级的pycharm+anaconda搭建python虚拟环境
    (一)pycharm安装1.下载(1)从官网下载 ,一般来说选择社区版就够用了。我这里选择2024.1.6的windows版本OtherVersions-PyCharmGetpastreleasesandpreviousversionsofPyCharm.https://www.jetbrains.com/pycharm/download/other.html 2.安装(1)双击下载好的pycharm安......
  • PAT-1006 换个格式输出整数 python实现
    1.题目本题较为简单,只需要获取数字的各位数再分别按要求拼接到一起即可。2.代码如下  """输入:23423输出:BBSSS1234SS123"""#本题较为简单,只需要获取数字的各位数再分别按要求拼接到一起即可n=int(input())#获取输入的数字r......
  • JS脚本内追加的标签无法触发事件问题处理
    通过JS追加的标签无法触发事件时,就把事件挂载给这个标签父级标签,如下。//后追加标签事件不生效,挂载在父级标签varparentElement=document.getElementById('layout_detail_toolbar_0');parentElement.addEventListener('change',function(event){letta......
  • mp3转换软件哪个好?5个工具助你轻松转换音频格式
    前阵子我真差点被自己的车载音响整破防了,花重金在某音乐平台上下载的歌曲,竟因格式不兼容而无法播放。为了不让自己的投资白白浪费,连夜找了数十种在线mp3转换器,最终才成功解决了播放问题。所以为了防止大家在音频格式转换的过程中遇到不必要的麻烦,下面将为大伙推荐5个转换工具......
  • python图片处理
    设置图片像素fromPILimportImagedefset_image(path,width=280):"""设置图片像素"""#打开图片image=Image.open(path)#原来大小original_width,original_height=image.size#设置新的图片大小new_width,new_height=w......
  • 时间数据格式出现time data does not match format valueError
    合并文件夹中多个文件数据后,出现ValueError:timedata'19970004'doesnotmatchformat'%Y%m%d'(match)首先,应该查看数据,是数据是否格式正确,我的错误来源于将多个文件合并后,多行标题也在不同的位置进行合并,导致本应该是数据的一行成为了标题行解决方法1:查看数据是否存在......
  • java语言,MySQL数据库;电影推荐网站 30760(免费领源码)计算机毕业设计项目推荐万套实战教
    摘 要随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的电影推荐网站;电影推荐网站的管理工作系统化、规范化,也会提高平台形象,提高管理效率。本电影推荐网站是针对目前电影推荐网站的实际需求,从实际工作出发,对过去的电影......