coco标注格式的json文件详解

# coco_json结构示意
{
    'info':info,
    'licenses':[licenses],
    'images':[image],
    'annotations':[annotation]
}

1. **`images`**:这个部分包含了所有图像的信息。每个图像都表示为一个字典,包含以下字段:
   - `id`:唯一标识图像的ID。
   - `file_name`:图像文件的文件名。
   - `width`:图像宽度(以像素为单位)。
   - `height`:图像高度(以像素为单位)。
   - `license`:图像的许可证信息(可选)。

2. **`annotations`**:这个部分包含了与图像中对象实例分割相关的注释信息。每个注释表示为一个字典,包含以下字段:
   - `id`:唯一标识注释的ID。
   - `image_id`:与注释相关联的图像的ID。
   - `category_id`:对象的类别ID,对应于`categories`部分中的类别。
   - `segmentation`:对象的分割掩码。通常表示为多边形或掩码的像素坐标。
   - `area`:对象的像素面积。
   - `bbox`:对象的边界框,格式为`[x, y, width, height]`。
   - `iscrowd`:标志位,指示对象是否是“杂乱”(例如,一群对象被视为单个对象)。

3. **`categories`**:这个部分包含了对象类别的信息。每个类别表示为一个字典,包含以下字段:
   - `id`:唯一标识类别的ID。
   - `name`:类别的名称。
   - `supercategory`:类别的超类别,用于组织相关类别。

4. **`info`**:这个部分包含了关于数据集的一般信息,如数据集名称、描述、版本等。

5. **`licenses`**:这个部分包含了与数据集许可相关的信息,如许可证名称、ID、URL等。

以下是一个简化的coco格式json示例:

{
  "images": [
    {
      "id": 1,
      "file_name": "image1.jpg",
      "width": 640,
      "height": 480
    },
    {
      "id": 2,
      "file_name": "image2.jpg",
      "width": 800,
      "height": 600
    }
  ],
  "annotations": [
    {
      "id": 1,
      "image_id": 1,
      "category_id": 1,
      "segmentation": [[x1, y1, x2, y2, ...]],
      "area": 1234,
      "bbox": [x, y, width, height],
      "iscrowd": 0
    },
    {
      "id": 2,
      "image_id": 1,
      "category_id": 2,
      "segmentation": [[x1, y1, x2, y2, ...]],
      "area": 567,
      "bbox": [x, y, width, height],
      "iscrowd": 0
    }
  ],
  "categories": [
    {
      "id": 1,
      "name": "person",
      "supercategory": "human"
    },
    {
      "id": 2,
      "name": "car",
      "supercategory": "vehicle"
    }
  ],
  "info": {
    "description": "COCO 2017 dataset",
    "version": "1.0",
    "year": 2017,
    "contributor": "Microsoft COCO group",
    "url": "http://cocodataset.org"
  },
  "licenses": [
    {
      "id": 1,
      "name": "CC BY-SA 2.0",
      "url": "https://creativecommons.org/licenses/by-sa/2.0/"
    }
  ]
}

在COCO数据集的`annotations`字段中,`segmentation`字段用于描述对象实例的分割信息。`segmentation`字段的内容可以是多边形(polygon)或二进制掩码(mask),具体格式取决于数据集的标注方式。以下是关于`segmentation`字段的详细介绍:

1. **多边形表示(Polygon Representation)**:

   在COCO数据集中,`segmentation`字段通常以多边形的形式来表示对象实例的分割区域。多边形表示是一个列表,其中包含一系列坐标点,这些点按照顺序连接以形成多边形边界。坐标点的顺序是按照顺时针或逆时针方向排列的。

   例如,`segmentation`字段的内容可以如下所示:
   ```
   "segmentation": [[x1, y1, x2, y2, x3, y3, ...]]
   ```

   其中,每对(x, y)表示一个多边形边界上的点坐标。这些坐标点按照顺时针或逆时针的顺序排列。

2. **二进制掩码表示(Binary Mask Representation)**:

   在某些情况下,COCO数据集也可以使用二进制掩码来表示对象实例的分割区域。二进制掩码是一个二维矩阵,其中每个像素都标识为前景(对象)或背景。通常,前景像素用1表示,背景像素用0表示。

   例如,`segmentation`字段的内容可以如下所示:
   ```
   "segmentation": {
       "size": [height, width],
       "counts": "binary_mask_encoded"
   }
   ```

   其中,`size`字段包含掩码的高度和宽度,`counts`字段包含了用一种编码方式表示的二进制掩码。

在实例分割的coco-json中,annotations--segmentation以counts形式存储分割信息,且用到了RLE编码,因此利用segmentation存储的分割信息还需要进行RLE解码操作,这里可以利用pycocotools中的方法进行解码:

import pycocotools.mask as mask_utils
from pycocotools.coco import COCO

# 读取json
coco = COCO(json_path)
images_ids = coco.getImgIds()

# 逐图像处理
for img_id in images_ids:
    img_info = coco.loadImgs(img_id)[0]
    ann_ids = coco.getAnnIds(imgIds=img_id)
    anns = coco.loadAnns(ann_ids)

    # 逐实例处理
    for ann in anns:
        rle = coco.annToRLE(ann)        # 解码
        mask = mask_utils.decode(rle)   # 生成原图mask
        
        mask[mask == 1] = 255           # 调整灰度值便于显示
       

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