代码下载:https://github.com/huangzicheng/data_code_fcn/tree/master
FCN的数据集都是仿照pascal voc 官方数据集制作的,我们先看看下VOC数据集的格式:
annotation是xml格式的文件,主要是目标检测。FCN数据集主要在这里VOC2012/SegmentationClass下放图像的标签(groundtruth)
groundtruth图片的格式是8位伪彩色图(索引图),这个不是真正的24位RGB图像。可以看下图像处理中是么是索引图的概念,然后用matlab打开图看下内部到底是什么就明白了。就是灰度图加上一张colormap,后面要介绍下。
VOC2012/JPEGImages下放的是原图。 关于trian和val的数据集如何放置,这个参考其他博客https://blog.csdn.net/xiamentingtao/article/details/78696276。我们重点说下如何得到8位的伪彩色图。
一ubuntu下安装:labelme
【这里不得不说在win下和ubuntu下使用labelme是不同的,win下在anaconda环境构建的labelme 生成的json图转dataset时候,得到的直接就是8位伪彩色图,但不要庆幸,如果你做二分割的话,这个没有影响,但是多分类的时候就会出现bug,后面详细说】
pip install labelme
先用labelme 标定每个你想分割的物体,同种类别的要起相同的名字,切记。比如chairs,bed等。
save保存labelme标定的图,会得到json文件,这时需要把json图转化得到png的label图。
labelme_json_to_dataset 11.json
之后会得到的文件夹包含4张图
你需要的是label.png的图,这是16位的。
下来就需要用matlab对label.png图片进行一些处理了,才能成为需要的8位伪彩色图。切记【label.png看起来全是黑的,其实打开看背景全是灰度值0,车的部分是灰度值1,如果有多类标签,相同的类灰度值都是相同的,不同的类灰度值从1,2,3,4…标记,0是背景】。这里还需要注意:
这两张图你标定的时候,首先自己定一个colormap,按照voc的颜色表1对应红色,2对应绿色,3对应黄色,4是蓝色,5是紫色。。
前面提到的bug就是比如,你现在要用labelme标定00064这张图【labelme标定有个规则,无论哪张图,第一类都是1,第二类都是2,以此类推。。】,但是00064和00079的物体顺序明显是不同的,这就需要把json得到的label.png的图像中每一类的灰度值顺序都调整好。
matlab版的制作多类数据集代码分四步:
- 调整json得到的label.png的灰度标签和你定义的类别颜色对应上【灰度对应物体类别】change_i.m文件
I=imread('/home/zhanghuan/tupian/000496_json/label.png');
%I2=Change(I);
idx=find(I==1);
I(idx)=3;
G = uint16(I);
%G = uint16(I2);
%imshow(G);
imwrite(G,'/home/zhanghuan/tupian/000496_json/label1.png');
- 上色
颜色表的abelcolormap.m文件
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;
color.m文件
cdata=imread('/home/shuju/cc/ren/417label.png');
colormap=labelcolormap(256);
%saveas(cdata,colormap,'label2.png');
%[X,map] = rgb2ind
%imwrite(cdata,colormap,'label.png','png');
imshow(cdata,colormap,'border','tight','initialmagnification','fit');
set(gcf,'Position',[0,0,256,256]);
axis normal;
3.上色之后的label.png是24位的RGB图,需要转通道成8位的伪彩色图
change_channel.m
cdata=imread('/home/shuju1/tupian/000600_json/untitled.png');
colormap=labelcolormap(256);
x=rgb2ind(cdata,colormap);
imshow(x,colormap);
imwrite(x,colormap,'/home/shuju1/tupian/dataset/000600.png','png');
大功告成,你得到的图片就是voc 标准的多类数据集groundtruth。【注意voc的groundtruth,是有白色边的,不知道是为了好看还是,但这个在源代码是忽略的ignore 255】