yolo格式数据转换为coco格式

2023-11-10

只需要有图片和yolo格式的标签就可以转换为coco格式的标签
第一步:将yolo格式的标签:classId, xCenter, yCenter, w, h转换为coco格式:classId, xMin, yMim, xMax, yMax格式。coco的id编号从1开始计算,所以这里classId应该从1开始计算。最终annos.txt中每行为imageName, classId, xMin, yMim, xMax, yMax, 一个bbox对应一行

import os
import cv2
 
# 原始标签路径
originLabelsDir = r'G:\data\cell_phone_samples\correct_images_and_labels' \
                  r'\cellphone_labels_cut_person_and_cellphone_total\labels\val'
# 转换后的文件保存路径
saveDir = r'G:\data\cell_phone_samples\correct_images_and_labels' \
          r'\cellphone_labels_cut_person_and_cellphone_total\labels_coco_format\annos.txt'                                                                           
# 原始标签对应的图片路径
originImagesDir = r'G:\data\cell_phone_samples\correct_images_and_labels' \
                  r'\cellphone_labels_cut_person_and_cellphone_total\images\val'
 
txtFileList = os.listdir(originLabelsDir)
with open(saveDir, 'w') as fw:
    for txtFile in txtFileList:
        with open(os.path.join(originLabelsDir, txtFile), 'r') as fr:
            labelList = fr.readlines()
            for label in labelList:
                label = label.strip().split()
                x = float(label[1])
                y = float(label[2])
                w = float(label[3])
                h = float(label[4])
 
                # convert x,y,w,h to x1,y1,x2,y2
                imagePath = os.path.join(originImagesDir,
                                         txtFile.replace('txt', 'jpg'))
                image = cv2.imread(imagePath)
                H, W, _ = image.shape
                x1 = (x - w / 2) * W
                y1 = (y - h / 2) * H
                x2 = (x + w / 2) * W
                y2 = (y + h / 2) * H
                # 为了与coco标签方式对,标签序号从1开始计算
                fw.write(txtFile.replace('txt', 'jpg') + ' {} {} {} {} {}\n'.format(int(label[0]) + 1, x1, y1, x2, y2))
 
        print('{} done'.format(txtFile))

第二步:将标签转换为coco格式并以json格式保存,代码如下。根路径root_path中,包含images(图片文件夹),annos.txt(bbox标注),classes.txt(一行对应一种类别名字), 以及annotations文件夹(如果没有则会自动创建,用于保存最后的json)

import json
import os
import cv2
 
# ------------用os提取images文件夹中的图片名称,并且将BBox都读进去------------
# 根路径,里面包含images(图片文件夹),annos.txt(bbox标注),classes.txt(类别标签),
# 以及annotations文件夹(如果没有则会自动创建,用于保存最后的json)
root_path = r'G:\data\cell_phone_samples\correct_images_and_labels\cellphone_labels_cut_person_and_cellphone_total\labels_coco_format'
# 用于创建训练集或验证集
phase = 'train'    # 需要修正
 
# dataset用于保存所有数据的图片信息和标注信息
dataset = {'categories': [], 'annotations': [], 'images': []}
 
# 打开类别标签
with open(os.path.join(root_path, 'classes.txt')) as f:
    classes = f.read().strip().split()
 
# 建立类别标签和数字id的对应关系
for i, cls in enumerate(classes, 1):
    dataset['categories'].append({'id': i, 'name': cls, 'supercategory': 'mark'})
 
# 读取images文件夹的图片名称
indexes = os.listdir(os.path.join(root_path, 'images'))
 
# 统计处理图片的数量
global count
count = 0
 
# 读取Bbox信息
with open(os.path.join(root_path, 'annos.txt')) as tr:
    annos = tr.readlines()
 
    # ---------------接着将,以上数据转换为COCO所需要的格式---------------
    for k, index in enumerate(indexes):
        count += 1
        # 用opencv读取图片,得到图像的宽和高
        im = cv2.imread(os.path.join(root_path, 'images/') + index)
        height, width, _ = im.shape
 
        # 添加图像的信息到dataset中
        dataset['images'].append({'file_name': index,
                                  'id': k,
                                  'width': width,
                                  'height': height})
 
        for ii, anno in enumerate(annos):
            parts = anno.strip().split()
 
            # 如果图像的名称和标记的名称对上,则添加标记
            if parts[0] == index:
                # 类别
                cls_id = parts[1]
                # x_min
                x1 = float(parts[2])
                # y_min
                y1 = float(parts[3])
                # x_max
                x2 = float(parts[4])
                # y_max
                y2 = float(parts[5])
                width = max(0, x2 - x1)
                height = max(0, y2 - y1)
                dataset['annotations'].append({
                    'area': width * height,
                    'bbox': [x1, y1, width, height],
                    'category_id': int(cls_id),
                    'id': i,
                    'image_id': k,
                    'iscrowd': 0,
                    # mask, 矩形是从左上角点按顺时针的四个顶点
                    'segmentation': [[x1, y1, x2, y1, x2, y2, x1, y2]]
                })
 
        print('{} images handled'.format(count))
 
# 保存结果的文件夹
folder = os.path.join(root_path, 'annotations')
if not os.path.exists(folder):
  os.makedirs(folder)
json_name = os.path.join(root_path, 'annotations/{}.json'.format(phase))
with open(json_name, 'w') as f:
  json.dump(dataset, f)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yolo格式数据转换为coco格式 的相关文章

