COCO数据集格式(详解)及COCO标注可视化。json转COCO等代码

2023-11-19

coco数据集JSON文件格式分为一下几个字段。

{
    "info": info, # dict
     "licenses": [license], # list ,内部是dict
     "images": [image], # list ,内部是dict
     "annotations": [annotation], # list ,内部是dict
     "categories": # list ,内部是dict
 }

注意 :对于深度学习训练,实际有用的字段,只有以下三个字段。

"images": [image], # list ,内部是dict
     "annotations": [annotation], # list ,内部是dict
     "categories": # list ,内部是dict

info字段内的内容

"info":{#数据信息描述
        "description":"COCO 2017 Dataset",# 数据描述
        "url":"http://*****.org",#下载地址
        "version":"1.0",#版本
        "year":"2017",#年份
        "contributor":"COCO Consortium",#提供者
        "data_created":"2017/09/01",#创建日期}

这个字段可以忽略,可以为空。

licenses字段

"licenses":[
            {
             'url': 'http://creativecommons.org/licenses/by-nc-sa/2.0/',
             'id': 1,
             'name': 'Attribution-NonCommercial-ShareAlike License'
            }
            ....
            ....
            ]

这个字段可以忽略,可以为空。

images

"images": [
            {
             "license":4 #可以忽略
            "file_name":000.jpg #可以忽略
            "coco_url":"http://****" #可以忽略
             "id": 1, 
             "file_name": "000.tif", 
             "width": 48.0, 
             "height": 112.0
             "date_captured":"2022-02-02 17:02:02" #可以忽略
             "flickl_url":"http://****" #可以忽略
            }
            ...
            ...
            ]

annotations

这个字段里面都是有用信息

categories

这个里面也是有用的信息

 将一个大的json文件生成只有一张图片的json:

from __future__ import print_function
from pycocotools.coco import COCO
import os, sys, zipfile
import urllib.request
import shutil
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
import json
json_file='/media/fire/d/share_data/datasets/coco/annotations/person_keypoints_val2017.json' #
# Object Instance 类型的标注
# person_keypoints_val2017.json  
# Object Keypoint 类型的标注格式
# captions_val2017.json  
# Image Caption的标注格式
data=json.load(open(json_file,'r'))
data_2={}
data_2['info']=data['info']
data_2['licenses']=data['licenses']
data_2['images']=[data['images'][0]] # 只提取第一张图片
data_2['categories']=data['categories']
annotation=[] # 通过imgID 找到其所有对象
imgID=data_2['images'][0]['id']
for ann in data['annotations']:
    if ann['image_id']==imgID:
        annotation.append(ann)
data_2['annotations']=annotation # 保存到新的JSON文件,便于查看数据特点
json.dump(data_2,open('/media/fire/d/share_data/datasets/coco/annotations/test_person_keypoints_val2017.json','w'),indent=4) # indent=4 更加美观显示

二、COCO数据集可视化

from __future__ import print_function
from pycocotools.coco import COCO
import os, sys, zipfile
import urllib.request
import shutil
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
pylab.rcParams['figure.figsize'] = (8.0, 10.0)
annFile='/media/fire/d/share_data/datasets/coco/annotations/person_keypoints_val2017.json'
coco=COCO(annFile) # display COCO categories and supercategories
cats = coco.loadCats(coco.getCatIds())
nms=[cat['name'] for cat in cats]
print('COCO categories: \n{}\n'.format(' '.join(nms)))
nms = set([cat['supercategory'] for cat in cats])
print('COCO supercategories: \n{}'.format(' '.join(nms)))
# imgIds = coco.getImgIds(imgIds = [324158])
imgIds = coco.getImgIds()
img = coco.loadImgs(imgIds[0])[0]
dataDir = '/media/fire/d/share_data/datasets/coco'
dataType = 'val2017'
I = io.imread('%s/%s/%s'%(dataDir,dataType,img['file_name']))
#plt.axis('off')
plt.imshow(I)
plt.show()

显示图片

 加载肢体关键点:

catIds=[]
for ann in coco.dataset['annotations']:
    if ann['image_id']==imgIds[0]:
        catIds.append(ann['category_id'])
plt.imshow(I);
plt.axis('off')
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
print(anns)
coco.showAnns(anns)
plt.imshow(I); plt.axis('off'); plt.show()

加载instances mask:

coco = COCO("/media/fire/d/share_data/datasets/coco/annotations/instances_val2017.json")

img_ids = coco.getImgIds()
print(len(img_ids))
cat_ids = []
for ann in coco.dataset["annotations"]:
    if ann["image_id"] == img_ids[0]:
        cat_ids.append(ann["category_id"])
ann_ids = coco.getAnnIds(imgIds=img_ids[0], catIds = cat_ids)
ann_ids2 = coco.getAnnIds(imgIds=img_ids[0], catIds = cat_ids)
plt.imshow(I)
print(ann_ids)
print(ann_ids2)
anns = coco.loadAnns(ann_ids)
coco.showAnns(anns)
plt.imshow(I)
plt.show()

图像效果

三、不同标注数据转换到COCO格式

下面为labelme json格式转到COCO格式。

def image(self,data,num):
    image={}
    img = utils.img_b64_to_array(data['imageData']) # 解析原图片数据
    # img=io.imread(data['imagePath'])
    # 通过图片路径打开图片 # img = cv2.imread(data['imagePath'], 0)
    height, width = img.shape[:2]
    img = None
    image['height']=height
    image['width'] = width
    image['id']=num+1
    image['file_name'] = data['imagePath'].split('/')[-1]
    self.height=height
    self.width=width
    return image
def categorie(self,label):
    categorie={}
    categorie['supercategory'] = label[0]
    categorie['id']=len(self.label)+1 # 0 默认为背景
    categorie['name'] = label[1]
    return categorie

def annotation(self,points,label,num):
    annotation={}
    annotation['segmentation']=[list(np.asarray(points).flatten())]
    annotation['iscrowd'] = 0
    annotation['image_id'] = num+1
    # annotation['bbox'] = str(self.getbbox(points))
    # 使用list保存json文件时报错(不知道为什么)
    # list(map(int,a[1:-1].split(','))) a=annotation['bbox'] 使用该方式转成list
    annotation['bbox'] = list(map(float,self.getbbox(points)))
    annotation['category_id'] = self.getcatid(label)
    annotation['id'] = self.annID
    return annotation

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

COCO数据集格式(详解)及COCO标注可视化。json转COCO等代码 的相关文章

  • 对于确实存在的字典,pdb 下“NameError:未定义全局名称”

    我遇到了一个范围问题lambda功能 我可以成功地将 foo 输出到标准输出 但在使用时出现错误max 包括一个lambda 请参阅下面的简化代码 总而言之 我正在尝试找到嵌套键的最大值budget在未知数量的一阶密钥内 Pdb foo s
  • 使用Python Selenium访问网页上的表对象

    一段时间以来 我尝试从网页中提取下表 我正在尝试进入网站上不同页面的 tr 对象 1 8 我设法存储并打开页面 并希望循环遍历表 tbody 其中包含 tr 对象 表示我想要访问的信息行 然而 当运行以下代码时 我只获得所有 8 个页面中的
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 按位置对 MultiIndex pandas DataFrame 进行切片

    我目前正在尝试按位置对具有三个级别的多索引数据帧进行切片 我正在使用熊猫 19 1 Level0 Level1 Level2 Value 03 00368 A Item111 6 9 03 00368 A Item333 19 2 03 0
  • 确定非空列表条目是否“连续”的 Pythonic 方法

    我正在寻找一种方法来轻松确定列表中所有非 None 项目是否出现在单个连续切片中 我将使用整数作为非 None 项目的示例 例如 列表 None None 1 2 3 None None 满足我对连续整数条目的要求 相比之下 1 2 Non
  • 根据列中的条件将 Pandas 数据框拆分为多个数据框

    为了为 ML 任务正确准备数据 我需要能够将原始数据帧拆分为多个较小的数据帧 我想要获取上面的所有行 包括 BOOL 列的值为 1 的行 对于每次出现的 1 即 n 个数据帧 其中 n 是 1 出现的次数 数据样本 df pd DataFr
  • 在 Python、Django 中下载的文件始终为空

    我在 Django 中使用以下视图来创建文件并使浏览器下载它 def aux pizarra request myfile StringIO StringIO myfile write hello response HttpResponse
  • 快速NLTK解析成语法树

    我正在尝试将数百个句子解析为语法树 我需要快速完成 问题是如果我使用 NLTK 那么我需要定义一个语法 而我不知道我只知道它会是英语 我尝试使用this https github com emilmont pyStatParser统计解析器
  • Matplotlib 行高表属性

    我已经尝试了我能找到的所有命令和文档 如何在这里设置行的高度 from pylab import Create a figure fig1 figure 1 ax1 1 fig1 add subplot 111 Add a table wi
  • 如何设置 1dCNN+LSTM 网络(Keras)的输入形状?

    我有以下想法要实施 Input gt CNN gt LSTM gt Dense gt Output 输入有 100 个时间步长 每个步长有一个 64 维特征向量 A Conv1D层将在每个时间步提取特征 CNN 层包含 64 个滤波器 每个
  • 不使用 OpenCV 获取图像掩模

    我正在尝试以下方法从该图像中获取蒙版 但不幸的是我失败了 import numpy as np import skimage color import skimage filters import skimage io get filena
  • 使用 Python 发布 XML 文件

    我是 Python 新手 需要一些帮助 我的目标是向 URL 发送一些带有 post 请求的 XML 这将触发发送 SMS 我有一个小的 XML 文档 我想将其发布到 URL 我可以在需要发布的 python 代码中引用我的服务器上的 XM
  • 在Python中将一个方法(带参数)传递给另一个方法的最佳方法是什么

    将方法和方法参数传递给另一个方法的最佳方法是什么 有更好的方法来执行以下操作吗 def method1 name return Hello name def method2 methodToCall methodToCallParams q
  • 使用 python 从 hive 读取数据时的性能问题

    我在 hive 中有一个表 其中包含 351 837 110 MB 大小 记录 我正在使用 python 读取该表并写入 sql server 在此过程中 从 hive 读取数据到 pandas dataframe 需要很长时间 当我加载整
  • 我从 clojure 和 python 中得到的 hmac 签名略有不同

    我从 python 实现和 clojure 实现中获得的 HMAC SHA1 签名略有不同 我很困惑什么会导致这种情况 Python实现 import hashlib import hmac print hmac new my key my
  • Python 视图与复制错误希望我仅在脚本中使用 .loc

    我正在运行一个很长的脚本 其中有一个数据框df 随着脚本运行 构建和修改df我在命令行中一列又一列地收到此错误 尝试在 DataFrame 的切片副本上设置一个值 尝试 使用 loc row indexer col indexer valu
  • 维基百科与 Python

    我有这个非常简单的 python 代码来读取 wikipedia api 的 xml import urllib from xml dom import minidom usock urllib urlopen http en wikipe
  • 导入 python 模块时如何解决 KeyError?

    我试图从不同的目录级别导入模块 所以我使用了 import os import sys sys path insert 0 os path abspath os path join os path dirname file 但现在我收到这个
  • 在 Python 中计算时间(datetime.timedelta?)

    我相信这对很多人来说都是理所当然的事情 但我发现自己对整个 datetime timedelta 事情感到非常困惑 本质上我在开始时给一些东西加上时间戳startTime然后我为流程结束添加时间戳endTime我试图找出 HH MM SS
  • 为什么 float() 会截掉尾随零?

    该代码成功地将一个包含许多数字的大文件裁剪为几个包含数字的较小文本文件 但它产生了一个有趣的怪癖 所有数字都应精确到小数点后四位 例如 2 7400 但它们打印为 2 74 这是文件的片段 0 96 0 53 0 70 0 53 0 88

随机推荐