1. 程式人生 > >FCN訓練自己的資料集及測試

FCN訓練自己的資料集及測試

1 預設caffe已配置好,直接下載FCN網路模型

將模型檔案放到caffe-master路徑下

2 開啟其中一個資料夾voc-fcn8s

這裡寫圖片描述

3 放置好模型,現在就是配置相關路徑

caffemodel-url中是訓練之前預載入的權值模型的下載地址,開啟這個檔案,並下載這個模型
deploy.protptxt是訓練好模型之後,進行圖片預測的網路模型
net.py是生成網路模型的檔案,暫時用不到
solve.py和solve.prototxt是網路訓練之前一些資料路徑和引數的設定
train.prototxt和val.prototxt不用說了,一個是訓練模型,一個是訓練過程中測試的模型
好下面開始修路徑,開啟solve.py,修改如下圖所示:
這裡寫圖片描述


見圖中畫框的部分,第一個框是載入你python與caffe的介面部分路徑,第二個框是你下載的訓練之前的權值模型,第三個框是不用解釋,至於第四個框是你的訓練資料data裡面的一個路徑,至於segvalid11.txt這個檔案你可能沒有,沒有關係後面給出。還有就是註釋了一條caffe.set_device(int(sys.argv[1]))!!!!
注:如果不想用已有model進行fine-tune,註釋掉19行solver.net.copy_from(weights),後面還需要根據你分的類數進行prototxt檔案的修改,這個後面會提到
修改完這個檔案,開啟solver.prototxt,修改如下:
這裡寫圖片描述

第一個框不用說是什麼路徑很明顯,第二個框是你訓練時儲存的模型地址。其中引數:
test_iter是測試時,一次會測試多少張圖片
display是訓練多少次,終端中展示一次loss值
max_iter是最多訓練多少次(但是似乎這裡不管用,前面solver.py裡面那個才迴圈是關鍵,有興趣的自己可以看看)
snapshot是訓練到多少次儲存一次
其他引數,見> http://blog.csdn.net/q6324266/article/details/52451088
這個設定完成之後,就差最後一步路徑設定了 開啟train.prototxt:
這裡寫圖片描述
修改路徑到dataset的位置,這個dataset就是我們構建的訓練集,後面詳細介紹
同理開啟val.prototxt,修改路徑同train.prototxt。
注:這裡介紹一下param_str這一行,這裡面有4個引數(sbdd_dir,seed,split,mean),sbdd_dir為資料集的路徑(train.prototxt和val.prototxt的這一引數一樣,因我們把訓練集和測試集都放到這一路徑下),split為生成的txt檔名(訓練集生成一個,測試集生成一個)。其他引數還沒有仔細研究

4 開始訓練

配置路徑之後,在終端中cd到caffe-master目錄下,執行sudo python fcn.berkeleyvision.org-master/voc-fcn8s/solve.py 即可開始訓練,如果出現什麼問題,不要緊張,根據提示,一步步修改,一般問題不大。

上面基本按照博主supe_king的步驟來進行

關於自己訓練集的設定也是參照supe_king的步驟來做

我們的資料集都是使用的原圖片,沒有轉化為mat等其他格式的檔案,但原FCN模型中程式設定為需要輸入mat檔案,所以我們對其進行修改
我們先開啟fcn下voc_layers.py這個檔案,裡面我們可以看到 class VOCSegDataLayer(caffe.Layer):和 class SBDDSegDataLayer(caffe.Layer) 這兩個類,第一個是測試時資料輸入呼叫的python類,第二個是訓練時資料輸入呼叫的python類。而這類裡面,分別是對輸入資料的一些預處理操作。
我們只要進入class VOCSegDataLayer(caffe.Layer)這個類,copy出def load_label(self, idx):這個函式,
這裡寫圖片描述
將其複製到class SBDDSegDataLayer(caffe.Layer)類下,並註釋掉原始碼,並修改voc_dir為sbdd_dir
這下就直接讀取影象檔案而不用轉換成mat了。
然後就是修改路徑了,
這裡寫圖片描述
根據每個人的情況修改SegmentationClass這個路徑,大家可以看到其前後各有兩個{},後面的idx為圖片名稱,根據生成的txt來讀取。
前面講的更改prototxt檔案,看你分幾類,我這邊是分的兩類,把裡面後幾層num_output輸出改為2即可。(如果需要用已有模型fine-tune的話再改num_output為2的所在層的名字就可以了)

5 測試

測試程式碼在fcn.berkeleyvision.org-master檔案下的infer.py

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import caffe
# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
im = Image.open('data/skin/val/ISIC_0000001.jpg')
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1]
in_ -= np.array((104.00698793,116.66876762,122.67891434))
in_ = in_.transpose((2,0,1))

# load net
net = caffe.Net('voc-fcn32s/deploy.prototxt', 'voc-fcn32s/model_2/_iter_10000.caffemodel', caffe.TEST)
# shape for input (data blob is N x C x H x W), set data
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_       #read image
# run net and take argmax for prediction
net.forward()      #in forward NN
out = net.blobs['score'].data[0].argmax(axis=0)     #image 

print net.blobs['score'].data[0].shape
print net.blobs['score'].data[0].argmax(axis=0)
print out.shape
plt.imshow(out,cmap='gray');plt.axis('off')
#plt.savefig('test.png')
plt.show()

我在裡面加了幾行程式碼,用於輸出分割的圖片。(我現在可能引數設定的有問題,或者時資料集的原因,訓練的不好,我也在找問題,不過大家至此可以將FCN跑起來了)