最近有一个工作需要使用Unet的语义分割结果作为上游任务,语义分割数据集需要自己制作,特此记录一下。

1、下载labelme

  第一步当然是下载labelme工具,主要有两种方式:
  1. 系统下可执行程序,如Win下的exe
  2. python脚本,通过执行python脚本运行程序,好在labelme已经被打包成为pip包
  这里就不展开了,下载、使用方法,官方讲的比我详细:labelme下载传送门
  

2、标注完成之后

  目录结构大概这样:
  
  其中标注完之后的原图放在before里,即每张图片和对应的json文件。
  
  class_name.txt主要是语义信息,例如我要分割出桥墩,那么就是。这个语义信息和labme里的是对应的,后面会用到
  

3、数据格式转换

  执行两个python脚本转换数据格式,代码如下:
  1、先执行 json_to_dataset.py

import argparse
import json
import os
import os.path as osp
import warnings
import imgviz
import PIL.Image
import yamlfrom labelme import utils
import base64def main():count = os.listdir("./before/") for i in range(0, len(count)):path = os.path.join("./before", count[i])# 找到before文件中以json为结尾的文件并且打开if os.path.isfile(path) and path.endswith('json'):data = json.load(open(path))if data['imageData']:imageData = data['imageData']else:imagePath = os.path.join(os.path.dirname(path), data['imagePath'])with open(imagePath, 'rb') as f:imageData = f.read()imageData = base64.b64encode(imageData).decode('utf-8')img = utils.img_b64_to_arr(imageData)label_name_to_value = {'_background_': 0}for shape in data['shapes']:label_name = shape['label']if label_name in label_name_to_value:label_value = label_name_to_value[label_name]else:label_value = len(label_name_to_value)label_name_to_value[label_name] = label_value# label_values must be denselabel_values, label_names = [], []for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):label_values.append(lv)label_names.append(ln)assert label_values == list(range(len(label_values)))lbl, _ = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)# captions = ['{}: {}'.format(lv, ln)#     for ln, lv in label_name_to_value.items()]# lbl_viz = utils.labelme_shapes_to_label(lbl, img, captions)label_names = [None] * (max(label_name_to_value.values()) + 1)for name, value in label_name_to_value.items():label_names[value] = name# 4# lbl_viz = imgviz.label2rgb(#     lbl, imgviz.asgray(img), label_names=label_names, loc="rb"# )out_dir = osp.basename(count[i]).replace('.', '_')out_dir = osp.join(osp.dirname(count[i]), out_dir)out_dir = osp.join("output",out_dir)if not osp.exists(out_dir):os.mkdir(out_dir)# imagePIL.Image.fromarray(img).save(osp.join(out_dir, 'img.png'))# label.pngutils.lblsave(osp.join(out_dir, 'label.png'), lbl)# PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))# label_viz.png# PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, "label_viz.png"))with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:for lbl_name in label_names:f.write(lbl_name + '\n')# warnings.warn('info.yaml is being replaced by label_names.txt')# info = dict(label_names=label_names)# with open(osp.join(out_dir, 'info.yaml'), 'w') as f:#     yaml.safe_dump(info, f, default_flow_style=False)print('Saved to: %s' % out_dir)if __name__ == '__main__':main()

  2、再执行draw_label_png.py

