COCO数据集转VOC(提取自己需要的类)

2023-11-01

github:https://github.com/zcc720/COCO2VOC.git

接上篇VOC数据集提取自己需要的类,这次我们依然从coco数据集中提取我们想要的类,并转为voc格式,用于目标检测。

一、去官网下载数据集

train2007

val2007

train2014

val2014

annotations2014

annotations2017

二、安装coco-PythonAPI

linux用户:

pip install cython
git clone https://github.com/cocodataset/cocoapi.git
cd coco/PythonAPI
make

windows用户:

pip install cython
git clone https://github.com/cocodataset/cocoapi.git
cd coco/PythonAPI
python setup.py build_ext --inplace

三、get自己想要的类,制作成voc文件

COCO数据集目标检测中有90类:

classes:
     {1: 'person', 2: 'bicycle', 3: 'car', 4: 'motorcycle', 5: 'airplane', 6: 'bus', 7: 'train', 8: 'truck', 9: 'boat', 10: 'traffic light', 11: 'fire hydrant', 13: 'stop sign', 14: 'parking meter', 15: 'bench', 16: 'bird', 17: 'cat', 18: 'dog', 19: 'horse', 20: 'sheep', 21: 'cow', 22: 'elephant', 23: 'bear', 24: 'zebra', 25: 'giraffe', 27: 'backpack', 28: 'umbrella', 31: 'handbag', 32: 'tie', 33: 'suitcase', 34: 'frisbee', 35: 'skis', 36: 'snowboard', 37: 'sports ball', 38: 'kite', 39: 'baseball bat', 40: 'baseball glove', 41: 'skateboard', 42: 'surfboard', 43: 'tennis racket', 44: 'bottle', 46: 'wine glass', 47: 'cup', 48: 'fork', 49: 'knife', 50: 'spoon', 51: 'bowl', 52: 'banana', 53: 'apple', 54: 'sandwich', 55: 'orange', 56: 'broccoli', 57: 'carrot', 58: 'hot dog',59: 'pizza', 60: 'donut', 61: 'cake', 62: 'chair', 63: 'couch', 64: 'potted plant', 65: 'bed', 67: 'dining table', 70: 'toilet', 72: 'tv', 73: 'laptop', 74: 'mouse', 75: 'remote', 76: 'keyboard',77: 'cell phone', 78: 'microwave', 79: 'oven', 80: 'toaster', 81: 'sink', 82: 'refrigerator', 84: 'book', 85: 'clock', 86: 'vase', 87: 'scissors', 88: 'teddy bear', 89: 'hair drier', 90: 'toothbrush'}
 

想要的类 

​​​​​​​classes_names = ['car', 'bicycle', 'person', 'motorcycle', 'bus', 'truck']
from pycocotools.coco import COCO
import os
import shutil
from tqdm import tqdm
import skimage.io as io
import matplotlib.pyplot as plt
import cv2
from PIL import Image, ImageDraw

#the path you want to save your results for coco to voc
savepath="E:/datasets/COCO/result/"
img_dir=savepath+'images/'
anno_dir=savepath+'Annotations/'
# datasets_list=['train2014', 'val2014']
datasets_list=['train2017']

classes_names = ['car', 'bicycle', 'person', 'motorcycle', 'bus', 'truck']
#Store annotations and train2014/val2014/... in this folder
dataDir= 'E:/datasets/COCO/'

headstr = """\
<annotation>
    <folder>VOC</folder>
    <filename>%s</filename>
    <source>
        <database>My Database</database>
        <annotation>COCO</annotation>
        <image>flickr</image>
        <flickrid>NULL</flickrid>
    </source>
    <owner>
        <flickrid>NULL</flickrid>
        <name>company</name>
    </owner>
    <size>
        <width>%d</width>
        <height>%d</height>
        <depth>%d</depth>
    </size>
    <segmented>0</segmented>
"""
objstr = """\
    <object>
        <name>%s</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>%d</xmin>
            <ymin>%d</ymin>
            <xmax>%d</xmax>
            <ymax>%d</ymax>
        </bndbox>
    </object>
"""

tailstr = '''\
</annotation>
'''

