标注数据格式入门:JSON、XML、CSV、YAML 基础

做数据标注这行,打交道最多的就是这四种格式了。我刚开始接触时也觉得头大,后来发现其实就那点东西。今天咱们把它们掰开揉碎了讲清楚。

1. JSON:轻量级的数据交换格式

JSON 现在几乎是标注界的通用语言。说白了,它就是一套键值对的组合。我最早用 JSON 做图像标注时,一个框就是一个对象,坐标、类别、置信度全塞进去,干净利落。

核心结构:

  • 对象:用花括号 {} 包裹,里面是键值对
  • 数组:用方括号 [] 包裹,里面是列表
  • 值类型:字符串、数字、布尔、数组、对象、null
{
  "image_id": "img_001.jpg",
  "annotations": [
    {
      "label": "car",
      "bbox": [100, 200, 300, 400],
      "confidence": 0.98
    },
    {
      "label": "pedestrian",
      "bbox": [50, 60, 80, 120],
      "confidence": 0.85
    }
  ]
}

嗯,这里要注意:JSON 的键必须用双引号,单引号不行。我见过不少新手在这上面栽跟头,解析时报错半天找不到原因。

我的习惯:标注数据导出时,我会把元数据(图片路径、尺寸)和标注数据分开成两个字段。这样后续做数据清洗时,改标注不影响元数据。

2. XML:标签化的数据描述

XML 比 JSON 老一些,但它在某些领域依然坚挺。比如 Pascal VOC 数据集用的就是 XML。它的核心是「标签」和「属性」。

<annotation>
  <folder>images</folder>
  <filename>img_001.jpg</filename>
  <size>
    <width>1920</width>
    <height>1080</height>
    <depth>3</depth>
  </size>
  <object>
    <name>car</name>
    <bndbox>
      <xmin>100</xmin>
      <ymin>200</ymin>
      <xmax>300</xmax>
      <ymax>400</ymax>
    </bndbox>
  </object>
</annotation>

XML 的优点是结构清晰,可读性强。但缺点也很明显——冗余。你想想看,一个坐标要写四个标签,数据量大了文件体积蹭蹭往上涨。

我曾经踩过的坑:用 XML 做大规模标注时,忘了处理特殊字符。比如标注文本里出现了 <>,解析器直接报错。后来我养成了习惯,所有文本字段都做转义处理。

3. CSV:表格数据的王者

CSV 最简单,也最容易被忽视。它就是逗号分隔的表格数据。适合做分类标注、文本分类这类结构化程度高的任务。

image_id,label,xmin,ymin,xmax,ymax
img_001.jpg,car,100,200,300,400
img_001.jpg,pedestrian,50,60,80,120
img_002.jpg,bicycle,400,500,600,700

CSV 的坑其实不少。比如字段里如果包含逗号,必须用引号括起来。还有编码问题,我遇到过用 Excel 打开 CSV 时中文乱码,后来统一用 UTF-8 with BOM 格式导出才解决。

我的建议:CSV 适合做标注数据的「中间格式」。先导出 CSV 做快速预览和校验,确认无误后再转成 JSON 或 XML 给模型训练用。

4. YAML:人类友好的配置格式

YAML 在标注领域用得相对少,但做配置管理时特别好用。它的核心是缩进和冒号。你看一眼就懂,几乎不需要解释。

dataset:
  name: "my_dataset"
  version: 1.0
  classes:
    - car
    - pedestrian
    - bicycle
  annotations:
    - image: img_001.jpg
      objects:
        - label: car
          bbox: [100, 200, 300, 400]
        - label: pedestrian
          bbox: [50, 60, 80, 120]

YAML 对缩进极其敏感。我刚开始用的时候,一个空格没对齐,解析就失败了。后来我统一用两个空格缩进,再也没出过问题。

注意:YAML 不支持 Tab 缩进,必须用空格。而且不同解析器对缩进要求可能不一样,建议用 PyYAML 或 ruamel.yaml 这类成熟库。

5. 四种格式对比

特性 JSON XML CSV YAML
可读性 中等 良好 良好 优秀
文件大小 较小 较大 最小 中等
解析速度 中等 最快 中等
支持嵌套 支持 支持 不支持 支持
适用场景 通用标注 传统数据集 分类标注 配置文件

6. 格式转换的核心逻辑

做格式转换,说白了就是「解析 → 中间表示 → 序列化」这三步。我一般会先定义一个统一的中间数据结构,然后针对每种格式写解析器和生成器。

JSON XML CSV 中间数据结构 (统一对象模型) JSON YAML CSV 解析 → 中间表示 → 序列化

你看这个流程,不管输入是什么格式,先解析成统一的对象模型,再序列化成目标格式。这样做的好处是,加一种新格式只需要写解析器和生成器,中间逻辑不用动。

核心要点:

  • JSON 和 YAML 适合嵌套结构,CSV 适合扁平结构
  • XML 虽然冗余,但在某些传统领域仍是标准
  • 格式转换的核心是「中间表示」
  • 实际项目中,我通常用 JSON 做主力格式,CSV 做校验格式

好了,这四种格式的基础就这些。你想想看,其实每种格式都有自己的脾气,摸透了就好。下一节咱们会讲具体怎么用 Python 做格式转换,到时候我会分享一些实战中踩过的坑。

专注资料整理