FCN制作标准的多类数据集【matlab版本】

代码下载: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版的制作多类数据集代码分四步:

  1. 调整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');

  1. 上色

颜色表的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】

猜你喜欢

转载自blog.csdn.net/weixin_38632246/article/details/83868634