最近在用deeplab,需要自己标注数据集,整理一下。
制作语义分割数据集大致需要
(1)使用labelme对数据进行标注,生成对应图片的json格式。
(2)执行label下的labelme_json_to_dataset.py文件,生成图片对应文件夹。
(3)通过第二步生成的文件夹,生成语义图片。
(4)将语义图片转化成灰度图。
---------------------------------------------------分割线------------------------------------------------------------------
详细步骤:
(1)下载并安装labelme。windows下labelme安装可以参见我的另一篇博客点击打开链接。
因为我是使用anaconda安装的labelme。在anaconda命令行敲出labelme后,就会出现labelme的界面。打开你需要标注的图片,并进行标注。类似于下面这样
点击Save后会生成改图片对应的json文件。
(2)执行labelme_json_to_dataset.py。我写了一个批量执行的文件,代码如下:
#coding:utf-8
import os
path = 'D:\\data' #path是你存放json的路径
json_file = os.listdir(path)
for file in json_file:
os.system("python E:\Anocado\Anocado3\envs\labelme\Scripts\labelme_json_to_dataset.py %s"
% (path + file)) #使用自己的labelme路径
执行后的结果会生成对应图片的文件夹,里面包括四个文件:img,info,label,label_viz
(3)对生成的文件进行处理。下载https://github.com/hitzoro/FCN-ColorLabel.git中的文件(这个链接从某博客查的,但是忘记博客链接了,原作者见谅)
该链接下有两个文件,我主要对x.py文件进行了修改
import colorlabel
import PIL.Image
import yaml
import os
label_color = {
#这个是你自己的类别和对应的颜色
#例如,'Dog': 'maroon'
#注意:这里的颜色需要是下面颜色列表color中的颜色
}
path = 'D:\\data\\' #你执行第二步时的存储路径
label_path = os.listdir(path)
for label_class in label_path:
img = PIL.Image.open('%s\\label.png' % (path + label_class))
import numpy as np
from skimage import io,data,color
label = np.array(img)
yaml_file = path + label_class + '\\' + 'info.yaml'
print(yaml_file)
with open(yaml_file) as f:
f = yaml.load(f)
classes = f['label_names']
color = [] #颜色列表
c = 1
for i in classes:
if c == 1:
c = c+1
continue
color.append(label_color[i])
#print (color) #颜色列表
dst = colorlabel.label2rgb(label, colors=(tuple)(color), bg_label = 0,bg_color =(0,0,0))
#final = PIL.Image.fromarray(np.uint8(dst * 255))
#final.show()
#final.save('000001.png')
save_path = 'D:\\data' + '\\' + label_class[:-5] + '.png' #你希望将标注图片存储的路径
#print('11111%s' % save_path)
io.imsave(save_path, dst)
执行x.py后,便会生成对应图片的标注图片
(4)由于deeplab中的标注图片需要是灰度图,所以我们需要将第三步生成的标注图片转为灰度图。这一步需要两个文件convert_labels.py和utils.py。这两个文件在点击打开链接中可以找到。
执行
python convert_labels.py original_path name.txt to_path
其中original_path是第三步的存储路径,name.txt中每一行记录一个图片名,to_path是你希望把灰度图存储到那个路径
实际执行时,发现第三个参数只会建立一个目录,而生成的灰度图覆盖了原文件中的图片,所以对原文件图片要做好备份
(5)以上就生成了灰度图,为了检验生成的是否正确,可以在python中执行以下命令
import numpy as np
from PIL import Image
img = Image.open('your path')
img = np.array(img)
np.unique(img)
会出现以下的结果
上面的数字为类别号,对应之前标注的图片中包含的类别。
大功告成!