1. 项目背景与需求解析
在计算机视觉项目中,数据标注是模型训练的基础环节。不同的标注工具生成的标注格式各不相同,这给项目协作和流程整合带来了挑战。最近我在处理一个工业质检项目时,就遇到了这样的问题:团队前期使用VGG Image Annotator(VIA)进行标注,但后续模型训练需要Labelme格式的标注文件。
VIA是一款基于网页的通用图像标注工具,支持点、线、多边形等多种标注形式。而Labelme则是另一个流行的图像标注工具,特别适合语义分割任务。两者虽然功能相似,但数据存储结构差异很大:
- VIA使用单一JSON文件存储所有图片的标注信息,结构较为扁平
- Labelme为每张图片生成独立的JSON文件,包含更丰富的元数据
- 两者对多边形坐标的存储方式也不同
这种格式差异导致我们无法直接使用VIA的标注结果进行训练。经过分析,决定编写一个Python转换脚本,将VIA的JSON标注转换为Labelme格式。这不仅解决了当前项目的需求,也为后续类似情况提供了可复用的工具。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案设计
2.1 数据结构对比分析
要实现格式转换,首先需要深入理解两种标注格式的数据结构。以下是关键差异点:
VIA标注结构特点:
- 所有标注信息存储在一个JSON文件中
- 使用"metadata"字段存储每张图片的标注详情
- 多边形坐标以扁平数组形式存储,如[x1,y1,x2,y2,...]
- 属性值(attribute)以数字编码形式存储
Labelme标注结构特点:
- 每张图片对应一个独立的JSON文件
- 使用"shapes"数组存储多个标注区域
- 每个标注区域明确指定shape_type(如polygon)
- 坐标以[[x1,y1],[x2,y2],...]的二维数组形式存储
- 支持更丰富的元数据(如图片宽高)
2.2 转换流程设计
基于上述分析,转换流程设计如下:
- 输入处理:读取VIA生成的JSON文件,解析metadata中的标注信息
- 数据提取:对每张图片提取多边形坐标和对应的类别标签
- 格式转换:将坐标从VIA格式转换为Labelme格式
- 属性映射:将VIA的数字编码转换为Labelme的文本标签
- 输出生成:为每张图片创建独立的Labelme格式JSON文件
注意:VIA和Labelme对多边形方向的约定可能不同。VIA默认使用顺时针,而Labelme通常使用逆时针。虽然不影响标注显示,但在某些模型训练中可能产生影响,需要特别注意。
3. 核心代码实现与解析
3.1 数据加载与初始化
python复制import json
import cv2
import os
import numpy as np
'''
属性映射说明:
0 → 正常 → Labelme中的2
1 → 异常 → Labelme中的3
2 → 有 → Labelme中的0
3 → 无 → Labelme中的1
'''
# 加载VIA标注文件
with open('01725bff-0fc6-4017-ad33-830df526438a.json', 'r', encoding='utf-8') as f:
data = json.load(f)
attribute = data['attribute']
file = data['file']
metadata = data['metadata']
label_data = {}
这段代码完成了基础环境准备和文件加载:
- 导入必要的库:json用于JSON处理,cv2用于图像操作,os用于文件路径处理,numpy用于数组操作
- 定义了属性映射关系注释,这是根据项目需求特别制定的
- 加载VIA的JSON文件,并提取三个主要部分:attribute、file和metadata
3.2 数据提取与预处理
python复制for key, value in metada
