You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将模型预测的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,提问作者蕭暘倫

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:15:30