一些手动处理COCO格式json的函数

避免重复造这些小函数,在本文持续更新吧

拿到一个COCO的json, 第一步先读经来:

import json

with open("xx.json") as f:
    coco_data = json.load(f)

拿过来之后进行如下操作,:

dict_keys(['type', 'images', 'annotations', 'categories'])

>>> coco_data["type"]
# 'instances'


>>> len(coco_data["images"])
44


# 打印一个 image 的例子看看
# {'dataset': 'NIOLane',
#  'file_name': 'xxxxxxxxxx.jpg',
#  'file_size': 0,
#  'height': 2160,
#  'id': 900,
#  'width': 3840}


>>> len(coco_data["annotations"])
# 34


# 打印一个 annotation 的例子看看
# {'category_id': 0,
#  'id': 10,
#  'image_id': 916,
#  'xx_abrase': 1,
#  'xx_color': 1,
#  'xx_type': 2,
#  'lanepoints': [[1596.8633552531553, 1801.6827432454047],
#                 [1597.8633552531553, 1801.7291012378269],
#                 ......
#                 [3489.8633552531555, 1889.4384229003572],
#                 [3490.8633552531555, 1889.484780892779]]}


>>> len(coco_data["categories"])
0

一般会有 'images', 'annotations', 'categories' 这三个 key

  • image 记录一些图片的信息
  • annotations 记录对应的标注信息,每个标注都会记录是那一张图片的标注
  • categories 一般记录每一个类的信息(但在本例中没有)

所以要找每一张图片对应的标注,要你手动搜索一下:

def ann_dict(imgs, anns):

    img_id2ann_list = {}
    for img in imgs:
        img_id2ann_list[ img["id"] ] = []

    for _idx, ann in enumerate(anns):
        img_id = ann["image_id"]
        img_id2ann_list[img_id].append( ann["id"] )

        assert(ann["id"] == _idx) # 这步用来校验对错

    return img_id2ann_list
>>> ann_dict(coco_data["images"], coco_data["annotations"])

{900: [],
 ...
 921: [15],
 922: [16],
 923: [17],
 924: [18],
 ...
 939: [31],
 940: [32],
 941: [33],
 942: [],
 943: []}

返回每一个图片 id 对应的标注 id(以列表的形式)

然而有时需要将每个图片的路径做一下批量修改,一个for循环就可以了

import os
def apply(img_dic_list, key, lambda_func):

    result = []
    for idx, img_dic in enumerate(img_dic_list):
        img_dic_copy = img_dic.copy()
        img_dic_copy[key] = lambda_func( img_dic_copy[key] )
        result.append( img_dic_copy )
    return result


# 传入一个修改的函数
change_path = lambda x: os.path.join("work_dirs", "images", os.path.basename(x))
# 修改内容
coco_data["images"] = apply(coco_data["images"], "file_name", change_path)

OK, 改好了
在这里插入图片描述
还需要通过id来索引图片信息或者标注信息的函数:

def img_id2img_info(data):
    # 返回一个 `id -> 图像属性` 的字典
    result = {}
    for img in data["images"]:
        id_ = img["id"]
        result[id_] = img
    return result

img_id2img_info(coco_data)
def ann_id2ann_info(data):
    # 返回一个 `id -> 图像属性` 的字典
    result = {}
    for ann in data["annotations"]:
        id_ = ann["id"]
        result[id_] = ann
    return result

ann_id2ann_info(coco_data)

以上都是通过 id 来索引对应的信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值