检测之VOC转COCO

2023-11-07

检测系列相关文章参考如下链接:

  1. VOC数据的结构介绍及自定义生成,用labelimg自已标注
  2. VOC标准数据的生成及分析,VOC易用labelimg生成,做为基础的检测数据类型
  3. VOC转YOLO,方便YOLO系列模型使用
  4. VOC转COCO,方便用于COCO map评估
  5. YOLO转VOC,方便使用我们的VOC相关分析和处理代码
  6. COCO转VOC,方便使用我们的VOC相关分析和处理代码
    以上数据格式互转,方便我们处理各种收集的开源数据和自己标记的数据的整合。当然也不是特别的全面,但是工作中常用的主流的格式是包含的。
    觉的有价值的小伙伴可以给点个赞。

深度学习目标检测所用主流的格式是coco ,VOC,可还可以算上yolo,但是前两种更主要,yolo可以通过代码快速转换存到txt文件中。所以前两种的互相转换相当重要,之前的文单中已经写了coco转voc,这里简单写写voc转coco.对于自己的数据集要灵活的去处理,只要改一小部分代码即可写现。

mydata
├── Annotations
├── JPEGImages
├── label_list.txt
├── train.txt
└── valid.txt

2 directories, 3 files

以上是数据处理完成后的目标检测数据信的结构,label_list.txt中存放按首字母排序的类字符串,一个类一行;划分训练和验证集的train.txt和valid.txt则是存放图片的图片咱径和标注文件路径,大概是这样:
mydata/JPEGImages/1.jpg mydata/Annotations/1.xml 一张片一行。

1、获取标注文件及label名与ID对应关系

