欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

fcn数据集制作及训练自己的数据集

程序员文章站 2024-03-19 18:27:22
...
经过数天的爬坑,终于搞定了fcn数据集制作及训练自己的数据集。caffe安装是一个痛苦的过程,没有去编译caffe源码,是用anaconda安装的,有需求的同学可以自行百度一下。下面来讲讲怎么制作自己的数据集。

1.制作自己的数据集

我自己的数据集是包括原图及每张原图对应的mask图。这里讲两种方法,一是修改自己的数据集格式,二是修改源码。

1.1修改自己的数据集格式

看caffe fcn8源码中,要求数据为原图和.mat格式的label,首先要处理自己mask图,使其中背景的像素值为0,第一类的像素值为1,往后依次类推。再使用下面的代码制作.mat文件。


clc
clear
% im=imread(‘C:\Users\Administrator\Desktop\1.png’);
dirction=’C:\Users\sk\Desktop\road_line\T4\img_label’;
Path=dir(fullfile(dirction,’*.png’));
for k=1:numel(Path)
imPath=fullfile(dirction,Path(k).name);
im=imread(imPath);
[row col]=size(im); %图片的尺寸
bd=cell(1,33);
bd(:)={logical(sparse(row,col))}; %在一个元胞数组中预载33个全零稀疏矩阵,背景0不算
N=unique(im); %图片分成多少类
if N(1)==0 %排除背景像素
N=N(2:numel(N),1);
end
for i=1:numel(N)
[x y]=find(im==N(i)); %找到图片中标号为一类的所有坐标
flog=1;
for t=1:numel(x)
if ((x(t)-1)==0)||((y(t)-1)==0)||((x(t)+1)>row)||((y(t)+1)>col) %找到边界线点,排除他
continue;
else
if (im(x(t)-1,y(t))~= N(i))||(im(x(t)+1,y(t))~= N(i))||(im(x(t),y(t)-1)~= N(i))||(im(x(t),y(t)+1)~= N(i)) %找到一类图像上的边框点
X(flog)=x(t);
Y(flog)=y(t);
flog=flog+1;
end
end
end
val=zeros(row,col); %创建输入图像大小的全零矩阵
val((Y-1)*row+X)=1; %将其一类图像的的边框存入全零矩阵
bd(N(i))={logical(sparse(val))}; %将这个带有图像边框的矩阵以稀疏矩阵的方式存入元胞数组对应的边框分类中
X=zeros(0);Y=zeros(0); % X,Y矩阵归零处理,方便下次重新存储坐标
end
GTcls.Boundaries=bd;
GTcls.Segmentation=im;
GTcls.CategoriesPresent=N’;
save_path=fullfile(‘C:\Users\sk\Desktop\road_line\T4\cls’,strcat(Path(k).name(1:5),’.mat’));
save(save_path,’GTcls’);
end

1.2修改源码

可以看到如下图中,voc_layers.py中读入标签时源码是.mat格式读入的,可以修改为下面注释后的形式,就可以直接读入png格式的图片了


def load_label(self, idx):
“””
Load label image as 1 x height x width integer array of label indices.
The leading singleton dimension is required by the loss.
“””
import scipy.io
mat = scipy.io.loadmat(‘{}/cls/{}.mat’.format(self.sbdd_dir, idx))
label = mat[‘GTcls’][0][‘Segmentation’][0].astype(np.uint8)
label = label[np.newaxis, …]
return label

# def load_label(self, idx):
#     """
#     Load label image as 1 x height x width integer array of label indices.
#     The leading singleton dimension is required by the loss.
#     """
#     im = Image.open('{}/cls/{}.png'.format(self.sbdd_dir, idx))
#     label = np.array(im, dtype=np.uint8)
#     label = label[np.newaxis, ...]
#     return label


现在通过上述方法就可以使用自己的数据集来训练了。

2.训练自己的数据

这里只指明需要修改的地方。将下图solver.py中的weights地址,

sovler地址,val地址修改为自己的地址。fcn数据集制作及训练自己的数据集
solver.prototxt中修改对应的train_net,text_net地址,及模型保存位置snapshot_prefix。fcn数据集制作及训练自己的数据集
修改train.prototxt中的sbdd_dir对应的地址,修改到dataset目录即可,test.prototxt的地址做对应修改。笔者的dataset及voc目录如下图所示,笔者比较懒,是仿照fcn8s的数据格式,把自己的数据贴进去的。fcn数据集制作及训练自己的数据集fcn数据集制作及训练自己的数据集fcn数据集制作及训练自己的数据集
dataset中cls存放的是png格式的mask图片或者转为.mat格式的标签,img中存放的是原始图片,train.txt中是用于训练的图片的前缀名称,一行一个,不需要后缀,val.txt中是用于验证的图片名称。fcn数据集制作及训练自己的数据集
如果读者的分类加上背景不是为21类,则还需要修改train.txt,test.txt,deploy.txt中输入通道数为21的位置,修改为读者数据的分类树x+1(背景),并修改对应layer名称,可直接在后面加_n。
至此就可以训练该模型了。由于笔者使用ubuntu系统还不太习惯,文档中图片没有注释,且第一次写博客,格式可能会有些乱。
该篇博客主要参考了supe_king的博客,现贴出链接,需要的可以去看看。
fcn下数据集制作
fcn下数据集制作简化
fcn详细教程