(一)数据准备(以SIFT-Flow 数据集为例)
下载数据集:下载地址。
并解压至/fcn.berkeleyvision.org/data/
下,并将文件夹名重命名为sift-flow
。之后,将数据全部resize到500*500
1:(直接用原数据256×256训练的时候出现error == cudaSuccess (2 vs. 0) out of memory
解决方法见:https://stackoverflow.com/questions/33790366/caffe-check-failed-error-cudasuccess-2-vs-0-out-of-memory 显卡内存(3G)太小哦,或者减少batchsize大小。)
附带:python image resize:
from PIL import Image
import os.path
import glob
def convertjpg(jpgfile,outdir,width=500,height=500):
img=Image.open(jpgfile)
new_img=img.resize((width,height),Image.BILINEAR)
new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
for jpgfile in glob.glob("/home/lly/fcn.berkeleyvision.org/data/sift-flow/Images/spatial_envelope_256x256_static_8outdoorcategories/*.jpg"):
convertjpg(jpgfile,"/home/lly/fcn.berkeleyvision.org/data/sift-flow/Images/1")
2:这里一定要注意,/fcn.berkeleyvision.org/data/下本来就有一个文件夹叫sift-flow,千万不要覆盖。同时,这些原本就存在的文件夹里的东西还要全部复制到新解压的sift-flow文件夹下边。你可以先把原本的sift-slow重新命名为sitf-flow_1,然后再解压复制。
(二) 下载预训练模型
下载VGG-16的预训练模型放至/fcn.berkeleyvision.org/ilsvrc-nets/
目录下,并重命名为vgg16-fcn.caffemodel
。
1:特百度网盘搜索下载
2:百度网盘下载:
链接: http://pan.baidu.com/s/1c2d0mBY 密码: pjg
(三)源码修改
1. prototxt文件修改
进入siftflow-fcn32s
文件夹下,将test.prototxt
和trainval.prototxt
中的fc6
和fc7
分别替换为其他名称,例如:fc6_new
和fc7_new
。
原因是我们下载的预训练模型VGG-16原模型中包含有fc6和fc7这两个全连接层,而在prototxt中,使我们新添加的卷积层,在模型加载时,如果名称一样,而结构数据不同,便会报错。如果改名之后,原来的fc6/7则会被忽略,而使用我们新的层。
2. caffe path的加入
由于FCN代码和caffe代码是独立的文件夹,因此,须将caffe的Python接口加入到path中去。这里有两种方案,一种是在所有代码中出现import caffe
之前,加入:
1 import sys
2 sys.path.append('caffe根目录/python')
另一种一劳永逸的方法是:在终端或者bashrc中将接口加入到PYTHONPATH
中:
export PYTHONPATH=caffe根目录/python:$PYTHONPATH
(四)训练
1 $ cd cd siftflow-fcn32s/ 2 $ python solve.py
训练过程遇到的问题见:
http://www.linuxidc.com/Linux/2017-01/139242.htm
(五).训练完后用得到的model来测试
测试训练的网络:单张图像测试 在fcn源码文件夹,找到infer.py 在第一行加上 import sys sys.path.append(‘/home/my/caffe-master/caffe-master/python’)
net = caffe.Net(‘deploy.prototxt’, ‘siftflow-fcn32s/train_iter_100000.caffemodel’, caffe.TEST) 中,train_iter_100000.caffemodel为训练得到的模型
im = Image.open(‘test.jpg’)为 测试的图片名, plt.savefig(‘test_out.png’)为将测试结果保存为test_output.png
此外 out = net.blobs[‘score’].data[0].argmax(axis=0) 改成 out = net.blobs[‘score_sem’].data[0].argmax(axis=solve.py0)
测试结果,用自己的图测试。http://blog.csdn.net/u010069760/article/details/74923344附问题答惑链接 http://blog.csdn.net/u013059662/article/details/52770198