语义分割:标注json文件转mask

本文介绍了两种方法将使用labelme标注的json文件转换为mask,适用于深度学习数据集的准备。方法1涉及特定版本的labelme,转换后的标签图是8位彩色图,实际上每个像素点的值对应类别。方法2则适用于新版本的labelme,无需卸载重装,直接转换mask。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法 1

注 :该方法,在标注自己的数据集时,labelme版本需安装3.16.7

import base64
import json
import os
import os.path as osp

import numpy as np
import PIL.Image
from labelme import utils

'''
## 方法 1

import base64
import json
import os
import os
<think>好的,用户现在问的是如何从LabelMe生成的JSON文件创建对应的二进制掩码图。首先,我需要回想一下之前的对话历史,用户已经完成了标注并生成了JSON文件,接下来需要换格式以便用于Mobile UNet等模型的训练。用户现在具体想知道如何生成二进制掩码,这可能涉及到图像处理和数据换的步骤。 首先,我需要确定用户可能的技术背景。用户可能有一定的编程基础,尤其是Python,因为之前的问题中提到了使用Python换格式。因此,在回答时应该提供具体的代码示例,但也要注意解释每一步的作用,以便用户理解。 接下来,我需要考虑二进制掩码图的具体创建过程。LabelMe的JSON文件包含每个多边形的坐标信息,这些坐标对应着不同的类别。创建掩码图需要将每个多边形区域填充为对应的类别标签值(例如,0为背景,1为类别1,依此类推)。这通常需要用到图像处理库,比如PIL和numpy,以及处理JSON数据的能力。 可能的步骤包括:解析JSON文件,读取图像尺寸,创建空白的掩码图像,遍历每个标注形状,使用多边形坐标在掩码上绘制填充区域,并将类别值作为颜色填充进去。同时,可能需要处理不同的类别,确保每个类别有唯一的标签值。 还要注意处理不同形状的类型,比如多边形、矩形或圆形,但LabelMe通常使用多边形。因此,代码可能需要处理多边形坐标的解析和填充。此外,需要确保坐标的正确换,因为JSON中的坐标可能是浮点数,需要换为整数像素位置。 用户可能需要知道如何安装必要的库,比如labelme、PIL、numpy等,因此在回答中应该包含安装命令。此外,代码示例需要详细注释,方便用户理解每一步的作用。 另外,用户可能关心如何处理多个类别,所以需要说明如何为不同的类别分配不同的标签值,并可能提到修改代码以适应多类别的情况。例如,每个形状的类别名称对应不同的标签值,可以在代码中添加一个字典来映射类别名到标签值。 最后,需要提醒用户验证生成的掩码是否正确,比如可视化检查,确保掩码与原始图像对齐,并且每个区域正确标注。可能还需要处理图像的不同尺寸,确保掩码图与原图尺寸一致。 总结一下,回答的结构应该是:安装必要的库,解析JSON文件,创建掩码图的步骤,代码示例,多类别处理,验证方法,以及常见问题或注意事项。这样用户能够按步骤操作,并根据需要调整代码。</think>以下是使用Python从LabelMe的JSON文件生成二进制掩码图的详细步骤: --- ### **1. 准备工作** **安装依赖库**: ```bash pip install labelme numpy pillow opencv-python ``` --- ### **2. 核心步骤** #### **(1) 解析JSON文件** LabelMe的JSON文件中包含: - 图像尺寸(`imageHeight`, `imageWidth`) - 标注的多个形状(`shapes`),每个形状包含: - `label`:类别名称(如"cat") - `points`:多边形坐标点列表(格式:`[[x1,y1], [x2,y2], ...]`) #### **(2) 创建空白掩码** 初始化一个全零的numpy数组(背景默认为0): ```python import numpy as np mask = np.zeros((height, width), dtype=np.uint8) ``` #### **(3) 填充多边形区域** 遍历所有标注形状,将对应类别标签值写入掩码: ```python import cv2 for shape in json_data["shapes"]: label = shape["label"] points = np.array(shape["points"], dtype=np.int32) # 用类别ID填充多边形(例如:1表示"cat") cv2.fillPoly(mask, [points], color=1) ``` --- ### **3. 完整代码示例** ```python import json import cv2 import numpy as np from PIL import Image def json_to_mask(json_path, output_path): # 读取JSON文件 with open(json_path, "r") as f: data = json.load(f) # 获取图像尺寸 height = data["imageHeight"] width = data["imageWidth"] # 创建空白掩码 mask = np.zeros((height, width), dtype=np.uint8) # 遍历所有标注形状 for shape in data["shapes"]: label = shape["label"] points = np.array(shape["points"], dtype=np.int32) # 为不同类别分配标签值(例如:1表示前景) if label == "cat": cv2.fillPoly(mask, [points], color=1) # 保存掩码为PNG图像 Image.fromarray(mask * 255).save(output_path) # 0=黑,255=白 # 示例调用 json_to_mask("labelme_annotation.json", "mask.png") ``` --- ### **4. 多类别处理** 如果存在多个类别(如"cat", "dog", "background"),需定义**标签映射字典**: ```python label_map = { "background": 0, "cat": 1, "dog": 2 } for shape in data["shapes"]: label = shape["label"] cv2.fillPoly(mask, [points], color=label_map[label]) ``` --- ### **5. 验证掩码正确性** - **可视化检查**:用图像查看工具打开掩码图,确认区域是否与标注一致 - **代码检查**:使用OpenCV显示掩码与原图叠加效果: ```python image = cv2.imread("original_image.jpg") mask = cv2.imread("mask.png", 0) overlay = cv2.addWeighted(image, 0.7, cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR), 0.3, 0) cv2.imshow("Overlay", overlay) cv2.waitKey(0) ``` --- ### **常见问题** 1. **坐标溢出**:确保多边形坐标不超过图像尺寸(LabelMe会自动限制) 2. **标签冲突**:同一像素被多个多边形覆盖时,后绘制的标签会覆盖前值 3. **非多边形标注**:如果是矩形/圆形标注,需改用`cv2.rectangle()`或`cv2.circle()` --- 通过以上步骤,您可以将LabelMe的标注换为深度学习模型可直接使用的掩码图。如果需要批量处理,可遍历所有JSON文件并循环调用上述函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@BangBang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值