Labelme JSON格式详解:标注文件结构与字段说明
你是否在使用Labelme进行图像标注时,面对生成的JSON文件感到困惑?不知道各个字段代表什么含义?本文将带你深入了解Labelme JSON标注文件的结构与字段说明,帮助你更好地理解和使用标注数据。读完本文,你将能够清晰解读Labelme生成的JSON文件,了解每个字段的作用,为后续的模型训练和数据处理打下坚实基础。
标注文件基本结构
Labelme生成的JSON标注文件采用标准的JSON格式,主要包含版本信息、标注形状、图像路径、图像数据等关键部分。通过对examples/tutorial/apc2016_obj3.json文件的分析,我们可以清晰地看到其整体结构。
一个完整的Labelme JSON标注文件通常包含以下几个主要字段:
version:标注文件版本号flags:全局标志信息shapes:标注形状列表,包含所有标注对象的详细信息imagePath:原始图像路径imageData:图像的Base64编码数据(可选)imageHeight:图像高度imageWidth:图像宽度
核心字段详细说明
version字段
version字段用于标识Labelme标注文件的版本信息,如examples/tutorial/apc2016_obj3.json中的版本为"4.0.0"。不同版本的Labelme可能会对JSON格式进行调整,因此版本信息对于确保数据兼容性非常重要。
flags字段
flags字段是一个全局标志字典,用于存储与整个图像相关的标记信息。在examples/tutorial/apc2016_obj3.json中该字段为空,实际使用中可以根据需要添加自定义标记,如图像质量评估结果、是否需要复查等。
shapes字段
shapes字段是Labelme JSON文件的核心部分,它是一个数组,每个元素代表一个标注对象的详细信息。以examples/tutorial/apc2016_obj3.json中的第一个形状为例:
{
"label": "shelf",
"points": [
[7.942307692307736, 80.76150251617551],
[171.94230769230774, 714.7615025161755],
[968.9423076923077, 733.7615025161755],
[1181.9423076923076, 110.76150251617551]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
}
每个形状对象包含以下关键子字段:
label字段
label字段用于指定标注对象的类别名称,如上述示例中的"shelf"、"highland_6539_self_stick_notes"等。标签名称应与项目中的标签定义保持一致,项目中的标签定义可参考examples/instance_segmentation/labels.txt。
points字段
points字段是一个二维数组,存储标注形状的坐标点信息。不同的shape_type对应不同的坐标点组织方式:
- 多边形(polygon):一系列连续的(x, y)坐标点,如examples/tutorial/apc2016_obj3.json中的"shelf"对象
- 矩形(rectangle):两个对角点坐标
- 圆形(circle):圆心坐标和半径点坐标
- 线段(line):起点和终点坐标
- 点(point):单个坐标点
shape_type字段
shape_type字段指定标注形状的类型,Labelme支持多种形状类型,包括"polygon"、"rectangle"、"circle"、"line"、"point"等。不同的标注工具会生成不同类型的形状,如examples/primitives/primitives.json中展示了多种基本形状的标注示例。
group_id字段
group_id字段用于将多个相关的标注形状分组,相同组ID的形状被视为一个整体。在examples/tutorial/apc2016_obj3.json中该字段均为null,表示所有形状都是独立的。
flags字段
shape对象中的flags字段用于存储与该形状相关的特定标记,可根据实际需求添加自定义标记,如是否为关键对象、是否被遮挡等。
imagePath字段
imagePath字段存储原始图像的文件路径,如examples/tutorial/apc2016_obj3.json中的"apc2016_obj3.json"。需要注意的是,该路径可以是相对路径或绝对路径,建议使用相对路径以保证项目的可移植性。
图像尺寸字段
imageHeight和imageWidth字段分别存储图像的高度和宽度信息,这些信息对于后续的坐标转换和可视化非常重要。如果JSON文件中没有这两个字段,可以通过读取原始图像获取尺寸信息,相关工具函数可参考labelme/utils/image.py。
标注文件生成与解析
标注文件生成
Labelme的标注文件生成逻辑主要在labelme/_label_file.py中实现。当用户在Labelme界面中完成标注并保存时,系统会将标注信息按照上述JSON格式进行组织并写入文件。
标注文件解析
Labelme提供了多种工具用于解析和转换标注文件,如:
- examples/instance_segmentation/labelme2coco.py:将Labelme格式转换为COCO数据集格式
- examples/bbox_detection/labelme2voc.py:将Labelme格式转换为PASCAL VOC数据集格式
- examples/tutorial/load_label_png.py:加载标注生成的PNG图像文件
这些转换工具在模型训练前的数据准备阶段非常有用,可以根据不同框架的需求将Labelme标注转换为相应的数据集格式。
实际应用示例
目标检测标注
在目标检测任务中,通常使用矩形框(rectangle)进行标注。examples/bbox_detection/data_annotated/2011_000003.json是一个典型的目标检测标注文件示例,其中每个形状的shape_type为"rectangle",points字段包含矩形的两个对角点坐标。
实例分割标注
实例分割任务需要对目标的精确轮廓进行标注,通常使用多边形(polygon)工具。examples/instance_segmentation/data_annotated/2011_000003.json展示了实例分割的标注方式,每个对象的轮廓由一系列连续的多边形顶点坐标定义。
视频序列标注
Labelme还支持对视频序列进行标注,examples/video_annotation/data_annotated/目录下包含一系列视频帧的标注文件。视频标注与单图像标注的JSON格式相同,但需要注意保持不同帧之间标注的一致性,以便进行时序分析。
标注文件可视化
Labelme提供了标注结果可视化功能,可以将JSON标注文件与原始图像叠加显示。可视化相关的代码主要在labelme/widgets/canvas.py中实现。此外,也可以使用命令行工具可视化标注结果:
labelme_draw_json examples/tutorial/apc2016_obj3.json
可视化结果会显示所有标注形状及其标签,如examples/tutorial/apc2016_obj3/label_viz.png所示,这对于检查标注质量和标注一致性非常有帮助。
总结
Labelme JSON标注文件是连接标注过程和模型训练的重要桥梁,理解其结构和字段含义对于正确使用标注数据至关重要。本文详细介绍了Labelme JSON文件的各个字段,包括version、flags、shapes、imagePath等,并结合examples/tutorial/apc2016_obj3.json等实例进行了解析。
掌握Labelme JSON格式不仅有助于正确解读标注数据,还能帮助用户根据实际需求扩展标注功能,如自定义标记、批量处理标注文件等。Labelme提供了丰富的工具和示例代码,如各类格式转换脚本和可视化工具,可以大大提高数据处理效率。
更多关于Labelme的使用技巧和高级功能,请参考项目的README.md和examples/tutorial/README.md。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



