1. 程式人生 > >caffe GPU版本使用fcn分割自己的影象

caffe GPU版本使用fcn分割自己的影象

折騰好久終於把caffe的fcn影象分割調通,在此記錄一下整個過程

下面介紹正題

使用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的部落格,結合他的部落格應該是可已完成的

上一張我訓練中的圖