避免重复造这些小函数,在本文持续更新吧
拿到一个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 来索引对应的信息