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

来源:互联网 发布:mpacc研究生生活知乎 编辑:程序博客网 时间:2024/06/08 12:35

折腾好久终于把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的博客,结合他的博客应该是可已完成的

 

上一张我训练中的图