COCO(Common Objects in Context)是由微软团队提出的一种广泛使用的通用目标检测、分割和关键点标注数据集格式。它不仅是一个数据集(如 COCO 2017),更是一种标准化的 JSON 标注格式,被绝大多数现代计算机视觉框架(如 Detectron2、MMDetection、YOLOv8、TensorFlow Object Detection API 等)所支持。


COCO 标注文件结构(JSON)

COCO 使用 单个 .json 文件 描述整个数据集(或按训练/验证拆分为多个),包含以下 5 个核心顶级字段

{
  "info": { ... },
  "licenses": [ ... ],
  "images": [ ... ],
  "annotations": [ ... ],
  "categories": [ ... ]
}

1、info:数据集元信息

"info": {
  "description": "Face Detection Dataset",
  "url": "",
  "version": "1.0",
  "year": 2025,
  "contributor": "Your Name",
  "date_created": "2025-10-26"
}

2、licenses:许可证信息(可选)

"licenses": [
  {
    "id": 1,
    "name": "CC BY 4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/"
  }
]

3、images:图像列表

每张图像一个对象,包含唯一 ID、文件名、尺寸等。

"images": [
  {
    "id": 1,
    "file_name": "image_1.jpg",
    "width": 640,
    "height": 480,
    "date_captured": "2025-10-26",
    "license": 1,
    "coco_url": "",
    "flickr_url": ""
  },
  {
    "id": 2,
    "file_name": "image_2.jpg",
    "width": 800,
    "height": 600,
    ...
  }
]

关键id 必须唯一,后续 annotations 通过 image_id 关联。


4、categories:类别定义

定义所有目标类别,每个类别有唯一 ID 和名称。

"categories": [
  {
    "id": 1,
    "name": "face",
    "supercategory": "person"
  }
]

注意:COCO 的 id 通常从 1 开始(0 常被忽略或保留),且必须与标注中的 category_id 一致。


5、annotations:标注主体(核心!)

根据任务类型不同,annotations 内容略有差异:

A. 目标检测(Bounding Box)
{
  "id": 1,                    // 标注唯一 ID
  "image_id": 1,              // 对应 images 中的 id
  "category_id": 1,           // 对应 categories 中的 id
  "bbox": [30, 50, 120, 150], // [x, y, width, height] ← 注意!不是 x_min/y_min/x_max/y_max
  "area": 18000,              // width * height(用于评估)
  "segmentation": [],         // 可为空或 RLE(见下文)
  "iscrowd": 0                // 0=单个对象,1=群体(用 RLE 编码)
}

重要:COCO 的 bbox 格式是 [x, y, width, height],其中 (x, y)左上角坐标

B. 实例分割(Instance Segmentation)
"segmentation": [[x1, y1, x2, y2, ..., xn, yn]]  // 多边形坐标列表(每个点 x,y 交替)
// 或
"segmentation": RLE 编码(用于 iscrowd=1 的密集区域)
C. 关键点检测(Keypoint Detection)
"keypoints": [x1, y1, v1, x2, y2, v2, ...],  // v: 0=未标注, 1=标注但不可见, 2=可见
"num_keypoints": 5

同时需在 categories 中定义关键点名称和骨架(skeleton):

"categories": [{
  "id": 1,
  "name": "face",
  "keypoints": ["left_eye", "right_eye", "nose", "left_mouth", "right_mouth"],
  "skeleton": [[1,3], [2,3], [3,4], [3,5]]  // 连接关系(1-based 索引)
}]

与CSV格式对比

CSV 格式 COCO 格式
x_min, y_min, x_max, y_max x, y, width, height
每行一个框 所有标注集中在一个 annotations 列表
无图像尺寸信息 images 中明确记录 width/height
无类别定义 categories 显式定义类别

COCO 格式的优点

  • 统一支持:检测、分割、关键点三种任务。
  • 高效评估:官方提供 pycocotools,支持 mAP 等标准指标计算。
  • 生态兼容:Detectron2、MMDetection、YOLOv8 等主流框架原生支持。
  • 扩展性强:支持群体对象(iscrowd)、属性标注等。

如何生成 COCO 格式?

你可以:

  1. 手动编写脚本(推荐):将你的 CSV 或 Labelme JSON 转换为 COCO JSON。
  2. 使用工具
    • labelme2coco(Labelme 官方示例)
    • CVATRoboflow 等标注平台支持导出 COCO

示例:将你的 CSV 转为 COCO(检测任务)

假设你的 CSV:

image_name,x_min,y_min,x_max,y_max,label
image_1.jpg,30,50,150,200,face

转换后 COCO 片段:

{
  "images": [{
    "id": 1,
    "file_name": "image_1.jpg",
    "width": 640,
    "height": 480
  }],
  "annotations": [{
    "id": 1,
    "image_id": 1,
    "category_id": 1,
    "bbox": [30, 50, 120, 150],  // 150-30=120, 200-50=150
    "area": 18000,
    "iscrowd": 0,
    "segmentation": []
  }],
  "categories": [{
    "id": 1,
    "name": "face"
  }]
}

注意:你需要提前知道每张图的 widthheight(可通过 PIL/OpenCV 读取图像获取)。


总结

COCO 标注格式是一种结构严谨、功能全面、行业标准的 JSON 格式,适用于:

  • 目标检测(bounding box)
  • 实例分割(polygon/RLE)
  • 关键点检测(keypoints)

如果你计划使用现代深度学习框架训练模型,强烈建议将数据转换为 COCO 格式

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