FCN训练自己的数据集及测试

1 默认caffe已配置好,直接下载FCN网络模型

https://github.com/shelhamer/fcn.berkeleyvision.org

将模型文件放到caffe-master路径下

2 打开其中一个文件夹voc-fcn8s

FCN训练自己的数据集及测试_第1张图片

3 放置好模型,现在就是配置相关路径

caffemodel-url中是训练之前预加载的权值模型的下载地址,打开这个文件,并下载这个模型
deploy.protptxt是训练好模型之后,进行图片预测的网络模型
net.py是生成网络模型的文件,暂时用不到
solve.py和solve.prototxt是网络训练之前一些数据路径和参数的设置
train.prototxt和val.prototxt不用说了,一个是训练模型,一个是训练过程中测试的模型
好下面开始修路径,打开solve.py,修改如下图所示:
FCN训练自己的数据集及测试_第2张图片
见图中画框的部分,第一个框是加载你python与caffe的接口部分路径,第二个框是你下载的训练之前的权值模型,第三个框是不用解释,至于第四个框是你的训练数据data里面的一个路径,至于segvalid11.txt这个文件你可能没有,没有关系后面给出。还有就是注释了一条caffe.set_device(int(sys.argv[1]))!!!!
注:如果不想用已有model进行fine-tune,注释掉19行solver.net.copy_from(weights),后面还需要根据你分的类数进行prototxt文件的修改,这个后面会提到
修改完这个文件,打开solver.prototxt,修改如下:
FCN训练自己的数据集及测试_第3张图片
第一个框不用说是什么路径很明显,第二个框是你训练时保存的模型地址。其中参数:
test_iter是测试时,一次会测试多少张图片
display是训练多少次,终端中展示一次loss值
max_iter是最多训练多少次(但是似乎这里不管用,前面solver.py里面那个才循环是关键,有兴趣的自己可以看看)
snapshot是训练到多少次保存一次
其他参数,见> http://blog.csdn.net/q6324266/article/details/52451088
这个设置完成之后,就差最后一步路径设置了 打开train.prototxt:
FCN训练自己的数据集及测试_第4张图片
修改路径到dataset的位置,这个dataset就是我们构建的训练集,后面详细介绍
同理打开val.prototxt,修改路径同train.prototxt。
注:这里介绍一下param_str这一行,这里面有4个参数(sbdd_dir,seed,split,mean),sbdd_dir为数据集的路径(train.prototxt和val.prototxt的这一参数一样,因我们把训练集和测试集都放到这一路径下),split为生成的txt文件名(训练集生成一个,测试集生成一个)。其他参数还没有仔细研究

4 开始训练

配置路径之后,在终端中cd到caffe-master目录下,运行sudo python fcn.berkeleyvision.org-master/voc-fcn8s/solve.py 即可开始训练,如果出现什么问题,不要紧张,根据提示,一步步修改,一般问题不大。


上面基本按照博主supe_king的步骤来进行

http://blog.csdn.net/supe_king/article/details/54142973

关于自己训练集的设置也是参照supe_king的步骤来做

http://blog.csdn.net/supe_king/article/details/58121993

我们的数据集都是使用的原图片,没有转化为mat等其他格式的文件,但原FCN模型中程序设置为需要输入mat文件,所以我们对其进行修改
我们先打开fcn下voc_layers.py这个文件,里面我们可以看到 class VOCSegDataLayer(caffe.Layer):和 class SBDDSegDataLayer(caffe.Layer) 这两个类,第一个是测试时数据输入调用的python类,第二个是训练时数据输入调用的python类。而这类里面,分别是对输入数据的一些预处理操作。
我们只要进入class VOCSegDataLayer(caffe.Layer)这个类,copy出def load_label(self, idx):这个函数,
FCN训练自己的数据集及测试_第5张图片
将其复制到class SBDDSegDataLayer(caffe.Layer)类下,并注释掉原代码,并修改voc_dir为sbdd_dir
这下就直接读取图像文件而不用转换成mat了。
然后就是修改路径了,
这里写图片描述
根据每个人的情况修改SegmentationClass这个路径,大家可以看到其前后各有两个{},后面的idx为图片名称,根据生成的txt来读取。
前面讲的更改prototxt文件,看你分几类,我这边是分的两类,把里面后几层num_output输出改为2即可。(如果需要用已有模型fine-tune的话再改num_output为2的所在层的名字就可以了)


5 测试

测试代码在fcn.berkeleyvision.org-master文件下的infer.py

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import caffe
# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
im = Image.open('data/skin/val/ISIC_0000001.jpg')
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1]
in_ -= np.array((104.00698793,116.66876762,122.67891434))
in_ = in_.transpose((2,0,1))

# load net
net = caffe.Net('voc-fcn32s/deploy.prototxt', 'voc-fcn32s/model_2/_iter_10000.caffemodel', caffe.TEST)
# shape for input (data blob is N x C x H x W), set data
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_       #read image
# run net and take argmax for prediction
net.forward()      #in forward NN
out = net.blobs['score'].data[0].argmax(axis=0)     #image 

print net.blobs['score'].data[0].shape
print net.blobs['score'].data[0].argmax(axis=0)
print out.shape
plt.imshow(out,cmap='gray');plt.axis('off')
#plt.savefig('test.png')
plt.show()

我在里面加了几行代码,用于输出分割的图片。(我现在可能参数设置的有问题,或者时数据集的原因,训练的不好,我也在找问题,不过大家至此可以将FCN跑起来了)

你可能感兴趣的:(FCN训练自己的数据集及测试)