本人刚接触这方面不久,在网上搜索了很多文章,发现很多文章都存在一些弊端,自己做了一些总结,方法比较基础,但亲测有效。
首先,我们得有一些原始图片,然后通过labelme标注后得到json文件(labelme使用大家可以去搜一下),接下来我们需要做的是将json文件转换为可用于训练的标签集。
网上很多说python中自带了一个脚本json_to_dataset.py可以转换(路径在python安装路径下,比如我的是在D:\python3.6.7\Lib\site-packages\labelme\cli中),调用方法是在cmd下输入: labelme_json_to_dataset <文件路径>.json,就可以得到标签图片(保存路径就是json文件目录下),但有一个问题就是,一次性只能转换一张标签,这多麻烦啊。于是,很多人写了脚本,可以批量化转换,但就我目前看到批量转换脚本,大多存在着一个致命的问题,就是对于不同图片,他的类别标注是对应不上的(这些脚本只是负责把图送到json_to_dataset.py,并没有对标签进行其他处理),看下图:

从上面两张图片可以看出,两种完全不是同一类别的东西都被赋予相同的颜色(也即相同标签),这肯定不是我们想要的。
然后就想尝试了一个比较官方的方法:先将json文件转换为voc格式的文件(为什么要这样做呢,因为voc格式算是比较官方的格式,针对其的转换程序也是正规的,解决了批量转换和不同类别时被赋予不同的像素的问题),然后就在github上找打了一个voc的转换脚本,链接在这里:https://github.com/wkentaro/labelme/tree/master/examples/semantic_segmentation,里面有教程教你怎么调用,这里就直接写下吧,cmd下输入:
python ./labelme2voc.py(尽量写绝对路径) 图片和json文件存放的路径(放在一起) 保存路径 --labels labels.txt路径(中间都是空格隔开)
这里需要注意的是,你需要将你自己的标签类别制作成一个txt文本(也就是上面调用命令中的labels.txt),你可以仿照上面那个链接中的labels.txt做,这个程序会根据你的类别去转换,然后你就会得到四个文件夹,其中有用的只有两个JPEGImages(原图像),SegmentationClassPNG(voc格式的标签图像),转换后的标签如下图所示:

可以看到,两种不同的东西被赋予了不同的标签,但是这种图片是索引图(索引图是为了增强灰度图的差异性,其实他也是单通道的,只不过每一个灰度都对应着一种颜色),如果你的模型是要求索引图作为标签,那么到这里就已经完成了;如果你的模型是要求灰度图作为标签,那么还得进行第二步转换(错把索引图当做灰度图作为标签,可能出现label out of boundary的错误提示),即将voc格式的索引图转换为可用于训练的灰度图(看上去是全黑的)。这里有两种方法:
1.先读取索引图中各种类别的像素值,然后一一改过来,比如上面球像素值是125,然后遍历就把所有图片中的125的像素值都改为1(表示第一个类别),而红色的是225,就把所有图片中的225都改为2,然后再保存为灰度图格式就可以了。这种方法对于类别较多的就比较麻烦,而且遍历每一个像素值耗时很大。
2.第二种是我在网上找到的转换脚本,很快很好用


