一些手动处理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 来索引对应的信息

### 回答1: COCO格式JSON转换为VOC格式的XML需要经过以下几个步骤: 第一步,读取COCO格式JSON文件,解析其中的对象标注数据。一般来说,COCO格式JSON中每个对象标注都包含类别、边界框位置、标注区域等信息。 第二步,根据解析得到的标注信息,生成VOC格式的XML文件。在生成XML文件时,需要按照VOC格式的要求,设置好文件头和对象标注信息。每个对象标注都需要有其类别、边界框位置、标注区域等信息。 第三步,将生成的VOC格式的XML文件保存到指定路径下。 其中,关于转换的实现细节需要注意以下几点: 首先,在解析COCO格式JSON文件时,需要根据JSON结构中不同的字段和嵌套关系,逐层解析并提取出标注信息。其中,需要注意一些数据格式的转换,如COCO格式中的标注区域信息通常是多边形或RLE格式,需要根据VOC格式要求转化为矩形。 其次,在生成VOC格式的XML文件时,需要注意文件头的设置,并遵守XML文档的一些规范。例如,每个XML文件都需要有一个根节点,对象标注的信息需要封装在“object”标签中,且标签中的文本内容需要进行编码和转义。 最后,在保存XML文件时,需要确保文件目录存在及权限设置正确。此外,还可以为XML文件设置其它元信息,如创建时间、文件格式等。 综上所述,将COCO格式JSON文件转换为VOC格式的XML需要按照一定的规则解析和生成文件,实现上需要注意一些细节。 ### 回答2: 要将COCO格式JSON文件转换为VOC格式的XML文件,需要进行以下步骤: 1.准备好COCO格式JSON文件和VOC格式的模板XML文件。 2.读取COCO格式JSON文件,可以使用Python中的json模块来实现。 3.遍历JSON文件中的所有目标,提取出相应的信息,例如目标的类别、位置等。 4.将提取出的信息填写到VOC格式的XML模板中,并保存成XML文件。 5.可以使用Python中的xml.etree.ElementTree模块来实现XML文件的创建和编辑。 6.将转换后的XML文件导入到目标检测框架中进行训练和测试。 需要注意的是,COCO格式和VOC格式有很大的差异,因此在转换过程中需要特别小心。同时,也需要根据具体的数据集和目标检测框架的要求进行相应的修改和调整。 ### 回答3: COCO (Common Objects in Context)格式是一种常用的目标检测数据集格式,而VOC (Visual Object Classes)格式是另一种经常用于目标检测任务的格式。在实际应用中,有时需要将COCO格式的数据转换为VOC格式,以便在某些特定场景中使用。 要将COCO格式JSON转换为VOC格式XML,需要进行以下几个步骤: 1. 解析COCO格式JSON数据,获得图片路径、图片大小以及目标检测框的坐标、类别等信息。 2. 根据得到的类别信息,确定VOC格式XML中用于表示目标类别的ID号。 3. 将解析得到的图片大小以及目标框坐标转换为VOC格式需要的左上角坐标、右下角坐标等信息。 4. 根据得到的信息,生成VOC格式XML文件。其中,每个目标检测框对应一个对象节点,包含对象的类别、位置等信息。 需要注意的是,COCO格式和VOC格式的差异比较大,对于某些特定的键值对,需要进行相应的转换或忽略。此外,在进行数据转换时,应注意保留足够的信息,以便后续任务能够顺利进行。 总的来说,将COCO格式JSON转换为VOC格式XML需要较为复杂的代码实现,对于没有相关经验的人来说难度较大,建议寻求专业人士的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值