yolo格式数据集转换到coco格式

news/2025/1/6 8:45:17/

在这里插入图片描述

YOLO格式数据集转换为COCO格式需要处理图像、标注文件以及生成COCO格式的JSON文件。以下Python代码实现,考虑了各种可能的因素,包括图像尺寸、类别映射、标注框的归一化处理等。


YOLO_6">YOLO格式说明

  • 标注文件:每个图像对应一个.txt文件,每行格式为 class_id x_center y_center width height,其中坐标和尺寸是归一化的(相对于图像宽度和高度)。
  • 图像文件:通常与标注文件同名,格式为 .jpg.png
  • 类别文件classes.txt,每行一个类别名称。

COCO格式说明

  • JSON 文件:包含以下主要字段:
    • images: 图像信息(id、文件名、宽度、高度)。
    • annotations: 标注信息(id、图像id、类别id、边界框、面积等)。
    • categories: 类别信息(id、类别名称)。

转换代码

import os
import json
import cv2
from tqdm import tqdmdef yolo_to_coco(yolo_dir, output_json_path):"""将YOLO格式数据集转换为COCO格式。:param yolo_dir: YOLO格式数据集的根目录,包含images、labels文件夹和classes.txt。:param output_json_path: 输出的COCO格式JSON文件路径。"""# 路径设置images_dir = os.path.join(yolo_dir, 'images')labels_dir = os.path.join(yolo_dir, 'labels')classes_file = os.path.join(yolo_dir, 'classes.txt')# 检查路径是否存在if not os.path.exists(images_dir) or not os.path.exists(labels_dir):raise FileNotFoundError("images 或 labels 文件夹不存在!")if not os.path.exists(classes_file):raise FileNotFoundError("classes.txt 文件不存在!")# 读取类别with open(classes_file, 'r') as f:categories = [line.strip() for line in f.readlines()]categories = [{"id": i + 1, "name": name} for i, name in enumerate(categories)]# 初始化COCO数据结构coco_data = {"images": [],"annotations": [],"categories": categories}# 遍历图像image_id = 1annotation_id = 1for image_name in tqdm(os.listdir(images_dir)):if not image_name.endswith(('.jpg', '.png', '.jpeg')):continue# 读取图像尺寸image_path = os.path.join(images_dir, image_name)image = cv2.imread(image_path)height, width, _ = image.shape# 添加图像信息coco_data["images"].append({"id": image_id,"file_name": image_name,"width": width,"height": height})# 读取对应的标注文件label_name = os.path.splitext(image_name)[0] + '.txt'label_path = os.path.join(labels_dir, label_name)if not os.path.exists(label_path):continuewith open(label_path, 'r') as f:lines = f.readlines()# 解析标注for line in lines:parts = line.strip().split()if len(parts) != 5:continueclass_id, x_center, y_center, bbox_width, bbox_height = map(float, parts)# 将归一化坐标转换为绝对坐标x_center *= widthy_center *= heightbbox_width *= widthbbox_height *= height# 计算边界框的左上角坐标x_min = x_center - (bbox_width / 2)y_min = y_center - (bbox_height / 2)# 计算面积area = bbox_width * bbox_height# 添加标注信息coco_data["annotations"].append({"id": annotation_id,"image_id": image_id,"category_id": int(class_id) + 1,  # YOLO类别从0开始,COCO从1开始"bbox": [x_min, y_min, bbox_width, bbox_height],"area": area,"iscrowd": 0})annotation_id += 1image_id += 1# 保存为COCO格式的JSON文件with open(output_json_path, 'w') as f:json.dump(coco_data, f, indent=4)print(f"转换完成!COCO格式文件已保存到: {output_json_path}")# 示例调用
yolo_dir = "path/to/yolo_dataset"  # YOLO数据集根目录
output_json_path = "output/coco_format.json"  # 输出的COCO格式JSON文件路径
yolo_to_coco(yolo_dir, output_json_path)