"""Removes the color map from segmentation annotations.
Removes the color map from the ground truth segmentation annotations and save
the results to output_dir.
"""
#源程序链接:https://github.com/tensorflow/models/tree/master/research/deeplab/datasets
#该程序用于将voc格式的索引图片转换为可用于语义分割的灰度图片,因为TensorFlow版本的缘故,在原程序上做了少许改动
#tf.__version__==1.12import glob
import os.path
import numpy as np
from PIL import Image
import tensorflow as tf#FLAGS = tf.compat.v1.flags.FLAGS
FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_string('original_gt_folder',#读取voc格式的png图片路径'F:\Dataset_segmentaion\data_dataset_voc\SegmentationClassPNG',#default'Original ground truth annotations.')#help
tf.flags.DEFINE_string('segmentation_format', 'png', 'Segmentation format.')
tf.flags.DEFINE_string('output_dir',#保存路径'F:\Dataset_segmentaion\data_dataset_voc\labels','folder to save modified ground truth annotations.')def _remove_colormap(filename):"""Removes the color map from the annotation.Args:filename: Ground truth annotation filename.Returns:Annotation without color map."""return np.array(Image.open(filename))def _save_annotation(annotation, filename):"""Saves the annotation as png file.Args:annotation: Segmentation annotation.filename: Output filename."""pil_image = Image.fromarray(annotation.astype(dtype=np.uint8))'''with tf.io.gfile.GFile(filename, mode='w') as f:#with open(filename, mode='w') as f:print(f)pil_image.save(f, 'PNG')'''pil_image.save(filename)def main(unused_argv):# Create the output directory if not exists.if not os.path.exists(FLAGS.output_dir):os.makedirs(FLAGS.output_dir)#if not tf.io.gfile.isdir(FLAGS.output_dir):#tf.io.gfile.makedirs(FLAGS.output_dir)annotations = glob.glob(os.path.join(FLAGS.original_gt_folder,'*.' + FLAGS.segmentation_format))for annotation in annotations:raw_annotation = _remove_colormap(annotation)filename = os.path.basename(annotation)[:-4]_save_annotation(raw_annotation,os.path.join(FLAGS.output_dir,filename + '.' + FLAGS.segmentation_format))if __name__ == '__main__':#tf.compat.v1.app.run()tf.app.run()

只需要将上面存放voc格式的png图像路径以及保存路径改成你自己的路径即可,转换后的图片是这样的:

你没有看错,就是全黑的,但只是看上去,除了背景像素值为零,其他的像素值不是零(可以调用np.unique(image)看看),比如你有21个类别,那么,对应的像素就是0-21,但看上去就是一团黑,不好分辨,因此才有了上面的索引图。到这里,标签图片就只做完成了,希望对大家有帮助。

语义分割标签制作全过程(适合新手)相关推荐

  1. 憨批的语义分割6——制作语义分割数据标签

    憨批的语义分割6--制作语义分割数据集 学习前言 制作工具Labelme Labelme的使用 标签文件内容 学习前言 有些小伙伴问怎么制作数据集,其实我也没有去制作过--所以也要学学啦, 制作工具L ...

  2. 从图片到dataframe——语义分割数据集制作全流程

    分享一下从原始图片,到标记图片,再到转换为python里的数据结构语义分割数据集制作全流程. 安装labelme labelme 是一个图形界面的图像标注软件,可以很方便地划分出多边形边界. 下面在w ...

  3. 统计语义分割标签文件夹中的分割类别以及像素点数目

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.前言 二.代码 2.结果示例 一.前言 提示:统计语义分割标签文件夹中的分割类别以及像素点数目: 二.代码 提示:代码如 ...

  4. 语义分割标签处理RBG 到gray再转回RGB(通用)

    语义分割标签处理RBG 到gray再转回RGB import numpy as np import cv2 import os from PIL import Image# moon 编码过程 地面, ...

  5. MATLAB的iamgeLabeler制作语义分割标签及路径修改

    文章目录 前言 第一次标注的流程 imageLabeler 加载图片 添加标签 标注 标签导出 输出文件解释 imageLabelingSession.mat gTruth.mat和PixelLabe ...

  6. 语义分割 | segnet 制作自己的数据,如何训练,如何测试,如何评价

    本博文介绍如何手把手制作自己的数据集,并使用SegNet网络进行语义分割,如何训练,如何测试自己的分割模型. --------------------------------------------- ...

  7. 【语义分割数据集制作】使用labelme制作自己的U-net语义分割数据集

      最近有一个工作需要使用Unet的语义分割结果作为上游任务,语义分割数据集需要自己制作,特此记录一下. 1.下载labelme   第一步当然是下载labelme工具,主要有两种方式:   1. 系 ...

  8. 图像语义分割样本制作——使用Matlab模块Image Labeler 标记样本

    在进行图像语义分割的时候,需要自己制作数据集,目前开源的标记软件很多,但个人觉得最好用的还是MATLAB中的Image Labeler,下面是简单的使用介绍. 1. 定义各类别说明: 2. 工具栏介绍 ...

  9. 语义分割标签npy文件保存为图片的几种方式详细讨论

    拿到一个分割数据集,总共7类,里面的图片都是.npy格式,为了查看分割标签的情况,现在要将npy文件转为图片格式.首先这个数据集的标签图的像素值是0~6,单通道灰度图,所以标签如果显示成图片的话应该是 ...

最新文章

  1. ionic安装插件常用命令
  2. redis和oracle同步方案,redis与oracle之间怎么实现数据同步?
  3. php 转义md5 和java 转译的区别_CTF|PHP中的命令参数注入
  4. 我来到这世上,却不曾歌唱
  5. mybatis批量写入及批量更新
  6. 《漫步》flash动画制作全记录六
  7. 阿尔法贝塔阀原理_阿尔法(alpha)与贝塔(beta)
  8. 测试内存的频率稳定性软件,超频心得:3000MHz通过1000%稳定性测试_内存硬盘评测-中关村在线...
  9. cordova获取手机IMEI
  10. 用计算机归零,电脑计算器里的清零键是哪个?
  11. 大年初三,字节跳动“线上免费春节档”电影再升级,13部影片登场
  12. 合成大西瓜小游戏微信小程序源码
  13. 特征锦囊:怎么尽可能地修正数据倾斜的特征?
  14. 微信小程序之 开发者工具下载及使用
  15. POSIX 标准介绍
  16. C++学习——基于binance的AS做市模型
  17. 2019年高交会于11月13-17日在深圳会展中心举行
  18. mount挂载失败出现Structure needs cleaning
  19. 音频呼叫界面设计_使用网络音频来增强您的用户界面
  20. 2023上海海事大学计算机考研信息汇总

热门文章

  1. SSR 它到底香不香?细数 SSR 的利与弊
  2. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.qiang.dao.UserM
  3. 梅特卡夫法则(Metcalfe's law)
  4. 算法学习:我终于明白二分查找的时间复杂度为什么是O(logn)了
  5. Python--量化分析师的Python日记【第7天:Q Quant 之初出江湖】
  6. js实现文字霓虹灯效果
  7. 两台计算机如何连接成网络错误,常见网络(连接)错误的解决方法
  8. ASPICE 与 功能安全过程融合 | 单条需求的规范表达形式
  9. Digitalize Your Supply Chain 数字化供应链解析
  10. QT应用编程: 编写MQTT客户端登录OnetNet服务器完成主题订阅与发布