如何将模型预测的Mask转换为LabelMe格式JSON文件用于二次训练?
将模型预测Mask转换为LabelMe JSON文件的实现方法
核心思路
LabelMe的JSON是结构化的标注存储格式,包含图片元数据、目标轮廓/掩码信息、类别标签等。我们要做的就是从模型输出的Mask中提取每个目标的轮廓,再按照LabelMe的规范组装成JSON文件。
具体实现步骤
1. 安装依赖库
需要用到OpenCV(处理图像、提取轮廓)、json(生成JSON)、PIL(读取图片),执行以下命令安装:
pip install opencv-python pillow
2. 编写转换代码
以下是可直接复用的Python代码,适配单类别/多类别Mask场景:
import cv2 import json import numpy as np from PIL import Image def mask_to_labelme(mask_path, img_path, save_json_path, category_names): # 读取Mask和原图 mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE) img = Image.open(img_path) img_width, img_height = img.size # 提取目标轮廓(只取最外层) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 构建LabelMe的JSON基础结构 labelme_json = { "version": "5.0.1", "flags": {}, "shapes": [], "imagePath": img_path.split("/")[-1], "imageData": None, "imageHeight": img_height, "imageWidth": img_width } # 遍历每个轮廓,生成标注条目 for contour in contours: # 转换轮廓点格式为LabelMe要求的[[x1,y1],[x2,y2],...] points = contour.reshape(-1, 2).tolist() # 根据Mask灰度值匹配对应类别(灰度值需与category_names索引对应) mask_value = mask[contour[0][0][1], contour[0][0][0]] if mask_value >= len(category_names): continue # 跳过背景或未定义类别 label = category_names[mask_value] shape_item = { "label": label, "points": points, "group_id": None, "shape_type": "polygon", "flags": {} } labelme_json["shapes"].append(shape_item) # 保存JSON文件 with open(save_json_path, "w", encoding="utf-8") as f: json.dump(labelme_json, f, indent=2, ensure_ascii=False) # 示例调用 if __name__ == "__main__": # 替换为你的实际路径和类别列表 MASK_PATH = "predicted_mask.png" IMG_PATH = "original_image.jpg" SAVE_PATH = "output_labelme.json" CATEGORIES = ["cat", "dog"] # 索引对应Mask中的灰度值0、1... mask_to_labelme(MASK_PATH, IMG_PATH, SAVE_PATH, CATEGORIES)
3. 关键细节优化
- 多类别适配:确保
category_names的索引与Mask中目标的灰度值一一对应,比如灰度值1对应列表第一个类别。 - 轮廓优化:如果Mask轮廓有毛刺,可在提取轮廓前添加形态学操作优化:
# 可选:用闭运算修复轮廓缺口 kernel = np.ones((3,3), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) - 路径设置:
imagePath只需填写图片文件名,LabelMe会自动匹配同目录下的原图。
4. 验证结果
生成JSON后,直接用LabelMe软件打开对应的原图,检查标注轮廓是否准确,如有问题可调整轮廓提取参数或Mask预处理步骤。
内容的提问来源于stack exchange,提问作者蕭暘倫
相关产品推荐
相关产品推荐

