【语义分割】用labelme制作语义分割数据集

1. 打开labelme,导入一张图片。

【语义分割】用labelme制作语义分割数据集_第1张图片

2. 选择标注的形状,这里我选择多边形。

【语义分割】用labelme制作语义分割数据集_第2张图片

3. 开始标注。

【语义分割】用labelme制作语义分割数据集_第3张图片

 

【语义分割】用labelme制作语义分割数据集_第4张图片

4. 保存。

【语义分割】用labelme制作语义分割数据集_第5张图片

5. 解析json文件。

labelme下面的cli文件夹下有一个json_to_dataset.py,链接:json_to_dataset.py。

执行这个python文件。

python json_to_dataset.py D:/dataset/img1.json -o D:/dataset/output

output文件夹里会生成5个文件,分别为:img.png/info.yaml/label.png/label_names.txt/label_viz.png。 

【语义分割】用labelme制作语义分割数据集_第6张图片

这里只是转换一个json文件,如果是转换一批文件的话可以写一个脚本,我命名为batch_json_to_dataset.sh。

num=100
for ((i=1;i

其中num是文件的数量,执行后每个json文件会在output文件夹下生成一个同名的子文件夹。

接下来为标注出来的label.png进行着色。写一个python程序,命名为convert.py。

import PIL.Image
import numpy as np
from skimage import io,data,color
import matplotlib.pyplot as plt

num=100 
for i in range(num):    
    img=PIL.Image.open("D:/dataset/output/img%d/label.png"%i)
    img=np.array(img)
    dst=color.label2rgb(img,bg_label=0,bg_color=(0,0,0))#背景的标签为0,颜色为黑色。分割多个类别时,查看skimage原函数
    io.imsave("D:/dataset/transform/dstlabel%d.png"%i,dst)

如果把路径这些作为参数传入,每次就不需要改代码了。这里为了简单就这样写了。

这是着色之后的结果。

【语义分割】用labelme制作语义分割数据集_第7张图片

但是刚刚着色之后的图是24位png图,但是由于我要用deeplab来训练,而deeplab中的标注图片需要是灰度图着色的图片转为灰度图。python没转成功,可能是代码有问题,暂时还没找到原因,网上找了一段matlab的代码。

dirs=dir('D:/dataset/transform/*.png');
for n=1:numel(dirs)
    strname=strcat('D:/dataset/transform/',dirs(n).name);
    img=imread(strname);
    [x,map]=rgb2ind(img,256);
    newname=strcat('D:/dataset/transform/output',dirs(n).name);
    imwrite(x,map,newname,'png');
end

imwrite(A,map,filename) 将 A 中的索引图像及其关联的颜色图写入由 map filename 指定的文件。

  • 如果 A 是属于数据类型 double 或 single 的索引图片,则 imwrite 通过从每个元素中减去 1 来将索引转换为从零开始的索引,然后以 uint8 形式写入数据。如果 A 中的数据是 single,则在将其写入 GIF 或 TIFF 文件之前将 A 转换为 double

 【语义分割】用labelme制作语义分割数据集_第8张图片

和未转换之前的图像看起来并无差别,是因为用了map这种方式写入,其实已经转换成8位了。

如果直接写入的话因为图像的像素值其实是像素的类别,是非常小的,看起来是一片黑的。

这是matlab看到的值。

【语义分割】用labelme制作语义分割数据集_第9张图片

直接写入。

imwrite(x,newname);

【语义分割】用labelme制作语义分割数据集_第10张图片

注意:真正训练的数据要用这种直接写入的方式,否则在制作tfrecord之前也要去掉colormap。我就是使用了有map的数据制作tfrecord训练,导致最后eval,vis出来的图片是全黑,读到matlab里面元素全是0。

将x的值乘以100的话可以看到灰度图。

imwrite(x * 100,newname);

【语义分割】用labelme制作语义分割数据集_第11张图片

你可能感兴趣的:(深度学习,目标分割)