您的位置:首页 > Web前端

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

2017-05-19 11:08 316 查看
折腾好久终于把caffe的fcn图像分割调通,在此记录一下整个过程

非常感谢supe_king的几篇博客http://blog.csdn.net/supe_king/article/details/54142973

 

 

下面介绍正题

使用caffe-gpu版本需要先安装python2.7或者python3.5,安装cuda7.5或者cuda8.0,最后相应版本的cudnn,安装方法为:

将cudnn解压到cuda对应的目录中,cuda目录加入环境变量

 

caffe制作自己的数据集

1 训练集

 

 fcn.berkeleyvision.org-master\data\sbdd\dataset\img\    原始图片

 fcn.berkeleyvision.org-master\data\sbdd\dataset\cls\    label图片

 fcn.berkeleyvision.org-master\data\sbdd\dataset\train.txt   图片名称列表

 

2 测试集

 fcn.berkeleyvision.org-master\data\pascal\VOC2011\JPEGImages\     测试用原始图片

 fcn.berkeleyvision.org-master\data\pascal\VOC2011\SegmentationClass\   label图片

 fcn.berkeleyvision.org-master\data\pascal\VOC2011\ImageSets\Segmentation\seg11valid.txt   测试图片列表

 

label为索引模式图片,索引图片我是用ps套索抠图做的。

原始图片长宽最好不要超过500,否则容易造成GPU溢出。

训练网络:

 要训练自己的数据集,首先从voc-fcn8s中的caffemodel-url下载预训练模型,如果不使用这个模型,那么训练不能收敛

 

 然后要修改以下内容:

 

 1 solver.prototxt

  train_net: "G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/train.prototxt"

  test_net: "G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/val.prototxt"

  修改为自己的路径

  

  snapshot_prefix:

  修改为自己保存训练结果的路径

 2 train.prototxt

  layer {

   name: "data"

   type: "Python"

   top: "data"

   top: "label"

   python_param {

   module: "voc_layers"

   layer: "SBDDSegDataLayer"

   param_str: "{\'sbdd_dir\': \'G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/data/sbdd/dataset\', \'seed\': 1337, \'split\': \'train\', \'mean\': (104.00699, 116.66877, 122.67892)}"

   }

  }

  修改为自己的训练数据路径

  

 3 val.prototxt

  layer {

   name: "data"

   type: "Python"

   top: "data"

   top: "label"

   python_param {

   module: "voc_layers"

   layer: "VOCSegDataLayer"

   param_str: "{\'voc_dir\': \'G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/data/pascal/VOC2011\', \'seed\': 1337, \'split\': \'seg11valid\', \'mean\': (104.00699, 116.66877, 122.67892)}"

   }

  }

  修改为自己的测试数据路径

  

 4 deploy,val,train.prototxt

  这三个文件中fc6和fc7层要重命名,并且把最后几层的输出个数调整为自己的分类数。运行时如果报错说

  层名不匹配,则把不匹配的层全部重命名。(我是这么做的  不知道对不对)

 

 5 solver.py

  此文件是python文件,执行训练命令

  执行此文件可能会出现很多缺失模块的问题,根据提示把缺失的模块装上即可,可使用pip

  

  weights = 'G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/vgg16-fcn.caffemodel'

  改为自己的预训练模型路径

  solver = caffe.SGDSolver('G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/solver.prototxt')

  改为自己的路径

  val = np.loadtxt('G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/segvalid11.txt', dtype=str)

  改为自己的测试图片列表文件

  

  for _ in range(25):

   solver.step(400)

  25表示循环25次

  400表示每400次测试一次网络

  总共会迭代 25*400 = 10000次

 

 全部修改以后 在终端执行 python solver.py 即可开始训练

 

图像分割

 

 训练好了网络以后就可以开始图像分割了

 图像分割的命令在fcn.berkeleyvision.org-master\infer.py

 

 对infer.py进行修改即可

 im = Image.open('G:/095.jpg')

 改为需要分割的图片路径

 

 net = caffe.Net('fcn.berkeleyvision.org-master/voc-fcn8s/deploy.prototxt', 'fcn.berkeleyvision.org-master/voc-fcn8s/snapshot/train_iter_8000.caffemodel', caffe.TEST)

 修改为自己的路径

 

 加上

 plt.imshow(out)

 plt.axis('off')

 plt.savefig('G:\\test.jpg')

 可显示与保存分割结果

 

最后,因为原本训练集的label是.mat的数据格式,而我这里是利用简化的数据集,不需要.mat文件

直接使用索引图片即可,因此还要修改一下voc_layers.py文件

复制class VOCSegDataLayer的load_label函数 替换 class SBDDSegDataLayer的load_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

  修改自己的label目录

  

执行python infer.py即可进行图像分割

补充:

 样本均值要改成自己的均值

 

本文只要是参考上面supe_King的博客,结合他的博客应该是可已完成的

 

上一张我训练中的图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  caffe fcn 数据集 label