【目标检测】COCO数据集划分:训练集/验证集/测试集

该文介绍了如何对COCO数据集进行训练、验证和测试集的划分,并使用Python代码示例展示了详细步骤。同时,文章提及了COCO数据集的目标检测标注可视化方法,帮助理解数据集的标注信息。
部署运行你感兴趣的模型镜像

1. COCO数据集划分

import os
import json
import numpy as np
import shutil
 
# 数据集路径
dataset_root = "E:\\MyDataset"
images_folder = os.path.join(dataset_root, "JPEGImages")
annotations_path = os.path.join(dataset_root, "annotations.json")
 
# 输出路径
output_root = os.path.join(dataset_root, "output")
os.makedirs(output_root, exist_ok=True)
 
# 读取annotations.json文件
with open(annotations_path, "r") as f:
    annotations_data = json.load(f)
 
# 提取images, annotations, categories
images = annotations_data["images"]
annotations = annotations_data["annotations"]
categories = annotations_data["categories"]
 
# 随机打乱数据
np.random.shuffle(images)
 
# 训练集,验证集,测试集比例
train_ratio, val_ratio, test_ratio = 0.7, 0.1, 0.2
 
# 计算训练集,验证集,测试集的大小
num_images = len(images)
num_train = int(num_images * train_ratio)
num_val = int(num_images * val_ratio)
 
# 划分数据集
train_images = images[:num_train]
val_images = images[num_train:num_train + num_val]
test_images = images[num_train + num_val:]
 
# 分别为训练集、验证集和测试集创建子文件夹
train_folder = os.path.join(output_root, "train")
val_folder = os.path.join(output_root, "val")
test_folder = os.path.join(output_root, "test")
os.makedirs(train_folder, exist_ok=True)
os.makedirs(val_folder, exist_ok=True)
os.makedirs(test_folder, exist_ok=True)
 
# 将图片文件复制到相应的子文件夹
for img in train_images:
    shutil.copy(os.path.join(images_folder, img["file_name"]), os.path.join(train_folder, img["file_name"]))
 
for img in val_images:
    shutil.copy(os.path.join(images_folder, img["file_name"]), os.path.join(val_folder, img["file_name"]))
 
for img in test_images:
    shutil.copy(os.path.join(images_folder, img["file_name"]), os.path.join(test_folder, img["file_name"]))
 
# 根据图片id分配annotations
def filter_annotations(annotations, image_ids):
    return [ann for ann in annotations if ann["image_id"] in image_ids]
 
train_ann = filter_annotations(annotations, [img["id"] for img in train_images])
val_ann = filter_annotations(annotations, [img["id"] for img in val_images])
test_ann = filter_annotations(annotations, [img["id"] for img in test_images])
 
# 生成train.json, val.json, test.json
train_json = {"images": train_images, "annotations": train_ann, "categories": categories}
val_json = {"images": val_images, "annotations": val_ann, "categories": categories}
test_json = {"images": test_images, "annotations": test_ann, "categories": categories}
 
with open(os.path.join(output_root, "train.json"), "w") as f:
    json.dump(train_json, f)
 
with open(os.path.join(output_root, "val.json"), "w") as f:
    json.dump(val_json, f)
 
with open(os.path.join(output_root, "test.json"), "w") as f:
    json.dump(test_json, f)
 
print("数据集划分完成!")

2. 标注可视化

【目标检测】可视化COCO数据集目标框&多边形标注_ericdiii的博客-优快云博客可视化COCO数据集目标框&多边形标注https://blog.youkuaiyun.com/ericdiii/article/details/130744317?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22130744317%22%2C%22source%22%3A%22ericdiii%22%7D