随机推荐

  • 互联网生活中的隐私保护:用隐私换便利还是花钱护隐私?

    近日 某高校毕业生在校期间窃取学校内网数据 收集全校学生个人隐私信息的新闻引发了人们对互联网生活中个人信息安全问题的再度关注 在大数据时代 算法分发带来了隐私侵犯 在享受消费生活等便捷权利的同时 似乎又有不少个人信息泄露的担忧 用隐私换便利
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Python 函数的说明文档

    视频版教程 Python3零基础7天入门实战视频教程 用 备注说明 然后我们调用函数的地方 鼠标移动上去就能看到函数的说明 提供代码的可读性 def add x y 两数相加函数 param x 两数相加数x param y 两数相加数y
  • matlab中Img(:,:,n)函数的说明

    Img n 中 n可以取1 2 3分别代表img图像的第1 2 3通道 即对应着R G B三种颜色 也就是说 Img 1 是红色分量图像 Img 2 是绿色分量图像 Img 3 是蓝色分量图像 具体也可通过如下一段函数定义可以看出 img
  • zabbix使用手册

    1 添加主机组 将多个主机合并在一个逻辑组件内即为主机组 分组的目的是将同一属性的主机归类 方 便以后管理 例如以业务指标划分组 以系统版本划分组 以应用程序划分组等 主机组中可以包含主机 也可以包含模板 进入zabbix管理界面 单击 配
  • 手把手教你运行yolov6 (小白版教程)

    一 yolov6的介绍 二 yolov6的吐槽 三 yolov6运行详解 前言 自己运行yolov6的完整教程 一 yolov6的介绍 我在此应用美团视觉部官方的说法叙述一下yolov6 YOLOv6 是美团视觉智能部研发的一款目标检测框架
  • 【Linux】VMware安装unbuntu18.04虚拟机-超详细步骤(附镜像文件)

    这次为大家带来的是在VMware创建的虚拟机上安装ubuntu18 04桌面版系统 ubuntu18 04也是目前比较流行的一个linux系统版本 接下来就一起来实操吧 文章目录 一 环境准备 二 创建虚拟机 三 安装虚拟机 一 环境准备
  • 包、模块、函数

    包 模块 函数 一 while循环与使用场景 1 while循环 counter 1 while counter lt 10 counter 1 print counter else print EOF 运行结果 2 3 4 5 6 7 8
  • 邮件发送原理和实现

    邮件发送 拓展 MIME 多用途互联网邮件扩展类型 就是附件 1 准备工作 获取QQ邮箱权限 测试代码 package com jyw import com sun mail util MailSSLSocketFactory import
  • wifi名称可以有空格吗_是真的吗?WiFi名称后面带“5G”,网速会更快?

    要想体验快到飞起的千兆网速 感受全屋覆盖的满分信号 移动全千兆 你值得拥有 千兆5G 无论是旅途中紧急处理工作 文件 图片秒传秒下 还是在外时与家人视频问候 无卡顿低延迟 用千兆5G 网速始终快人一步 千兆宽带 品质生活从品质宽带开始 用千
  • AcWing--756. 蛇形矩阵

    输入两个整数 n 和 m 输出一个 n 行 m 列的矩阵 将数字 1 到 n m 按照回字蛇形填充至矩阵中 具体矩阵形式可参考样例 输入格式 输入共一行 包含两个整数 n 和 m 输出格式 输出满足要求的矩阵 矩阵占 n 行 每行包含 m
  • Linux——使用第三方库链接的方式——动态式

    回顾上文 122条消息 Linux使用第三方库链接的使用方式 静态式 橙予清的zzz 的博客 CSDN博客https blog csdn net weixin 69283129 article details 131414804 spm 1
  • 【qiankun】微前端在项目中的具体使用

    1 安装qiankun npm install qiankun save 2 主应用中注册和配置qiankun 在主应用的入口文件main ts中 引入qiankun的注册方法 import registerMicroApps start
  • java/php/net/python健身房管理系统设计

    本系统带文档lw万字以上 答辩PPT 查重 如果这个题目不合适 可以去我上传的资源里面找题目 找不到的话 评论留下题目 或者站内私信我 有时间看到机会给您发 系统设计 4 1 系统体系结构 健身房管理系统的结构图4 1所示
  • mysql localhost值_jdbc:mysql://localhost:3306/mysql这句话中localhost具体指什么的localhost?能修改么?在哪里配置的?...

    展开全部 jdbc mysql 是指JDBC连接方式 localhost 是指你的本机地址 3306 SQL数据库的端口 jdbc 就是你要连接的32313133353236313431303231363533e59b9ee7ad94313
  • Mysql 8.0修改密码

    1 mysql u root p 原来的密码 进入数据库中 2 show databases 3 use mysql 4 使用下面的语句修改密码 ALTER USER root localhost IDENTIFIED WITH mysql
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    驱动程序无法通过使用安全套接字层 SSL 加密与 SQL Server 建立安全连接 错误 The server selected protocol version TLS10 is not accepted by client prefe
  • STM32初始化结构体变量时成员排序的问题

    平台 STM32F103RCT6 MDK 笔者在调试时发现 结构体不同类型成员的定义顺序对于程序运行过程中的取值可能会产生很大的BUG 开始时定义 输入参数结构体 typedef struct u8 TempRange 温度最大值 floa
  • 日期格式‘YYYY-MM-DD’中的BUG

    1 日期格式 先来看一下日期格式主要有下面三种 US style Euro style RFC 3389 Layout Format string Example US style Dec 29 2019 MM DD YYYY 12 29
  • yolo格式数据转换为coco格式

    只需要有图片和yolo格式的标签就可以转换为coco格式的标签 第一步 将yolo格式的标签 classId xCenter yCenter w h转换为coco格式 classId xMin yMim xMax yMax格式 coco的i