以上边我们的xml数据集为例(其它也可以,反正是一个文件夹放图片,一个文件夹放标注,还是一个是标签文件.本文整个全流程只提供一个小的参考,由于自定义数据格式多样,只要接照流程能获取相应的要素就可以。

1.1 获取label2id及标注xml路径

import glob

ann_path = "mydata/Annotations" # 相对路径或绝对路径都可以只要能该问到就可以
labels_path = "mydata/label_list.txt"
def voc_get_label_anno(ann_path, labels_path):
    with open(labels_path, 'r') as f:
        labels_str = f.read().split()
    labels_ids = list(range(1, len(labels_str) + 1))
    with open(ann_path,'r') as f:
        all_lines = f.readlines()
    rootdir = os.path.dirname(ann_path)
    ann_paths = [os.path.join(rootdir,i.strip().split(' ')[-1][2:]) for i in all_lines]

    return dict(zip(labels_str, labels_ids)), ann_paths
label2id, ann_paths = voc_get_label_anno("/data/VOCdevkit/train.txt","/data/VOCdevkit/label_list.txt")
label2id
{'screen': 1}
ann_paths[:3]
['/data/VOCdevkit/d1/Annotations/微信截图_20220317104310.xml',
 '/data/VOCdevkit/d1/Annotations/微信截图_20220228173530.xml',
 '/data/VOCdevkit/d1/Annotations/微信截图_20220313163312.xml']

2 xml格式转coco

from tqdm import tqdm
import xml.etree.ElementTree as ET
import json
def voc_xmls_to_cocojson(annotation_paths, label2id, output_dir, output_file):
    output_json_dict = {
        "images": [],
        "type": "instances",
        "annotations": [],
        "categories": []
    }
    bnd_id = 1  # bounding box start id
    im_id = 0
    print('Start converting !')
    for a_path in tqdm(annotation_paths):
        # Read annotation xml
        ann_tree = ET.parse(a_path)
        ann_root = ann_tree.getroot()

        filename = ann_root.findtext('filename')
        assert filename is not None
        img_name = os.path.basename(filename)

        size = ann_root.find('size')
        width = float(size.findtext('width'))
        height = float(size.findtext('height'))

        img_info = {
            'file_name': filename,
            'height': height,
            'width': width,
            'id': im_id
    }
        output_json_dict['images'].append(img_info)

        for obj in ann_root.findall('object'):
            label = obj.findtext('name')
            assert label in label2id, "label is not in label2id."
            category_id = label2id[label]
            bndbox = obj.find('bndbox')
            xmin = float(bndbox.findtext('xmin'))
            ymin = float(bndbox.findtext('ymin'))
            xmax = float(bndbox.findtext('xmax'))
            ymax = float(bndbox.findtext('ymax'))
            assert xmax > xmin and ymax > ymin, "Box size error."
            o_width = xmax - xmin
            o_height = ymax - ymin
            anno = {
                'area': o_width * o_height,
                'iscrowd': 0,
                'bbox': [xmin, ymin, o_width, o_height],
                'category_id': category_id,
                'ignore': 0,
            }
            anno.update({'image_id': im_id, 'id': bnd_id})
            output_json_dict['annotations'].append(anno)
            bnd_id = bnd_id + 1
        im_id += 1

    for label, label_id in label2id.items():
        category_info = {'supercategory': 'none', 'id': label_id, 'name': label}
        output_json_dict['categories'].append(category_info)
    output_file = os.path.join(output_dir, output_file)
    with open(output_file, 'w',encoding='utf-8') as f:
        output_json = json.dumps(output_json_dict,ensure_ascii=False,indent=4)
        f.write(output_json)
output_dir = '/data/VOCdevkit/'
output_file = "instance_train.json"
voc_xmls_to_cocojson(ann_paths, label2id, output_dir, output_file)
Start converting !


100%|██████████| 47102/47102 [00:05<00:00, 7998.80it/s] 

同理验证集也跑一次

label2id, ann_paths = voc_get_label_anno("/data/VOCdevkit/valid.txt","/data/VOCdevkit/label_list.txt")
output_dir = '/data/VOCdevkit/'
output_file = "instance_valid.json"
voc_xmls_to_cocojson(ann_paths, label2id, output_dir, output_file)
Start converting !


100%|██████████| 5237/5237 [00:01<00:00, 4246.70it/s]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测之VOC转COCO 的相关文章

随机推荐

  • NoSQL数据库简介

    NoSQL代表 不仅是SQL 指的是一种数据库管理系统 旨在处理大量非结构化和半结构化数据 与使用具有预定义架构的表格格式的传统SQL数据库不同 NoSQL数据库是无模式的 并且允许灵活和动态的数据结构 NoSQL数据库是必需的 因为它们可
  • 解决:Not creating XLA devices, tf_xla_enable_xla_devices not set

    解决 Not creating XLA devices tf xla enable xla devices not set 实验环境 提示如下 分析原因 解决方法 实验环境 Windows 10 NVIDIA GeForce GTX 105
  • 易经中的一些见解

    曾仕强教授 易经不只是用来趋吉避凶 低端讲法 高端讲法 持正向善 云端讲法 心安理得 求得好死 好死指的是死得其时 死得其所 死得心安理得 趋吉避凶是手段 不是目的 顺自然 重人伦 自作自受 缺角 修治 完人 慎始 反省提升 善终 人生的乐
  • InvokeHelper调用引发异常

    代码原来的实现是 try InvokeHelper catch GetLastError 好吧 引发了异常 但是GetLastError 永远为零 状况了 网上又找不到相关资料 知道自己一步一步地从InvokeHelper跟踪进去 发现里面
  • Spring Cloud OpenFeign 超时设置与开启重试

    超时设置 数据中台HRestful API请求 feign okhttp enabled true client config default 日志打印级别 loggerLevel basic 跨服务接口请求超时 readTimeout 2
  • Windows操作系统截屏快捷键

    1 Print Screen截屏 不只是win10系统独有的 只要在键盘上按下 Print Screen 键 就会截取当前屏幕并储存在剪切板中 进入文档编辑器 文本文档除外 图片处理工具 QQ等聊天窗口进行粘贴 Ctrl V 操作 就可以获
  • os.path函数简要分析

    os模块简介 os模块实现了在路径上的一些有用的功能 os path abspath path 返回一个绝对路径名 import os path abspath os path abspath User home Work print ab
  • 静态代码扫描环境搭建(mac)

    一 安装要求 1 1 软件要求 在进行sonarqube环境安装和搭建前务必确定当前机器和平台配置满足如下要求 机器上需要安装java Oracle JRE 11 或 OpenJDK 11 SonarQube服务器需要的java版本为11
  • 数据分析-数据清洗与整理

    1 数据清洗 第一步 对异常值进行处理 首先 查看原数据库是否一样 然后 查询是否信息录入时出现错误 最后 看看是不是顾客随意填写的信息 第二步 对离群值进行处理 首先 查询是否与原数据库一致 然后 查询是否信息录入错误 最后 判断是否符合
  • Selenium成长之路-18多窗口切换

    在实际测试过程中 打开多窗口是进行测试是很正常的事情 那么在自动化测试中 也需要开启多窗口来进行测试 我们来分析一下 打开多窗口测试的思路 1 打开一个目标网页 2 再次打开新的网页 3 获得所有窗口的 4 循环判断窗口是否为当前窗口 5
  • 2024最强秋招八股文(精简、纯手打)

    7 28日已更新 错误已修改 有错误的地方 欢迎大家留言 目录 一 Java基础篇 1 接口和抽象类的区别 2 重载和重写的区别 3 和equals的区别 4 异常处理机制 5 HashMap原理 6 想要线程安全的HashMap怎么办 7
  • 让idea自动生成类关系图

    学习了解一些开源的工具源码 有时需要了解到程序入口及项目类之间的关系 Idea工具提供了这个功能 以Jmeter5 1 1源码为例 看下RemoteJMeterEngineImpl类的关系图 操作方法 1 定位到RemoteJMeterEn
  • 窗体的扩展样式GWL_EXSTYLE: 用于SetWindowLong

    SetWindowLong Handle GWL EXSTYLE GetWindowLong Handle GWL EXSTYLE or WS EX TRANSPARENT or WS EX LAYERED WS EX ACCEPTFILE
  • 若依框架主子表数据导出问题

    一 使用若依框架导出主子表数据因为返回的数据中含有子表的集合信息 导致excel表格中多出一行标题 二 在Controller层写入导出的方法 三 这边返回的数据是主表的数据 主表数据的实体类中含有子表的集合信息 四 如果不想要子表信息就把
  • 车载无线控制服务器,车载无线视频监控系统应用整体解决方案

    车载视频监控系统整体描述 前言 现如今社会存在一些不良分子扰乱社会治安 盗窃 抢劫 斗殴 民事纠纷 面对这些突发现象 在公安执法 治安巡逻的过程中 很多时候都要随时把过程记录下来 作为记录 取证 证明等各种用途 这时候车载无线视频监控系统起
  • Passing the Message HDU - 3410(单调栈模板题,简单应用)

    题意 现在有n个人站成一行 告诉你每个人的身高 现在每个人都要找到在他左边 比他矮的人中最高的人的位置 同时也要找到 在他右边比他矮的人中最高的人的位置 注意由于他们是站成一行的 所以他们不能越过比他们高的人去看后面的人 也就是说 他只能看
  • IDEA设置忽略idea文件和iml文件

    1 File gt Settings 2 Editor gt File Types 3 红框那里填上 iml idea
  • C语言中的宏定义

    1 简单宏定义 简单的宏定义有如下格式 define指令 简单的宏 define 标识符替换列表 替换列表是一系列的C语言记号 包括标识符 关键字 数 字符常量 字符串字面量 运算符和标点符号 当预处理器遇到一个宏定义时 会做一个 标识符
  • [Android]从零开始的内核编译

    从零开始的内核编译 本教程将基于小米 10S 的内核源码进行实例 其他型号的手机请自行寻找内核源码 具体内容可以参考我的内核编译项目 手机型号查询 1 获取设备 手机 代号 在安卓设备终端 adb shell 上执行 getprop gre
  • 检测之VOC转COCO

    文章目录 1 获取标注文件及label名与ID对应关系 1 1 获取label2id及标注xml路径 2 xml格式转coco 检测系列相关文章参考如下链接 VOC数据的结构介绍及自定义生成 用labelimg自已标注 VOC标准数据的生成