代码说明

  1. 路径检查:确保 imageslabels 文件夹和 classes.txt 文件存在。
  2. 类别映射:从 classes.txt 读取类别名称,并映射到COCO格式的 categories
  3. 图像处理:遍历图像文件夹,读取每张图像的尺寸,并添加到 images 字段。
  4. 标注处理
    • 解析YOLO格式的 .txt 文件。
    • 将归一化的边界框坐标转换为绝对坐标。
    • 计算边界框的面积。
    • 添加到 annotations 字段。
  5. 保存JSON:将生成的COCO格式数据保存为JSON文件。

注意事项

  1. 图像格式:代码支持 .jpg.png.jpeg 格式的图像。如果需要支持其他格式,可以修改代码。
  2. 类别IDYOLO格式的类别ID从0开始,而COCO格式从1开始,因此在转换时需要加1。
  3. 边界框归一化YOLO格式的边界框坐标是归一化的,需要乘以图像尺寸转换为绝对坐标。
  4. 空标注文件:如果某个图像没有对应的标注文件,代码会跳过该图像。

示例目录结构

yolo_dataset/
├── images/
│   ├── image1.jpg
│   ├── image2.jpg
├── labels/
│   ├── image1.txt
│   ├── image2.txt
└── classes.txt

运行代码后,生成的COCO格式JSON文件可以直接用于训练COCO格式的目标检测模型。


http://www.ppmy.cn/news/1560662.html

相关文章

WPF自定义任务栏缩略图

任务栏缩略图预览 在Windows7系统上,微软首次推出任务栏缩略图预览功能。 当鼠标划会任务栏上的程序时,会打开一个预览窗口,可以对整个窗口内容进行预览。 效果如下: 在后面的Windows 8/8.1/10/11系统上,都延续了这…

【MyBatis-Plus 条件构造器】全面解析 Wrapper

在 MyBatis-Plus 中, 条件构造器 是一个强大的工具,能够帮助我们灵活地构建 SQL 查询条件,而无需手写繁琐的 SQL 语句。本文将从基础到高级,带你全面了解条件构造器的使用方法及其链式构造能力。 一、什么是条件构造器&#xff1f…

vim、watch、cp和mv

一、vim使用技巧 vim主配置文件:/etc/vimrc (对所有用户都生效) vim子配置文件:vim ~/.vimrc (只对当前用户生效) 可写入: set nu 显示行号 ts2 tab键长度为两个空格(默认为8个空格…

【Rust练习】26.Package and Crate

练习题来自:https://practice-zh.course.rs/crate-module/crate.html 建议在命令行下操作完成本节内容,Windows 11/10 首选 Windows 终端,好看,支持渲染中文字体,缺点是功能太少了;其次推荐 mobaxterm&…

pytorch中nn.Conv2d详解及参数设置原则

文章目录 基础参数1. in_channels (输入通道数)2. out_channels (输出通道数)3. kernel_size (卷积核大小)4. stride (步幅)5. padding (填充)6. dilation (膨胀)7. groups (分组卷积)8. bias (偏置) 如何设置参数?1. **in_channels 和 out_channels(输入…

5G终端串口AT命令 FM650 常用命令

5G终端串口AT命令 FM650 常用命令 5G终端串口AT命令 FM650 常用命令 #状态查询 MODULE_PORT/dev/ttyUSB0echo -e "ATE0\r\n" > $MODULE_PORT echo -e "ATGTUSBMODE?\r\n" > $MODULE_PORT echo -e "ATGTRAT?" > $MODULE_PORT ec…

【JMeter详解】

JMeter详解 Apache JMeter 是一个开源的、100%纯Java应用程序,设计用于负载测试和性能测量。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。JMeter可以用来对静态和动态资源(如静态文件、Servlets、Perl脚本、Java对象、数据…

多分类的损失函数

在多分类任务中,常用的损失函数能够衡量模型输出的类别分布与目标类别之间的差异,帮助模型学习更准确的分类能力。以下是多分类任务中常用的损失函数: 1. 交叉熵损失(Cross-Entropy Loss) 公式: CrossEntropyLoss = − 1 N ∑ i =