#if the dir is not exists,make it,else delete it
def mkr(path):
    if os.path.exists(path):
        shutil.rmtree(path)
        os.mkdir(path)
    else:
        os.mkdir(path)
mkr(img_dir)
mkr(anno_dir)
def id2name(coco):
    classes=dict()
    for cls in coco.dataset['categories']:
        classes[cls['id']]=cls['name']
    return classes

def write_xml(anno_path,head, objs, tail):
    f = open(anno_path, "w")
    f.write(head)
    for obj in objs:
        f.write(objstr%(obj[0],obj[1],obj[2],obj[3],obj[4]))
    f.write(tail)


def save_annotations_and_imgs(coco,dataset,filename,objs):
    #eg:COCO_train2014_000000196610.jpg-->COCO_train2014_000000196610.xml
    anno_path=anno_dir+filename[:-3]+'xml'
    img_path=dataDir+dataset+'/'+filename
    print(img_path)
    dst_imgpath=img_dir+filename

    img=cv2.imread(img_path)
    if (img.shape[2] == 1):
        print(filename + " not a RGB image")
        return
    shutil.copy(img_path, dst_imgpath)

    head=headstr % (filename, img.shape[1], img.shape[0], img.shape[2])
    tail = tailstr
    write_xml(anno_path,head, objs, tail)


def showimg(coco,dataset,img,classes,cls_id,show=True):
    global dataDir
    I=Image.open('%s/%s/%s'%(dataDir,dataset,img['file_name']))
    #通过id,得到注释的信息
    annIds = coco.getAnnIds(imgIds=img['id'], catIds=cls_id, iscrowd=None)
    # print(annIds)
    anns = coco.loadAnns(annIds)
    # print(anns)
    # coco.showAnns(anns)
    objs = []
    for ann in anns:
        class_name=classes[ann['category_id']]
        if class_name in classes_names:
            print(class_name)
            if 'bbox' in ann:
                bbox=ann['bbox']
                xmin = int(bbox[0])
                ymin = int(bbox[1])
                xmax = int(bbox[2] + bbox[0])
                ymax = int(bbox[3] + bbox[1])
                obj = [class_name, xmin, ymin, xmax, ymax]
                objs.append(obj)
                draw = ImageDraw.Draw(I)
                draw.rectangle([xmin, ymin, xmax, ymax])
    if show:
        plt.figure()
        plt.axis('off')
        plt.imshow(I)
        plt.show()

    return objs

for dataset in datasets_list:
    #./COCO/annotations/instances_train2014.json
    annFile='{}/annotations/instances_{}.json'.format(dataDir,dataset)

    #COCO API for initializing annotated data
    coco = COCO(annFile)
    '''
    COCO 对象创建完毕后会输出如下信息:
    loading annotations into memory...
    Done (t=0.81s)
    creating index...
    index created!
    至此, json 脚本解析完毕, 并且将图片和对应的标注数据关联起来.
    '''
    #show all classes in coco
    classes = id2name(coco)
    print(classes)
    #[1, 2, 3, 4, 6, 8]
    classes_ids = coco.getCatIds(catNms=classes_names)
    print(classes_ids)
    for cls in classes_names:
        #Get ID number of this class
        cls_id=coco.getCatIds(catNms=[cls])
        img_ids=coco.getImgIds(catIds=cls_id)
        print(cls,len(img_ids))
        # imgIds=img_ids[0:10]
        for imgId in tqdm(img_ids):
            img = coco.loadImgs(imgId)[0]
            filename = img['file_name']
            # print(filename)
            objs=showimg(coco, dataset, img, classes,classes_ids,show=False)
            print(objs)
            save_annotations_and_imgs(coco, dataset, filename, objs)

 

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

