1. 打开labelme,导入一张图片。
2. 选择标注的形状,这里我选择多边形。
3. 开始标注。
4. 保存。
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。
这里只是转换一个json文件,如果是转换一批文件的话可以写一个脚本,我命名为batch_json_to_dataset.sh。
num=100
for ((i=1;i<num;i++))
do
python json_to_dataset.py dataset/img$i.json -o output/img$i
done
其中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)
如果把路径这些作为参数传入,每次就不需要改代码了。这里为了简单就这样写了。
这是着色之后的结果。
但是刚刚着色之后的图是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
。
和未转换之前的图像看起来并无差别,是因为用了map这种方式写入,其实已经转换成8位了。
如果直接写入的话因为图像的像素值其实是像素的类别,是非常小的,看起来是一片黑的。
这是matlab看到的值。
直接写入。
imwrite(x,newname);
注意:真正训练的数据要用这种直接写入的方式,否则在制作tfrecord之前也要去掉colormap。我就是使用了有map的数据制作tfrecord训练,导致最后eval,vis出来的图片是全黑,读到matlab里面元素全是0。
将x的值乘以100的话可以看到灰度图。
imwrite(x * 100,newname);