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

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

  • 20
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值