COCO数据集转VOC(提取自己需要的类) 的相关文章

  • 常用电子元器件简介

    一 电阻器 电阻器 一般情况下也称电阻 是一种阻碍电流在电路中流动的线性元件 也是组成电子电路的主要元件之一 1 电阻器的作用及电路图形符号 1 电阻器的作用 电阻器主要用于控制电路中的电压和电流 除了具有降压 分压 限流和分流作用外 还具
  • cpu的出错概率?

    我今天想到了一个很不懂的问题 cpu执行指令会出错吗 出错的概率是多少 为什么服务器能够不间断的工作很长时间呢 难道cpu指令级的东西不会出错 操作系统怎么避免这些错误呢 2012 5 27 找到一篇文章 http wuyudong blo
  • 无线路由、AP、网桥之区别详解篇

    通过无线上网冲浪 现在已经不是新鲜的事情 随着近一两年无线 网络的飞速发展 从企业到家庭都开始在不同的领域体验着 自由上网 的乐趣 笔者接触无线网络也有一段时间了 经常在一些无线论坛逛游 无论是在现实生活还是在论坛中 总会有朋友不断的问这样
  • 睿智的目标检测60——Tensorflow2 Focal loss详解与在YoloV4当中的实现

    睿智的目标检测60 Tensorflow2 Focal loss详解与在YoloV4当中的实现 学习前言 什么是Focal Loss 一 控制正负样本的权重 二 控制容易分类和难分类样本的权重 三 两种权重控制方法合并 实现方式 学习前言
  • 运放稳定性连载21:电容性负载的稳定性——具有双通道反馈的RISO(2)

    现在 我们必须测量如图10 6所示的Zo 小信号AC开环输出阻抗 该Tina SPICE测试电路将测试空载OPA177的Zo R2和R1以及LT为低通滤波器函数提供了一条AC通道 这样 使得我们能将DC短路和AC开路一起并入反馈电路 DC工
  • faster RCNN 的细节理解

    1 anchors不同的大小但是采用了ROI pooling一样的策略 都映射到3 3的卷积核上 最后通过1 1的卷积核 相当与全连接分成了18类 9个anchors的话 2 分类的时候 reshape 两次 第一次为了softmax分类
  • 注意力机制的分类

    目录 1 什么是注意力机制 2 注意力机制分类 3 代表算法 1 空间域代表算法 2 通道域代表算法 3 混合域代表算法 DANet CBAM 4 注意力机制的应用 1 什么是注意力机制 注意力机制通俗的讲就是把注意力集中放在重要的点上 而
  • 再论人与人的三大关系:生存关系、性关系和经济关系

    黄仁宇在 关系 一文中认为 人类的各种关系之中 以生存的关系 性关系和经济关系最为重要 理想上的工作协作和团队精神 已经不存在 俺做过的几个规模在50人以下的 这说明两个问题 1 小公司的目的不是发展而是不死 然后赚钱 也就是这是一笔买卖而
  • 结束了在MSRA的实习

    从5月到11月底 总共在MSRA渡过了7个月的实习时光 这7个月似乎是我感觉过得最快的7个月 或许是一个人在北京 生活上没有太多的琐事 只有很单纯的工作 于是就有这种时光飞逝的感觉 当然 记忆里面也并非都是工作上的事情 在MSRA还认识来自
  • 力软-获取jfGrid值,并改变值

    问题 页面中jfGrid为动态加载出来的 在js中动态改变cell值之后 需要将jfGrid的值重新赋值一遍 解决 var rowindex 0 jfgrid layout 0 jfGridGet rowdatas rowindex F R
  • 基于ShuffleNetv2-YOLOv4模型的目标检测

    目录 1 引言 摘要 1 1 说明 1 2替换完成的工程请参考gitee 2 网络结构基础 2 1YOLOv3 2 1 YOLOv4算法 2 3 ShuffleNetv2 2 4 替换后的网络结构 3 实验结果 3 1实验环境配置及数据集介
  • STM32f103增加ESP8266模块,通过Wifi用手机TCP服务端远程与STM32通信

    STM32f103增加ESP8266模块 通过Wifi用手机TCP服务端远程与STM32通信 提示 esp8266开启透传模式 连上路由器Wifi 电脑热点 接入STM32串口引脚 另外手机TCP服务端是手机IP地址 串口号 大于8000滴
  • 目标检测算法改进系列之添加SCConv空间和通道重构卷积

    SCConv 空间和通道重构卷积 SCConv 空间和通道重构卷积 的高效卷积模块 以减少卷积神经网络 CNN 中的空间和通道冗余 SCConv旨在通过优化特征提取过程 减少计算资源消耗并提高网络性能 该模块包括两个单元 1 空间重构单元
  • 目标检测中的损失函数:IOU_Loss、GIOU_Loss、DIOU_Loss和CIOU_Loss

    文章目录 前言 1 IOU Loss Intersection over Union Loss 2 GIOU Loss Generalized Intersection over Union Loss 3 DIOU Loss Distanc
  • 仅使用卷积!BEVENet:面向自动驾驶BEV空间的高效3D目标检测

    点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 gt gt 点击进入 自动驾驶之心 BEV感知 技术交流群 论文作者 Yuxin Li 编辑 自动驾驶之心 写在前面 个人理解 BEV空间中的3D检测已成为自动驾驶领域
  • 深度学习目标检测全连接层什么意思

    在深度学习目标检测中 通常我们使用卷积神经网络 Convolutional Neural Network CNN 进行特征提取 CNN 的主要结构包括卷积层和池化层 用于从输入图像中提取特征 然而 为了最终输出目标的类别和位置信息 通常在网
  • 基于改进RoI Transformer的遥感图像多尺度旋转目标检测

    源自 应用光学 作者 刘敏豪 王堃 金睿蛟 卢天 李璋 人工智能技术与咨询 发布 摘 要 旋转目标检测是遥感图像处理领域中的重要任务 其存在的目标尺度变化大和目标方向任意等问题给自动目标检测带来了挑战 针对上述问题 提出了一种改进的RoI
  • 基于改进RoI Transformer的遥感图像多尺度旋转目标检测

    源自 应用光学 作者 刘敏豪 王堃 金睿蛟 卢天 李璋 人工智能技术与咨询 发布 摘 要 旋转目标检测是遥感图像处理领域中的重要任务 其存在的目标尺度变化大和目标方向任意等问题给自动目标检测带来了挑战 针对上述问题 提出了一种改进的RoI
  • 前端基础Vue项目中的插槽使用

    概念 简单理解就是组件内部留一个或多个的插槽位置 可供组件传对应的模板代码进去 插槽的出现 让组件变的更加灵活 1 匿名插槽 父组件
  • 比尔盖茨与萨姆.奥尔特曼的对话及感想

    谈话内容 比尔 盖茨 嘿 萨姆 萨姆 奥尔特曼 嘿 比尔 比尔 盖茨 你好吗 萨姆 奥尔特曼 哦 天哪 这真的太疯狂了 我还好 这是一个非常激动人心的时期 比尔 盖茨 团队情况怎么样 萨姆 奥尔特曼 我想 你知道很多人都注意到了这样一个事实

