參考博客:
http://blog.csdn.net/haoji007/article/details/77148374
http://blog.csdn.net/jacke121/article/details/78160398
voc數據集下載地址:
https://pjreddie.com/projects/pascal-voc-dataset-mirror/
我習慣於將所有訓練、預測有關的.py .prototxt .caffemodel文件放在一起
將score.py surgery.py voc_layers.py拷貝到voc-fcn32s這個文件夾中。
修改solve.py:
import caffe
import surgery, score
import numpy as np
import os
import sys
try:
import setproctitle
setproctitle.setproctitle(os.path.basename(os.getcwd()))
except:
pass
weights = 'train_iter_100000.caffemodel' #caffe的預訓練模型
deploy_proto = 'deploy_voc_32s.prototxt' #deploy文件
# init
caffe.set_device(int(0))
caffe.set_mode_gpu()
solver = caffe.SGDSolver('solver.prototxt')
#solver.net.copy_from(weights)
vgg_net=caffe.Net(deploy_proto,weights,caffe.TRAIN)
surgery.transplant(solver.net,vgg_net)
del vgg_net
# surgeries
interp_layers = [k for k in solver.net.params.keys() if 'up' in k]
surgery.interp(solver.net, interp_layers)
# scoring
#加載訓練過程中的測試文件
val = np.loadtxt('../data/voc2012/VOCtrainval_11-May-2012/ImageSets/Segmentation/val.txt', dtype=str)
for _ in range(50):
solver.step(2000)
score.seg_tests(solver, False, val, layer='score')
# N.B. metrics on the semantic labels are off b.c. of missing classes;
# score manually from the histogram instead for proper evaluation
#score.seg_tests(solver, False, test, layer='score_sem', gt='sem')
#score.seg_tests(solver, False, test, layer='score_geo', gt='geo')
在../data/voc2012/VOCtrainval_11-May-2012/ImageSets/Segmentation有train.txt val.txt trainval.txt三個文件,num(trainval)=num(train)+num(val)。
預訓練的模型可以去官網下載。
編輯solver.prototxt文件:
train_net: "train.prototxt"
test_net: "val.prototxt"
test_iter: 736
# make test net, but don't invoke it from the solver itself
test_interval: 999999999
display: 20
average_loss: 20
lr_policy: "fixed"
# lr for unnormalized softmax
base_lr: 1e-10
# high momentum
momentum: 0.99
# no gradient accumulation
iter_size: 1
max_iter: 100000
weight_decay: 0.0005
snapshot: 20000
snapshot_prefix: "./train"
test_initialization: false
生成deploy.prototxt文件
data層不變,保留
網絡層照常理不變
去掉loss層
修改train.prototxt和val.prototxt文件
layer {
name: "data"
type: "Python"
top: "data"
top: "label"
python_param {
module: "voc_layers"
layer: "VOCSegDataLayer"
param_str: "{\'voc_dir\': \'../data/voc2012/VOCtrainval_11-May-2012\', \'seed\': 1337, \'split\': \'val\', \'mean\': (104.00699, 116.66877, 122.67892)}"
}
}
module指的是該文件夾下名為voc_layers.py的python文件,layer是該python文件名稱為VOCSegDataLayer的類,該python文件中有兩個類,另一個類不管。設置voc_dir為對應的路徑。Train.prototxt和val.prototxt文件中作相同的修改。
其中的seed=1337,我也不知道是什么意思。這個mean的參數和siftflow中的值倒是一樣的。
修改voc_layers.py:
該文件中主要是修改VOCSegDataLayer類中的一些路徑和名稱,下面的那個SBDDSegDataLayer不管。
設置voc2012數據集的路徑
self.voc_dir = params['voc_dir']
加載txt文件
split_f = '{}/ImageSets/Segmentation/{}.txt'.format(self.voc_dir,self.split)
加載圖片
im = Image.open('{}/JPEGImages/{}.jpg'.format(self.voc_dir, idx))
加載標簽圖片
im = Image.open('{}/SegmentationClass/{}.png'.format(self.voc_dir, idx))
voc數據集中的圖片尺寸不固定,圖片的長寬也不相等。
如上圖的網絡結構可以看到,經過上采樣之后,得到一個比原圖大的圖像,然后做crop操作,生成和原圖像一樣的尺寸,這就實現了不管輸入的圖片尺寸是多少,經過全卷積神經網絡的結果圖片和原圖的尺寸都是相同的。