使用FCN训练本身的数据集

最近须要用到FCN来分割一些物体,因此一直在苦苦学习中,光是跑FCN就用了挺久的时间,最重要的是在数据集的格式上。如今作一下总结,针对小白。若是有错误但愿能及时指出。谢谢!html


准备工做

我用的是caffe和fcn,caffe能够从这里得到git

git clone https://github.com/BVLC/caffe.git

caffe的安装能够根据个人另外一片博客深度学习ssd配置并在VGG模型上训练本身的数据来安装。github

fcn使用这个fcn.berkeleyvision.orgubuntu

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

把fcn这个文件放在caffe目录中就能够了,如图:输入图片说明网络

如今准备用voc-fcn32s这个来训练。先把预先须要的模型下载了。在voc-fcn32s/solve.py中能够看到: 输入图片说明app

因此我下载了一个vgg16的模型,地址:VGG_ILSVRC_16_layers函数


准备数据集

这个是最重要的,大部分不成功的缘由都来自这里。 在voc-fcn32/train.prototxt中:输入图片说明 在val.prototxt中 输入图片说明学习

能够看到是使用sbd这个数据集进行训练,使用voc的数据集进行测试。在这里咱们只须要更换'../data/sbdd/dataset'和'../data/pascal/VOC2011'就能够了。测试

**注意: **若是不想使用sdb那种存放数据格式的话,咱们可使用本身的数据格式。ui

打开voc_layers.py文件,能够看到有两个类,一个是处理voc数据集格式的,一个是处理sbd数据集格式的。 对于voc格式来讲,目录的大概结构是这样的

VOC2011
|____JPEGImages
|____SegmentationClass
|____ImageSets
        |______Segmentation
  • JPEGImages中存放.jpg格式的彩色图片
  • SegmentationClass中存放label图片。重点注意: label图片必定是要单通道的!并且每一个像素的值只能是从0开始到N。N为你定义的类别数+1,这个1是背景类,黑的。
  • Segmentation中存放写有图片的名字的train.txt,这个txt的名字要和上面图片中split参数决定,好比train.prototxt的split参数是train,而val.prototxt中的split参数则是seg11valid,因此就要叫作seg11valid.txt。txt文件中的图片名字不带路径和后缀。好比你的图片名字叫a.jpg,bb.jpg,ccc.jpg,那么里面在txt中就写
a
bb
ccc

这些目录结构能够对应代码中的:

# load indices for images and labels
split_f  = '{}/ImageSets/Segmentation/{}.txt'.format(self.voc_dir,self.split)
self.indices = open(split_f, 'r').read().splitlines()
self.idx = 0

...
...
...

def load_image(self, idx):

        im = Image.open('{}/JPEGImages/{}.jpg'.format(self.voc_dir, idx))
        in_ = np.array(im, dtype=np.float32)
        in_ = in_[:,:,::-1]
        in_ -= self.mean
        in_ = in_.transpose((2,0,1))
        return in_


def load_label(self, idx):

        im = Image.open('{}/SegmentationClass/{}.png'.format(self.voc_dir, idx))
        label = np.array(im, dtype=np.uint8)
        label = label[np.newaxis, ...]
        return label

若是想要把sbd的数据集像voc的同样简单的话能够按照这个代码把SBDDSegDataLayer类中的load_label函数改为

def load_label(self, idx):
        im = Image.open('{}/SegmentationClass/{}.png'.format(self.sbdd_dir, idx))
        label = np.array(im, dtype=np.uint8)
        label = label[np.newaxis, ...]
        return label

在load_image函数中的图片路径也须要改一改,还有加载txt的地方也要改一下。


训练

所有改完后就能够开始训练了。若是爆出一下文件找不到问题,那就本身修改下路径。 若是说surger,score找不到 那么修改solve.py文件,把import sys提早,并加入路径,以下:

import sys
sys.path.append('/your-path-to-caffe/caffe/fcn.berkeleyvision.org')
import caffe
import surgery, score

import numpy as np
import os

而后开心的运行这个文件开始训练:

输入图片说明

loss有点大,先观望一下,若是有错误我会及时更新。


后继 发现loss一直很到,直到结束依旧这样。输入图片说明

网上查了下缘由,是说deconvolution layer没有初始化什么的,要加入weight filler 和bias filler,http://www.cnblogs.com/lvlvlvlvlv/p/6353637.html。 fcn中有提示说若是输出或者参数是0的话,能够加个surgery.transplant()

Why are all the outputs/gradients/parameters zero?: This is almost universally due to not initializing the weights as needed. 

To reproduce our FCN training, or train your own FCNs, it is crucial to transplant the weights from the corresponding ILSVRC net such as VGG16. The included surgery.transplant() method can help with this.

而后这个帖子 中发现使用规则

base_net = caffe.Net('vgg16.prototxt', 'vgg16.caffemodel', caffe.TEST)
surgery.transplant(solver.net, base_net)
del base_net

具体实现能够参考这个帖子,对于处理voc-fcn写的很详细。参照这个改完后200次迭代loss就降低了一半。

参考

ubuntu下caffe的FCN8模型训练

caffe GPU版本使用fcn分割本身的图像

caffe下fcn数据集制做的简化

图像分割实验:FCN数据集制做,网络模型定义,网络训练(提供数据集和模型文件,以供参考)

FCN网络训练 终极版

FCN模型训练中遇到的困难

FCN学习:Semantic Segmentation

FCN 论文笔记

FCN-for-semantic-image-segmentation 训练过程的一些坑记录

caffe的FCN的loss居高不下和执行训练命令的脚本有关是怎么回事?

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

用 caffe作图像分割实验时,loss值很诡异

相关文章
相关标签/搜索