使用json头文件和coco api对coco格式的json进行查看与修改

使用json头文件对coco格式json进行查看

大家可以用coco2017的json跟我一起测试一下

#使用json头文件读入coco数据集
import json
with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/coco_ycbv_train_000000.json",'r') as load_f:
    f = json.load(load_f)

print(f.keys())

图片1

#查看一下这份文件的annotations信息
f['annotations']

图片2

#读取annotations里第一个标注框的信息
f['annotations'][0]

图片3

#读取第一个bbox
f['annotations'][0]['bbox']
#读取一下这份文件的info信息
f['info']

图片4

#读取一下这份文件的licenses信息
f['licenses']
#读取类别
f['categories']

图片5

#读取图片的信息
f['images']

图片6

#试着读取一下id=0的框
f['images'][0]

图片7

#再试着读一下文件的路径
#到时候根据这个来修改文件路径
f['images'][0]['file_name']
#文件指针关闭
#参考代码[Python 文件打开,关闭,文件指针](https://blog.csdn.net/Smile_Mr/article/details/83179473)
load_f.close()

图片8

使用COCO API 对COCO格式的JSON进行查看

【COCO数据集】COCO API入门 超详细注解

加载annotations文件(这里加载instances_val2017.json),生成COCO对象
import numpy as np 
from pycocotools.coco import COCO
import json
annFile = os.path.join(COCODIRS['annotations'], 'coco_ycbv_train_000000.json')
# with open(annFile,'r') as fp: # 这段注释,原本是直接加载json,看看里面的内容
#     a = json.load(fp)
# a
coco = COCO(annFile) # 初始化生成COCO对象
coco # 生成的COCO对象

图片9

  • coco.getCatIds() 此函数用于获取加载对象所包含的所有类别的id(即category 的序号)
  • coco.getAnnIds() 获取加载对象所包含的所有标记信息(就是所有图片的Segmentation,即分割的坐标数据)
  • coco.getImgIds() 获取所有 标记所对应的原图id
categories = coco.loadCats(coco.getCatIds()) # loadCats()需要传入 需加载的类别id序列(catIds)
#categories[:10] # 为了输出美观,这是仅展示10条数据
categories[:]#显示全部数据 

图片10

names = [cat['name'] for cat in categories]
#names[:10]#为了输出美观,这里我们也只显示十个类别
names[:]#显示全部类别

图片11
获取指定名称的类别序号(找category name为 x 的 category id)
这里获取 name为8,14,21所对应的类别id,原因是:我的数据集json文件里面只包含类别8,14,21的物体

catIds = coco.getCatIds(catNms=['8', '14', '21'])
catIds

图片11
获取所有符合catIds的图片id
即上面我们得到的类别为8,14,21,那么就获取图片中含有这三个类别的图片对应的id

  • 注意getImgIds 取的是交集,不是并集,多加一个id都只返回空串¶
imgIds = coco.getImgIds(catIds=catIds)
imgIds

从上面符合条件的所有图片序号中随机选取(这里用numpy的随机函数)一个图片,通过loadImgs()加载该图片的信息

img_info = coco.loadImgs(imgIds[np.random.randint(0, len(imgIds))])
img_info

图片12
可以看到loadImgs()返回的是一个list,其每条元素是对应的一个图片的具体信息

由于我们这里需要的是一个图片信息,所以用下面的方法,提取出第一条信息

img_info = coco.loadImgs(imgIds[np.random.randint(0, len(imgIds))])[0]
#从里面只选择一张图片试试看(底下这行代码只能运行一次,所以我们注释了底下的,选上面的代码运行)
#img_info = img_info[0]
img_info

图片13
可以看到获得的图片信息包括:

  • license
  • file_name
  • coco_url
  • height
  • width
  • date_captured
  • flickr_url
  • id

使用json头文件对coco格式json进行修改

我这里以我修改ycbv的json文件的filename为例

import json
dic = {}
with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/data_train.json",'r',encoding='utf8') as load_f:
    f = json.load(load_f)
print(f.keys())

图14

#读取图片的信息
f['images']

在这里插入图片描述
在这里插入图片描述
可以看到,我文件里的file_name都是 ‘…\000000\rgb\000001.png’这样的格式的,这样的格式我没有办法在detectron2里使用,所以我想使用python的字符串函数将其改成’/000000/rgb/000001.png’

for num in range(0,len(f['images'])):  
    #print(num)
    #print(img[num]['file_name'])
    str = f['images'][num]['file_name']
    str = str.replace('..\\','')
    str = str.replace('\\','/')
    #print(str)
    f['images'][num]['file_name']=str
    print(f['images'][num]['file_name'])
#把刚才所有的处理都保存到dic中,然后关闭load_f
dic = {}
dic = f
load_f.close()

现在重新打开文件,使用jump函数将刚才修改好的内容覆盖到这个文件里

with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/data_train.json",'w') as load_f:
    json.dump(dic,load_f)
load_f.close()

检查一下修改的结果

#检测一下修改结果
with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/data_train.json",'r',encoding='utf8') as load_f:
    f = json.load(load_f)
print(f.keys())
f['images'][113197]

在这里插入图片描述
可以看到,文件的file_name已经修改成我们想要的格式了。所以我们把文件指针关闭

load_f.close()
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值