fcn+caffe+voc2012實驗記錄


參考博客:

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操作,生成和原圖像一樣的尺寸,這就實現了不管輸入的圖片尺寸是多少,經過全卷積神經網絡的結果圖片和原圖的尺寸都是相同的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM