caffe下用FCN做图像分割,如何制作训练集?

问题:https://www.zhihu.com/question/38553167/answer/116795517
答主主页:https://www.zhihu.com/people/onlytailei/answers

默认排序
铁胆火车侠
铁胆火车侠
西嗯嗯调参狗 / 博士申了三次
14 人赞同了该回答

鉴于有太多人询问具体细节, 末尾更新了一下

原答案:

直接调用GitHub - shelhamer/fcn.berkeleyvision.org: Fully Convolutional Networks for Semantic Segmentation by Jonathan Long*, Evan Shelhamer*, and Trevor Darrell. CVPR 2015.源代码啊,走python layer。

用net.py生成train和test的prototxt,根据自己的数据调整输出层的参数,不要手动设置prototxt。
网络数据输入参考voc_layers.py调入自己的数据,写自己的python layer,可以用h5py,也可以用任何能用python处理的数据格式,直接对口到input和label。

考虑到FCN这篇文章对deconv和upsampling的特殊处理(线性初始化,learning rate 等于0)。建议不要用命令行加载lmdb的方法。

具体就看上面github链接和论文原文吧。


更新:

以voc-fcn32s为例shelhamer/fcn.berkeleyvision.org

net.py是生成prototxt用的

def fcn(split):

    n = caffe.NetSpec()

    pydata_params = dict(split=split, mean=(104.00699, 116.66877, 122.67892),

            seed=1337)

    if split == 'train':

        pydata_params['sbdd_dir'] = '../data/sbdd/dataset'

        pylayer = 'SBDDSegDataLayer'

    else:

        pydata_params['voc_dir'] = '../data/pascal/VOC2011'

        pylayer = 'VOCSegDataLayer'

    n.data, n.label = L.Python(module='voc_layers', layer=pylayer,

            ntop=2, param_str=str(pydata_params))

这段最后说的就是数据输入部分,网络的第一层,data和label来自一个python layer,这个python layer有四个参数,一个module叫voc_layers, 一个layer叫’SBDDSegDataLayer’,一个ntop表示这层输出两个blob(data 和 label),还有一个parame_str就是把上面那些地址,mean值等等以str的形式传参给输入层去解析。

翻译过来就是来自一个voc_layers.py的文件,里面有一个类叫SBDDSegDataLayer。这个voc_layers.py的文件就在根目录下,打开就可看到里面有几个特定的函数。包括set_up,load_image和load_label,然后就可以到caffe是如何一步一步读取原始数据文件的。

set_up 就是处理一下mean值等等一些初始化工作
load image 和 load label就是从自己的文件里读取这两个数据
输入层不用定义backward,没有梯度计算
forward记得要更新下一次迭代的数据index。

很多人问mat文件是怎么生成的那个mat也在这个文件里可以看到,是voc保存label的矩阵形式,应该是用matlab生成的。voc用mat不代表我们必须用mat,可以用任何形式的文件在对应自己定义的python layer里自己定义load_image和load_label的形式就好了。

最后,net.py里的loss层是SoftmaxWithLoss,这个默认如果你要分五类的话,你的标记就得是0,1,2,3,4。voc数据集一共20类,加背景是21类,所以label文件就得是0-20。如果你有一些背景部分不想用来参与loss的计算,这里提供一个ignore_label的参数,可以把背景标记成255,然后这个参数设置成255,之后所有被标记为255的点虽然参与了forward计算,但是不会参与loss的计算,也就不会有反向传播的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值