import os
from PIL import Image
import numpy as np# 文件路径处理
root = os.getcwd()
before = os.path.join(root, "before")
output = os.path.join(root, "output")
assert(os.path.exists(before)), "please check before folder"
assert(os.path.exists(output)), "please check output folder"
jpg = os.path.join(root, "jpg")
png = os.path.join(root, "png")
if not os.path.exists(jpg):os.mkdir(jpg)
if not os.path.exists(png):os.mkdir(png)def main():# 读取原文件夹count = os.listdir("./before/") for i in range(0, len(count)):# 如果里的文件以jpg结尾# 则寻找它对应的pngif count[i].endswith("png"):path = os.path.join("./before", count[i])img = Image.open(path)# 对应原图像未标注 则遍历下一张图片if not os.path.exists("./output/" + count[i].split(".")[0] + "_json/label.png"):continueimg.save(os.path.join("./jpg", count[i]))# 找到对应的pngpath = "./output/" + count[i].split(".")[0] + "_json/label.png"img = Image.open(path)# 找到全局的类class_txt = open("./before/class_name.txt","r")class_name = class_txt.read().splitlines()# ["bk","cat","dog"] 全局的类# 打开x_json文件里面存在的类,称其为局部类with open("./output/" + count[i].split(".")[0] + "_json/label_names.txt","r") as f:names = f.read().splitlines()# ["bk","dog"] 局部的类# 新建一张空白图片, 单通道new = Image.new("P", (img.width, img.height))# 找到局部的类在全局中的类的序号for name in names:# index_json是x_json文件里存在的类label_names.txt,局部类index_json = names.index(name)# index_all是全局的类,index_all = class_name.index(name)# 将局部类转换成为全局类# 将原图img中像素点的值为index_json的像素点乘以其在全局中的像素点的所对应的类的序号 得到 其实际在数据集中像素点的值# 比如dog,在局部类(output/x_json/label_names)中它的序号为1,dog在原图中的像素点的值也为1.# 但是在全局的类(before/classes.txt)中其对应的序号为2,所以在新的图片中要将局部类的像素点的值*全局类的序号,从而得到标签文件new = new + (index_all*(np.array(img) == index_json))new = Image.fromarray(np.uint8(new))# 将转变后的得到的新的最终的标签图片保存到make_dataset/png文件夹下new.save(os.path.join("./png", count[i].replace("jpg","png")))# 找到新的标签文件中像素点值的最大值和最小值,最大值为像素点对应的类在class_name.txt中的序号,最小值为背景,即0print(np.max(new),np.min(new))if __name__ == '__main__':main()

  如果有不理解的,可以对照这两段代码看。很多细节都在代码里。
  注意更改自己的路径。

4、移动到U-Net目录下

  这一步具体看U-net的项目说明就可以,传送门