随机推荐

  • 查找 综述类文献

    转自http blog sina com cn s blog 4ded56360100wlwo html 查找 综述类文献 的方法有三种 第一种 直接用内容关键字 overview survey 这样的词 在各大数据库 google中直接搜
  • (转)Spring项目整合MyBatis-Plus

    目录 1 简介 2 项目整合 2 1 MyBatis的配置 2 2 MyBatis Plus配置 1 简介 MyBatis Plus 是基于Mybatis的一个工具 它是对MyBatis的增强 在其基础上只进行增强 不进行改变 是为了简化M
  • 直流无刷电机(BLDC)的相电流和反电动势是同相的吗?

    在直流无刷电机中 电机转子上的永磁体与定子上的线圈之间存在磁场相互作用 当定子上的线圈被通电时 会产生一个旋转磁场 这个旋转磁场与转子上的永磁体磁场相互作用 从而使得转子开始旋转 同时 在直流无刷电机中 当转子旋转时 会在定子上的线圈中感应
  • ElementUI给表格加上输入框和单位

    关键代码 可以使用判断的语句进行判断添加
  • 垃圾回收机制

    Garbage Collection简称为GC 垃圾回收 工作原理 当程序员创建对象时 GC就开始监视这个对象地址 大小以及使用情况 通常GC采用有向图的方式记录并管理堆中的对象 通过这种方式确定哪些对象是可达的 哪些是不可达的 当确定对象
  • Netty源码------Pipeline详细分析

    Netty源码 Pipeline详细分析 目录 Netty源码 Pipeline详细分析 1 Channel 与ChannelPipeline 2 再探ChannelPipeline 的初始化 3 ChannelInitializer 的添
  • 达梦数据库备份:备份目录冲突.

    备份之前需要先配置归档 其中有一个归档路径 它的作用就是存放归档日志 现在是备份 备份的文件存放地方 不能房这个路径的
  • 云服务器创建虚拟机,云服务器能创建虚拟机吗

    云服务器能创建虚拟机吗 内容精选 换一换 在专属主机资源上创建云服务器失败 可能由以下原因造成 您所选择的云服务器规格不在您已有的专属主机支持范围内 各类型专属主机支持的云服务器规格请参见概述 各类型专属主机支持的云服务器规格请参见概述 您
  • 如何在多个iOSapp里共享数据

    转自 http evgenii com blog sharing keychain in ios 如有侵犯 请来信oiken qq com 使用了KeyAccess这个第三方库保存UUID 原来设计是用了access group 可以多个a
  • 小程序封装网络请求

    由于平台的限制 小程序项目中不支持 axios 而且原生的 wx request API 功能较为简单 不支持拦截器等全局定制的功能 因此 建议在 uni app 项目中使用 escook request miniprogram 第三方包发
  • NMOS和PMOS管 电流方向和应用电路

    1 分辨MOS管的方法 对于NMOS我们看下图中的箭头 都是远离源头 对于PMOS我们看箭头 都是指向源头 P POSITIVE积极的寻找自己的起源 N NEGTIVE消极的远离自己的源头 首先明确一点 S是源极 D是漏极 对于NMOS 载
  • 什么是自动化测试框架?

    无论是在自动化测试实践 还是日常交流中 经常听到一个词 框架 之前学习自动化测试的过程中 一直对 框架 这个词知其然不知其所以然 最近看了很多自动化相关的资料 加上自己的一些实践 算是对 框架 有了一些理解 这篇博客 就聊聊自动化框架的一些
  • 【毕业设计】时间序列的股票预测与分析系统 - python 大数据

    文章目录 1 简介 2 时间序列的由来 2 1 四种模型的名称 3 数据预览 4 理论公式 4 1 协方差 4 2 相关系数 4 3 scikit learn计算相关性 5 金融数据的时序分析 5 1 数据概况 5 2 序列变化情况计算 6
  • C++ 单链表创建、插入和删除

    该代码转载而来 找不到出处了 可能含较多BUG与不住 仅提供一种思路 include
  • 使用MATLAB进行一次和二次规划问题求解

    对于一次问题 可以使用linprog函数 例如 Find x that minimizes f x 5x1 4x2 6x3 subject to x1 x2 x3 20 3x1 2x2 4x3 42 3x1 2x2 30 0 x1 0 x2
  • 攻防世界misc-noviciate(杂项)做题笔记

    攻防世界杂项新手区做题笔记 T1 this is flag T2 pdf T3 如来三十掌 T4 give you flag T5 stegano T6 坚持60s T7 gif T8 掀桌子 T9 ext3 T10 SimpleRAR T
  • react+ts点击列表查看详情

    index tsx import React Component from react type Props history any data any class Index extends React Component
  • 计算机网络之开篇知识

    计算机网络之开篇知识 从短期看来 对于后台开发来说 计算机网络是必不可少的 在各大公司的笔试和面试中也时常出现 屡试不爽 从长期看来 从服务器调优到web架构都需要相当牢固的计算机网络基础 因此掌握基础的计算机网络知识是十分必要的 而入门计
  • zookeeper 客户端提示:zookeeper kejava.lang.IllegalArgumentException: Path must start with / character

    今天第一次使用zookeeper 开源客户端Curator 编写 涉及zookeeper 的代码提示如下错误信息 java lang IllegalArgumentException Path must start with charact
  • COCO数据集转VOC(提取自己需要的类)

    github https github com zcc720 COCO2VOC git 接上篇VOC数据集提取自己需要的类 这次我们依然从coco数据集中提取我们想要的类 并转为voc格式 用于目标检测 一 去官网下载数据集 train20