标注数据格式入门: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 和 YAML 适合嵌套结构,CSV 适合扁平结构
- XML 虽然冗余,但在某些传统领域仍是标准
- 格式转换的核心是「中间表示」
- 实际项目中,我通常用 JSON 做主力格式,CSV 做校验格式
好了,这四种格式的基础就这些。你想想看,其实每种格式都有自己的脾气,摸透了就好。下一节咱们会讲具体怎么用 Python 做格式转换,到时候我会分享一些实战中踩过的坑。