【语义分割数据集制作】使用labelme制作自己的U-net语义分割数据集相关推荐

  1. 基于 Labelme 制作手部关键点数据集 并转 COCO 格式

    Labelme 制作手部21个关键点数据 1:环境准备 1.1 基础环境 1.2 安装 Labelme 1.2.1:创建anaconda虚拟环境 1.2.2:激活虚拟环境 1.2.3:安装labelm ...

  2. 使用labelme制作自己的深度学习图像分割数据集

    要实现深度学习图像分割应用,首先要获取图像分割标注数据,比如PASCAL VOC.COCO.SBD等大型数据集,但这些数据集主要用于训练预训练模型和评价分割模型精度性能,针对实际应用还需要我们根据项目 ...

  3. labelme制作数据集:将标注好的json文件,转换成类似VOCdevkit数据集中的SegmentationClass(标注技巧)

    1.VOCdevkit数据集 JPEGImages目录:里面放的是原始图片 SegmentationClass目录:放的是json_to_dataset.py处理后的png图片,如下图: 2.制作类似 ...

  4. 在Win10系统中使用labelme制作图像分割标签数据

    在Win10系统中使用labelme制作图像分割标签数据 文章目录 在Win10系统中使用labelme制作图像分割标签数据 前言 一. 安装labelme3.16.2 1. 安装Anaconda(若 ...

  5. [转载] python实现语义分割_使用Keras实现深度学习中的一些语义分割模型

    参考链接: Keras中的深度学习-数据预处理 Keras-Sematic-Segmentation 使用Keras实现深度学习中的一些语义分割模型. 配置 tensorflow 1.13.1+ten ...

  6. 古籍制作 - 古书制作 - 古籍制作工具 - 古籍制作软件 - 古籍修复工具 -古籍修复软件 - 古书制作软件 - 古书修复工具 - 古籍修复软件 -古籍修复软件

    古籍制作 - 古籍制作工具 - 古籍制作软件 - 古籍修复工具 -古籍修复软件 - 古书制作 - 古书制作软件 - 古书修复工具 - 古籍修复软件 -古籍修复软件 前言 自己开发的古籍制作工具 一.看 ...

  7. 语义分割-Unsupervised Domain Adaptation in Semantic Segmentation:a Review语义分割中的无监督领域自适应:综述

    Unsupervised Domain Adaptation in Semantic Segmentation:a Review语义分割中的无监督领域自适应:综述 0.摘要 1.介绍 1.1.语义分割 ...

  8. CVPR 2022 | 腾讯优图实验室30篇论文入选,含场景文本语义识别、3D人脸重建、目标检测、视频场景分割和视频插帧等领域...

    关注公众号,发现CV技术之美 本文转载自腾讯优图 近日,CVPR 2022官方公布了接收论文列表(CVPR 2022 接收论文公布! 总计2067篇!),来自腾讯优图实验室共计30篇论文被CVPR收录 ...

  9. 计算机动画制作 实验要求,A074计算机动画制作实验——动画制作初步

    计算机动画制作实验--动画制作初步 计算机动画制作实验--动画制作初步 设计者 庞岩 单位 海南海口实验中学 e_mail technic88@http://doc.xuehai.net 案例名称 计 ...

  10. deepinu盘制作工具_u盘启动盘制作工具怎么制作 u盘启动盘制作工具制作方法【详细步骤】...

    在电脑城很多技术人员都会使用u盘装系统的方法给用户电脑安装系统,他们是怎么操作的呢?其实很简单,就是通过u盘启动盘来安装系统的.而u盘启动盘是需要用 u盘启动盘制作工具 来制作的.那么问题又来了,u盘 ...

最新文章

  1. Java主线程等待所有子线程执行完毕再执行解决办法(转)
  2. mvc3 之三 符号列表
  3. 将word文档按分页另存为多个word文件的VBA代码
  4. 三次握手和四次挥手详细介绍
  5. 软件版本号命名规范_如何才能给文件合理命名,提高工作效率?我有3个建议!...
  6. isFinite使用说明
  7. Ubuntu 10.04编译安装insigh-6.8-1
  8. 用php实现拍照,php中实现视频拍照
  9. 清除zencart分类页多页后面的disp_order sort字符串的方法
  10. 电子元器件/模块供应商汇总
  11. 用python自制一个简单的答题程序
  12. python是什么语言简称为_python为何称为胶水语言
  13. 学Dapr Actors 看这篇就够了
  14. html制作课程导航页面,学成在线页面制作(HTML+CSS部分)(顶部+轮播图部分)...
  15. 科目一常考知识点速记技巧汇总(2022全新版)
  16. Springboot @Schedule 多个定时任务积压解决
  17. reason:The server time zone value '???ú±ê×??±??' is unrecognized or represents more than one time zo
  18. WIN11下连不上车机ADB解决方案1
  19. 机器学习实战2.2. k-近邻算法例子-优化约会网站的配对效果
  20. 火了70年的厨电界“好莱坞大明星”,各种影视剧都用它当道具来提气丨钛空最生活

热门文章

  1. 天融信防火墙NGFW4000配置手册
  2. 修改支付宝服务窗开发者网关
  3. 电力电子技术课程实验:实验二、可控整流电路及pwm逆变电路设计、制作、测试
  4. 好声方可入人心,数美科技智能音频审核方案为音频内容消费保驾护航
  5. 定个小目标,开始更新博客,再唠嗑一下现在的一些心路
  6. 购物类App原型制作分享-Lyst
  7. LeetCode中,python一行代码能干啥?
  8. JAVA多小区物业管理系统源码,Java物业系统源码
  9. 英文字母和汉字的字节长度问题
  10. 汽车ECU通信相关验证项有哪些?