参考:[1]

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 首先,用户的问题是关于YOLOv9训练集验证集的格式要求。用户提到了之前的一些引用,但这些引用是来自站内,我需要参考它们,但用户说“上述引用仅供参考”,我应该优先考虑用户的查询。 用户查询是:“我想查找YOLOv9训练集验证集的格式 请问YOLOv9训练集验证集的格式要求” 从引用中提取相关信息: - 引用[1]: 提到验证模型的权重和文件,但没有具体格式。 - 引用[2]: 讨论数据集划分,但没有详细格式。 - 引用[3]: 提到data.yaml文件,包含训练数据路径、类别数量、类别名称。具体是:训练数据路径、类别数量、类别名称(顺序要一致)。还提到预训练模型和数据集路径。 - 引用[4]: 讨论将数据集划分训练集验证集测试集,使用xml格式转换为txt格式。 - 引用[5]: 提到在yolov9/data目录下创建fire.yaml文件,内容有path、train、val、test路径,以及Classes names。 关键点:YOLOv9使用YAML配置文件来指定数据集路径和类信息。 根据标准YOLO实践,YOLOv9很可能继承了YOLOv5的格式,因为引用[4]提到YOLOv5。 YOLO数据集格式: - 数据集通常分为图像文件和标签文件。 - 图像文件:JPEG或其他格式的图像。 - 标签文件:通常是.txt文件,每个图像对应一个标签文件,包含对象类别和边界框坐标。 格式:每个标签文件的一行是:class_id x_center y_center width height,其中坐标是归一化的(0到1)。 数据集结构: - 有一个根目录。 - 图像在images子目录,标签在labels子目录。 - YAML文件指定路径和类别。 从引用[3]和[5]: - 创建data.yaml文件。 - 内容包括:path(数据集根目录)、train(训练图像路径)、val(验证图像路径)、test(测试图像路径)、nc(类别数量)、names(类别名称列表)。 例如,从引用[5]:path: data/images/dataset_fire_split, train: train/, val: val/, test: test/, names: 0: fire 训练集验证集的格式是相同的:都需要图像文件和对应的标签文件。 具体格式要求: - 图像文件:支持常见格式如.jpg, .png等。 - 标签文件:.txt文件,每行一个对象,格式为:class_id x_center y_center width height - 数据集目录结构: - 根目录 - images - train(训练图像) - val(验证图像) - test(测试图像)可选 - labels - train(训练标签) - val(验证标签) - test(测试标签)可选 在YAML文件中指定train和val的相对路径。 例如,如果数据集根目录是/path/to/dataset,那么YAML文件可能写成: path: /path/to/dataset train: images/train val: images/val 但标签文件通常存储在labels目录中,模型会自动寻找labels目录下的文件。 在YOLO中,通常假设标签文件存储在labels子目录,对应图像文件的名称。 例如,图像文件:images/train/image1.jpg 标签文件:labels/train/image1.txt YAML文件只指定图像路径,模型会推断标签路径。 从引用[4]提到将XML转换为txt格式,并使用代码划分数据集。 总结格式要求: - YOLOv9训练集验证集的格式基于YOLOv5风格。 - 需要一个YAML配置文件(如data.yaml),指定路径和类别。 - 图像路径:train和val目录包含图像文件。 - 标签路径:对应的labels目录包含.txt标签文件。 - 标签格式:每行 class_id center_x center_y width height,归一化到[0,1]。 回答结构: - 系统级指令:我必须使用$...$或$$...$$ for math, 中文回答, 生成相关问题, 添加引用标识。 - 回答要结构清晰,逐步解决问题。 - 引用标识:在引用段落的末尾自然地添加[^n]。 步骤: 1. 介绍YOLOv9数据集格式的基本要求。 2. 详细说明目录结构和文件格式。 3. 解释YAML配置文件的作用和内容。 4. 提供一个小例子。 5. 生成相关问题。 由于用户提供了引用,我应该参考它们。 在我的回答中,自然地添加引用,例如,提到YAML文件时引用[3]或[5]。 最终回答用中文。 </think> 以下是关于YOLOv9训练集验证集格式要求的详细解释。YOLOv9继承了YOLO系列的惯例(如YOLOv5),其数据集格式主要基于图像文件的组织结构、标签文件的文本格式,以及一个核心的YAML配置文件。训练集验证集的格式本质上是相同的,区别仅在于它们在数据集中的划分位置(如train、val等)。接下来,我将逐步说明格式要求,确保内容清晰可靠。 ### 1. **数据集目录结构** YOLOv9要求数据集以一个根目录组织,包含专门的子目录用于存储图像和标签文件。训练集验证集分别对应不同的子目录。典型的结构如下(以数据集根目录 `dataset/` 为例): ``` dataset/ ├── images/ # 存储所有图像文件 │ ├── train/ # 训练集图像(例如:image1.jpg, image2.jpg) │ │ ├── image1.jpg │ │ └── image2.jpg │ ├── val/ # 验证集图像(例如:image3.jpg, image4.jpg) │ │ ├── image3.jpg │ │ └── image4.jpg │ └── test/ # 测试集图像(可选,验证时常用val) │ └── image5.jpg └── labels/ # 存储所有标签文件(.txt格式) ├── train/ # 训练集标签(与images/train/一一对应) │ ├── image1.txt │ └── image2.txt ├── val/ # 验证集标签(与images/val/一一对应) │ ├── image3.txt │ └── image4.txt └── test/ # 测试集标签(可选) └── image5.txt ``` - **关键点**: - 图像文件:支持常见格式如.jpg、.png等。训练集图像位于 `images/train/`,验证集图像位于 `images/val/`。 - 标签文件:每个图像对应一个.txt文件(例如,`image1.jpg` 对应 `image1.txt`),存储在 `labels/train/`(训练集)和 `labels/val/`(验证集)中。 - 文件名必须一致:如果图像文件名为 `image1.jpg`,则标签文件必须为 `image1.txt`,否则训练或验证时会无法匹配。 - 路径划分数据集通常按比例划分(如70%训练、20%验证、10%测试),可以使用脚本自动完成(引用[4]提到将XML格式转换为txt并划分)[^4]。 ### 2. **标签文件格式(.txt)** 标签文件是纯文本文件,格式简洁但严格。每个标签文件对应一个图像,包含图像中所有对象的边界框信息: - **每行表示一个对象**:格式为 `class_id center_x center_y width height`。 - **坐标归一化**:所有坐标值必须在 $[0,1]$ 范围内(相对于图像宽高归一化)。公式为: - $x_{\text{center}} = \frac{\text{bounding box center x}}{\text{image width}}$ - $y_{\text{center}} = \frac{\text{bounding box center y}}{\text{image height}}$ - $\text{width} = \frac{\text{bounding box width}}{\text{image width}}$ - $\text{height} = \frac{\text{bounding box height}}{\text{image height}}$ - **示例**: - 假设图像宽度为640像素、高度为480像素,一个对象的边界框中心在(320,240),宽100像素、高80像素。归一化后: - center_x = 320 / 640 = 0.5 - center_y = 240 / 480 = 0.5 - width = 100 / 640 ≈ 0.156 - height = 80 / 480 ≈ 0.167 - 标签文件内容:`0 0.5 0.5 0.156 0.167`(其中 `0` 是类别ID)。 - **规则**: - 类别ID从0开始连续编号(例如,如果有3个类别,则ID为0、1、2)。 - 每个值以空格分隔,不能有多余符号。 - 如果图像没有对象,标签文件应为空(但不是必须的)。 ### 3. **YAML配置文件(核心)** YOLOv9需要一个YAML文件(如 `data.yaml`)来定义数据集路径、类别信息和其他元数据。这个文件是训练和验证的关键入口: - **文件位置**:通常存放在YOLOv9工程的 `data/` 目录下(引用[3]和[5]都提到创建data.yaml文件)[^3][^5]。 - **内容结构**: ```yaml path: /path/to/dataset # 数据集根目录绝对路径或相对路径 train: images/train # 训练集图像相对路径(相对于path) val: images/val # 验证集图像相对路径(相对于path) test: images/test # 测试集图像路径(可选,验证时常用val) nc: 2 # 类别数量(number of classes) names: # 类别名称列表(顺序必须与标注时的类别ID一致) 0: fire 1: smoke ``` - **关键参数**: - `train` 和 `val`:指定训练集验证集的图像路径(YOLOv9会自动从对应 `labels/` 目录加载标签文件)。 - `nc`:类别数量必须准确,否则训练会出错。 - `names`:类别名称列表,顺序必须与标签文件中的 `class_id` 一致(例如,如果标注时将“fire”设为ID 0,则 `names` 必须为 `0: fire`)。 - **示例**:引用[5]展示了 `fire.yaml` 文件,其中 `path` 设置为 `data/images/dataset_fire_split`,`train` 和 `val` 分别指向子目录[^5]。 ### 4. **完整流程和注意事项** - **数据集准备步骤**: 1. 收集图像并标注:使用工具如LabelImg生成PASCAL VOC格式(XML)或直接输出YOLO格式标签(.txt)。 2. 划分数据集:使用脚本将数据集划分训练集验证集(和测试集)。常见比例为70%训练、20%验证、10%测试(引用[2]强调划分比例影响模型性能)[^2]。 3. 转换标签格式:如果原始标签是XML(VOC格式),需转换为YOLO的.txt格式(引用[4]提供了转换代码)[^4]。 4. 创建YAML文件:在YOLOv9工程的 `data/` 目录下创建 `data.yaml`,填写路径和类别信息。 5. 训练和验证:启动训练时,YOLOv9会根据YAML文件自动加载训练集验证集数据(引用[1]提到验证时使用权重文件)[^1]。 - **常见错误**: - 路径错误:YAML文件中的 `path` 必须正确指向数据集根目录。 - 类别不匹配:`names` 中的顺序必须与标签文件的 `class_id` 一致。 - 标签格式错误:坐标未归一化或文件命名不一致会导致加载失败。 - **验证集的作用**:验证集用于在训练过程中评估模型泛化能力(如计算精确率、召回率),而不参与参数更新(引用[1]指出验证超参数较少)[^1]。 ### 5. **简单示例** 假设您有一个火灾检测数据集: - 根目录:`/home/user/fire_dataset` - `images/train/` 包含100张图像,`images/val/` 包含20张图像。 - 标签存储在 `labels/train/` 和 `labels/val/`。 - 类别:2类(0: fire, 1: smoke)。 - YAML文件内容: ```yaml path: /home/user/fire_dataset train: images/train val: images/val nc: 2 names: 0: fire 1: smoke ``` ### 相关问题 基于您的查询,我生成了以下相关问题: 1. 如何将PASCAL VOC格式的标注数据转换为YOLOv9兼容的.txt标签格式? 2. YOLOv9训练时如何自定义验证集的比例和划分方法? 3. 在YOLOv9中,如何处理类别不平衡问题以提高验证集上的性能? 如果您有更多细节(如具体数据集或错误信息),我可以提供更针对性的帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值