环境搭建:
vs2013,编译caffe工程,cuda8.0,cudnn5.1,python2.7。
还需要安装python的一些包。Numpy+mkl scipy matplotlib scikit-image protobuf
Pip install scikit-image的时候,需要注意,下载该模块
Windows版python模块的下载地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
跑实验:
下载fcn的caffe源代码:
https://github.com/shelhamer/fcn.berkeleyvision.org
下载siftflow数据集:
http://www.cs.unc.edu/~jtighe/Papers/ECCV10/siftflow/SiftFlowDataset.zip
将下载的数据放在fcn文件夹下的data目录下,将其重新命名为sift-flow并将原data文件夹下的sift-flow中的文件拷贝到其中,删除原来的。
官方预训练好的模型下载链接:
http://dl.caffe.berkeleyvision.org/
网络比较大,预加载模型,用sift-flow中的图片调整参数。
下载caffemodel,在siftflow-fcn32s目录下根据caffemodel-url 下载预训练好的模型。将下载好的模型放在fcn目录下的siftflow-fcn32s文件夹下。 将fcn目录下的score.py siftflow_layer.py和surgery.py 复制到siftflow-fcn32s的文件夹下。
修改solve.prototxt文件
train_net: "trainval.prototxt"
test_net: "test.prototxt"
test_iter: 200
# 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-12
# high momentum
momentum: 0.99
# no gradient accumulation
iter_size: 1
max_iter: 100000
weight_decay: 0.0005
snapshot:10000 #训练10000次,保存一次模型
snapshot_prefix:"G:/caffe171101/caffe-master/fcn-master/siftflow-fcn16s/train"
test_initialization: false
书写启动文件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 = 'siftflow-fcn8s-heavy.caffemodel'
deploy_proto = 'deploy8.prototxt'
# 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
test = np.loadtxt('../data/sift-flow/test.txt', dtype=str)
for _ in range(50):
solver.step(2000)
# 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')
通过transplant的方式加载网络,会同时加载网络,和copy_from方式的区别在于拷贝参数的同时,改造原来的网络。
进入该目录,运行python solve.py,即可跑该网络。
如果,遇到错误,按照提示,修改路径或其他的一些东西。
对单张图片的预测:testSingleImg.py
import numpy as np from PIL import Image import matplotlib.pyplot as plt import sys sys.path.append('G:/caffe171101/caffe-master/python') import caffe import cv2 #matplotlib inline # load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe im = Image.open('test_img/coast_arnat59.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('siftflow-fcn16s/deploy16.prototxt', 'siftflow-fcn16s/train_iter_100000.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_ # run net and take argmax for prediction net.forward() out = net.blobs['score_sem'].data[0].argmax(axis=0) #print "hello,python!" #plt.imshow(out,cmap='gray'); plt.imshow(out) plt.axis('off') plt.savefig('test_img/coast_arnat59_infer_16s_100000iters.png')
预测:这是用fcn32s的网络,迭代10万次的结果,并不理想
fcn16s,迭代10w次:
fcn8s,迭代10w次:
Sift-flow中的图片都为256*256*3的彩色图片
images保存的是数据,semanticlabels保存的是语义分割标签,一共33类。geolabels保存场景识别标签,一共4类,除去标签-1,就是3类。
所以是分别训练了两个网络,网络的前七层一样。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:fcn+caffe+siftflow实验记录 - Python技术站