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

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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
训练自己的数据集,您可以按照以下步骤进行操作: 1. 首先,您需要准备好自己的数据集。可以通过从生活中收集图片或者从网上下载图片来建立数据集。确保数据集中包含正确标注的图像和相应的标签。 2. 下一步是准备数据集的文件夹结构。根据您使用的深度学习框架的要求,创建一个包含图像和标签的文件夹,并按照指定的格式组织数据集。 3. 接下来,您需要将数据集划分为训练集和验证集。这样可以用于训练模型和评估模型的性能。确保在划分数据集时,两个子集的类别分布是相似的。 4. 在数据集准备完成后,您可以使用FCN(全卷积网络)来训练您的数据集。FCN是一种常用的语义分割模型,可以将每个像素分类为不同的类别。 5. 在训练之前,您需要配置模型的参数,如学习率、批量大小和训练迭代次数等。这些参数可以根据您的数据集和任务进行调整。 6. 开始训练模型。您可以使用已经训练好的预训练模型来加快训练过程,并提高模型的性能。在训练过程中,监控模型的损失和准确率,并根据需要进行调整。 7. 训练完成后,您可以使用验证集来评估模型的性能。计算模型在验证集上的准确率、召回率和F1分数等指标,以评估模型的效果。 8. 最后,根据模型的性能和需求,您可以对模型进行调整和优化,以获得更好的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值