VOC格式数据集ImageSets/Main文件夹内4个txt生成代码

本文介绍了一个用于VOC数据集划分的Python脚本,该脚本将数据集划分为训练集、验证集和测试集,适用于目标检测任务的数据准备。通过随机采样方式,确保了数据集划分的均衡性和代表性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import random
 
trainval_percent = 0.8
train_percent = 0.85
xmlfilepath = '/home/cxm-irene/People-Date/VOC_person/Annotations'
txtsavepath = '/home/cxm-irene/People-Date/VOC_person/ImageSets/Main'
total_xml = os.listdir(xmlfilepath)
 
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
 
ftrainval = open(txtsavepath+'/trainval.txt', 'w')
ftest = open(txtsavepath+'/test.txt', 'w')
ftrain = open(txtsavepath+'/train.txt', 'w')
fval = open(txtsavepath+'/val.txt', 'w')
 
for i  in list:
    name=total_xml[i][:-4]+'\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)
 
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
<think>好的,我现在需要回答用户关于如何将其他格式数据集转换为适用于YOLOv3训练的VOC格式的问题。用户已经提供了一些相关的引用资料,我需要结合这些资料来构建一个详细的步骤说明。 首先,我需要回顾用户提供的引用内容。引用[5]详细描述了VOC数据集划分和转换为YOLO格式的步骤,虽然用户的问题是关于转换为VOC格式,但可能流程有相似之处。引用[2]提到在YOLOv3训练自己的数据集时需要修改配置文件,这可能涉及到数据准备的步骤。引用[3]和[4]也提到了数据集格式转换的工具和步骤,但可能更多是关于转换为YOLO格式的。不过,这些引用中的一些步骤可能反过来适用于生成VOC格式数据集。 接下来,我需要明确VOC格式的结构。根据已知知识,VOC数据集通常包含以下目录结构: - Annotations:存放XML格式的标注文件 - ImageSets/Main:包含训练集、验证集、测试集的划分文件(如train.txt, val.txt等) - JPEGImages:存放所有图像文件 因此,将其他格式的数据转换为VOC格式需要确保这些目录和文件的结构正确,并且标注文件符合PASCAL VOC的XML标准。 可能的步骤包括: 1. 整理图像文件到JPEGImages目录 2. 将现有标注转换为XML格式并存入Annotations目录 3. 划分数据集生成ImageSets/Main中的文本文件 4. 可能需要调整类别名称的映射 需要参考用户提供的引用中的相关部分,特别是引用[5]中的步骤,虽然它原本是针对VOC转YOLO的,但其中关于数据集划分的部分可能适用。例如,划分训练集、验证集、测试集的脚本可能可以复用,但需要调整输出格式VOC所需的格式。 另外,用户提到引用[3]中的createImageSet.py脚本用于生成训练集和验证集,这可能对划分数据集有帮助。不过需要注意,VOCImageSets/Main中的文件通常只包含图像文件名(不带扩展名),而YOLO可能需要不同的处理方式,所以可能需要调整脚本的输出格式。 关于标注转换,如果原始数据集的标注格式不是VOC的XML,比如可能是YOLO的txt格式或者其他格式,就需要编写脚本将标注转换为XML。每个XML文件需要包含图像尺寸、物体类别和边界框坐标等信息。引用[5]中的voc_label.py可能是一个反向的参考,即从XML转txt,但用户需要的是将其他格式转XML,因此可能需要类似的解析和生成过程。 此外,引用[2]提到修改配置文件以适应类别变化,这可能意味着在转换后的VOC数据集中需要确保类别名称与训练时的配置一致,比如在YOLOv3的配置文件中指定正确的类别数和名称。 总结步骤: 1. 组织目录结构:创建VOCdevkit/VOC2007/下的Annotations、ImageSets/Main、JPEGImages。 2. 将图像复制到JPEGImages,并按VOC命名习惯命名。 3. 转换标注文件到XML格式,保存到Annotations。 4. 使用脚本划分数据集生成train.txt、val.txt等,存入ImageSets/Main。 5. 验证数据集结构是否正确,确保XML标注与图像对应。 可能遇到的问题包括标注格式的转换是否正确,比如边界框的坐标是否从中心点转成左上右下,或者是否需要归一化处理。根据VOC的XML标准,边界框坐标是绝对像素值,所以如果原标注是归一化的(如YOLO格式),需要将其转换为绝对坐标。 另外,可能需要检查类别名称是否一致,比如在转换过程中是否有类别名称的映射错误。例如,用户引用[2]中提到的类别是person、car等,需要确保XML中的类别名称与训练时的类别列表一致。 工具方面,可能需要编写Python脚本来自动化处理这些步骤,例如使用xml.etree.ElementTree来生成XML文件,或者使用现有的库如PascalVOCWriter等。引用中提到的createImageSet.py和voc_label.py可以作为参考,但需要调整以适应生成VOC格式的需求。 最后,可能需要验证转换后的数据集是否可以被YOLOv3正确读取。例如,YOLOv3可能需要特定的路径设置,或者在训练脚本中指定VOC格式的数据路径,这时需要确保目录结构正确,并且配置文件中的路径指向正确的位置。</think>以下是数据集转换为YOLOv3可训练的VOC格式的详细步骤: --- ### **VOC格式数据集结构要求** ``` VOCdevkit └── VOC2007 ├── Annotations # 存放XML标注文件 ├── ImageSets │ └── Main # 存放训练/验证/测试集划分文件 └── JPEGImages # 存放所有图像文件 ``` --- ### **转换步骤详解** #### **1. 组织目录结构** 新建文件夹`VOCdevkit/VOC2007`,并在其下创建三个子目录: - `Annotations`:用于存储XML格式的标注文件 - `JPEGImages`:存放所有图像文件(建议统一为.jpg格式) - `ImageSets/Main`:存放数据集划分文件(如`train.txt`, `val.txt`) ```python import os os.makedirs("VOCdevkit/VOC2007/Annotations", exist_ok=True) os.makedirs("VOCdevkit/VOC2007/JPEGImages", exist_ok=True) os.makedirs("VOCdevkit/VOC2007/ImageSets/Main", exist_ok=True) ``` --- #### **2. 标注文件转换** 将原始标注(如YOLO的txt、COCO的json等)转换为PASCAL VOC的XML格式。每个XML文件需包含: - 图像尺寸(宽、高、通道数) - 物体类别名称 - 边界框坐标(左上角xmin/ymin,右下角xmax/ymax) *示例代码片段:* ```python from xml.etree.ElementTree import Element, SubElement, tostring def create_voc_xml(img_path, boxes, classes, width, height): root = Element("annotation") SubElement(root, "filename").text = os.path.basename(img_path) size = SubElement(root, "size") SubElement(size, "width").text = str(width) SubElement(size, "height").text = str(height) SubElement(size, "depth").text = "3" # 假设为RGB图像 for box, cls in zip(boxes, classes): obj = SubElement(root, "object") SubElement(obj, "name").text = cls bndbox = SubElement(obj, "bndbox") SubElement(bndbox, "xmin").text = str(box[0]) SubElement(bndbox, "ymin").text = str(box[1]) SubElement(bndbox, "xmax").text = str(box[2]) SubElement(bndbox, "ymax").text = str(box[3]) tree = ElementTree(root) xml_path = os.path.join("Annotations", os.path.splitext(img_name)[0] + ".xml") tree.write(xml_path) ``` --- #### **3. 数据集划分** 使用Python脚本划分训练集、验证集和测试集(比例通常为7:2:1),生成对应的txt文件到`ImageSets/Main`目录: ```python import random image_list = [f.split('.')[0] for f in os.listdir("JPEGImages")] # 去除扩展名 random.shuffle(image_list) train_ratio, val_ratio = 0.7, 0.2 train_num = int(len(image_list) * train_ratio) val_num = int(len(image_list) * val_ratio) train_set = image_list[:train_num] val_set = image_list[train_num:train_num+val_num] test_set = image_list[train_num+val_num:] def write_txt(file_path, data): with open(file_path, 'w') as f: for item in data: f.write(f"{item}\n") write_txt("VOCdevkit/VOC2007/ImageSets/Main/train.txt", train_set) write_txt("VOCdevkit/VOC2007/ImageSets/Main/val.txt", val_set) write_txt("VOCdevkit/VOC2007/ImageSets/Main/test.txt", test_set) ``` --- #### **4. 验证数据集** 检查以下关键点: - XML文件与图像文件一一对应 - 边界框坐标未超出图像尺寸 - 类别名称与YOLOv3配置文件`*.names`一致[^2] --- ### **工具与优化建议** 1. **自动化工具**: - 使用`labelImg`工具手动标注或修正边界框 - 使用开源脚本(如GitHub上的`voc-conversion-tools`) 2. **格式验证**: ```bash # 检查XML语法 xmllint --noout Annotations/*.xml ``` --- ### **常见问题解答** **Q1: 如何处理YOLO格式的归一化坐标?** 需将归一化坐标`(cx, cy, w, h)`转换为绝对坐标: $$x_{\text{min}} = (cx - w/2) \times \text{img\_width}$$ $$x_{\text{max}} = (cx + w/2) \times \text{img\_width}$$ *y方向同理* **Q2: 如何确保类别映射正确?** 需维护一个`class_mapping.json`文件,例如: ```json {"0": "person", "1": "car", "2": "bus"} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值