深度学习图像分割(FCN)训练自己的模型大致可以以下三步:
1.为自己的数据制作label;
2.将自己的数据分为train,val和test集;
3.仿照voc_lyaers.py编写自己的输入数据层。
其中主要是如何制作自己的数据label困扰着大家。
第一步:使用github开源软件进行标注
地址:https://github.com/wkentaro/labelme
第二步:为标注出来的label.png进行着色
首先需要对照VOC分割的颜色进行着色,一定要保证颜色的准确性。Matlab代码:
function cmap = labelcolormap(N) if nargin==0 N=256 end cmap = zeros(N,3); for i=1:N id = i-1; r=0;g=0;b=0; for j=0:7 r = bitor(r, bitshift(bitget(id,1),7 - j)); g = bitor(g, bitshift(bitget(id,2),7 - j)); b = bitor(b, bitshift(bitget(id,3),7 - j)); id = bitshift(id,-3); end cmap(i,1)=r; cmap(i,2)=g; cmap(i,3)=b; end cmap = cmap / 255;对应的颜色类别:
类别名称 R G B background 0 0 0 背景 aeroplane 128 0 0 飞机 bicycle 0 128 0 bird 128 128 0 boat 0 0 128 bottle 128 0 128 瓶子 bus 0 128 128 大巴 car 128 128 128 cat 64 0 0 猫 chair 192 0 0 cow 64 128 0 diningtable 192 128 0 餐桌 dog 64 0 128 horse 192 0 128 motorbike 64 128 128 person 192 128 128 pottedplant 0 64 0 盆栽 sheep 128 64 0 sofa 0 192 0 train 128 192 0 tvmonitor 0 64 128 显示器然后使用python 的skimage库进行颜色填充,具体函数是skimage.color.label2rgb(),这部分代码以及颜色调整我已经完成了,由于代码太长就不贴出来了,有需要的可以私信我。
第三步:最关键的一步
需要注意的是,label文件要是gray格式,不然会出错:scores层输出与label的数据尺寸不一致,通道问题导致的,看下面的输出是否与VOC输出一致。
In [23]: img = PIL.Image.open('F:/DL/000001_json/test/dstfcn.png') In [24]: np.unique(img) Out[24]: array([0, 1, 2], dtype=uint8)其中涉及到如何把24位png图转换为8位png图,直接上代码:
dirs=dir('F:/xxx/*.png'); for n=1:numel(dirs) strname=strcat('F:/xxx/',dirs(n).name); img=imread(strname); [x,map]=rgb2ind(img,256); newname=strcat('F:/xxx/',dirs(n).name); imwrite(x,map,newname,'png'); end待续…