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的部落格,結合他的部落格應該是可已完成的
上一張我訓練中的圖