本篇讨论利用caffe进行FCN训练(采用的是pascal-context数据集

1、下载FCN的框架

https://github.com/shelhamer/fcn.berkeleyvision.org
如图是我在windows下的视图
因为不同的数据源和不同的FCN类型的网络结构并不同,对数据源的读取方式也不同,因此有很多分支,本篇博文以pascalcontext-fcn32s为例子讲解fcn的训练过程。
把上面的东西拷进服务器,我是放在 ~/caffe/examples/ 目录下的。文件夹命名为fcn.berkeleyvision.org
进行训练之前要先保证caffe的安装和编译工作已经完成,且make和make pycaffe成功。

2、下载VOC2010数据集


http://host.robots.ox.ac.uk/pascal/VOC/voc2010/#devkit
原始数据集至少要包含以下两个文件:
解压后得到一个文件夹VOCdevkit,放进服务器。
我是放在 ~/caffe/data/pascalvoc/ 目录下的。
输入 
ln –s ~/caffe/data/pascalvoc/VOCdevkit/VOC2010   ~/caffe/examles/fcn.berkeleyvision.org/data/pascal/VOC2010
这是建立软连接,至于为什么到第9步就知道了,至于这个linux命令(ln)就自行百度吧

3、下载pascalcontext数据

http://www.cs.stanford.edu/~roozbeh/pascal-context/
下载如下几个数据:
把这两个压缩包解压后连同那个txt文件一起拷入到服务器中。
放在第一步中那个fcn.berkeleyvision.org文件夹下的data中的pascal-context文件夹中去,以我的路径为例,就应该放入:
~/caffe/examples/ fcn.berkeleyvision.org/data/pascal-context

4、下载预训练model

https://github.com/BVLC/caffe/wiki/Model-Zoo#models-used-by-the-vgg-team-in-ilsvrc-2014
下载完成后更名为vgg16-fcn.caffemodel然后放入fcn.berkeleyvision.org文件夹中去,至于为什么更名我待会儿会提到

5、添加python目录

如果fcn.berkeleyvision.org不在python的搜索目录中,那么就编辑 ~/.bashrc,增加以下一行内容到bashrc中去
export PYTHONPATH="你的路径/fcn.berkeleyvision.org:$PYTHONPATH"
然后logout重新登录后生效


6、更改相关路径

更改pascalcontext-fcn32s文件夹中的train.prototxt和val.prototxt里的路径,把param_str中的context_dir和voc_dir更改为自己的路径
根据我们前面存放文件的路径,这里只需要把../.../data/pascal-context改为../data/pascal-context,把../../data/pascal更改为../data/pascal,就是去掉前面一个../就行

7、创建目录

在fcn.berkeleyvision.org/pascalcontext-fcn32s目录下创建snapshot/train

8、更改层名

由于下载的vgg16layer.caffemodel中也有fc6,fc7和train.txt、val.txt中的fc6、fc7不一致,会导致错误,

所以我们把train.txt、val.txt中的所有fc6、fc7改成fc6x和fc7x,包括里面的blob名,目的是不让这个权重值传过去
如图所示:
这是我截取的训练过程中的日志,若你最后成功进行训练了,就会打印出相关内容
(注意:这一步的设置其实是错误的,这是我第一次尝试的步骤,正确的步骤请看文末我的分割线更新的内容)

9、更正solve.py

也在fcn.berkeleyvision.org目录中有个solve.py,我们需要更改其中一些东西
首先在第一行假如以下内容:
import sys
然后它原来的weights是:
weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'

这里改一下路径,改成:../vgg16-fcn.caffemodel(因为caffemodel我们就放在上一层的文件夹中的,这也是为什么前面让改名的原因,就是为了跟这里一致
然后我们第一步讲到了一个建立软连接的过程,你看一下sovle.py中有一行

这就是为什么建立了一个软连接的原因

10、重新编译

需要把caffe目录下的Makefile.config中的

WITH_PYTHON_LAYER=1

这句打开,然后make clean

再 make all

再 make pycaffe

11、安装python setproctitle包

如果系统缺少setproctitle。执行以下命令安装:

pip install setproctitle

显示以下内容说明安装成功

12、开始训练

在pascalcontest-fcn32s下,输入以下命令开始训练:

python solve.py

然后就会开始搭建layer然后各种信息打印出来开始迭代,

--------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------------

这个占的内存有点大:我的情况如下:

占了将近4个多G的内存

而且还很慢,跑了好几个小时才跑到8000次,

而且8000次的时候出现了 Begin seg tests,然后就一直停在那里一度不知道发生了什么,如图
最后等了好久才又有信息显示出来:
从时间上看,光是这里就隔了将近一个小时吧,所以大家一定要有耐心,然后这里显示的准确度确实还不高
而且从开始算起已经跑了5个小时了才跑了将近9000次,离我们solver中规定的300000次还远的不得了……所以等出结果了我再来更新博文吧

-------------------------------------------------------------------8.15分割线------------------------------------------------------------------------

跑了30个小时之后我发现loss依然很大accuracy依然很小,和开始并没有区别我的天啊o( ̄ヘ ̄o#)
现在直接暂停了这个训练开始找原因,找出原因后会及时更新的……

-----------------------------------------------------------------8.15分割线-------------------------------------------------------------------------
大概知道是什么问题了,本来我以为我的方法和其他网上的博客的方法都一样是不会出问题的,现在看来真的都是那个大家都介绍的方法出问题了。不然为什么没有人把结果贴图贴出来呢? o( ̄ヘ ̄o#)
这个问题是这样的,出在第8步预训练的VGG16的weights的传递过程中,咱们之前把VGG16卷积层的weights拷过去了,然后由于FCN是把全连接层都改成了卷积层,所以我们对于FC6和FC7的处理是直接不要它的权重初值。
就如同我上面第8步所写,这里是有问题的。至于什么问题,我目前是认为那两个层没有设置初始权重导致无法收敛,更为细节的原因我还需要再研究一下

正确的步骤如下:
①我们首先应该运行一下这个文件夹(fcn.berkeleyvision.org/pascalcontext-fcn32s/)里的 net.py
直接输入 python net.py
这个的作用就是把train.prototxt 和val.prototxt按照net.py中所描述的细节设置一遍,你可以理解为把网络和各个Layer初始化一遍,运行完这个之后,你再去看那两个prototxt,应该会发现之前被改动的fc6,fc7又改回来了;

②还是把那两个prototxt中的数据来源改一下,这个是可以改动的,就如第6步中所述,改成你自己合适的路径;

③重点来了,更改solve.py
[cpp] view plaincopy
  1. import sys
  2. import caffe
  3. import surgery, score
  4. import numpy as np
  5. import os
  6. import sys
  7. try:
  8. import setproctitle
  9. setproctitle.setproctitle(os.path.basename(os.getcwd()))
  10. except:
  11. pass
  12. ###############################                                //这两行是我们需要增加的
  13. vgg_weights ='../../VGG16/vgg16-fcn.caffemodel'                //路径请根据自己的位置修改就好
  14. vgg_proto = '../../VGG16/VGG_ILSVRC_16_layers_deploy.prototxt'//路径请根据自己的位置修改
  15. ##############################
  16. # weights = '../vgg16-fcn.caffemodel'  //这个是原来的操作,注释掉
  17. # init
  18. caffe.set_device(int(sys.argv[1]))
  19. caffe.set_mode_gpu()
  20. solver = caffe.SGDSolver('solver.prototxt')
  21. # solver.net.copy_from(weights)        //这个也是原来的操作,注释掉
  22. vgg_net = caffe.Net(vgg_proto,vgg_weights,caffe.TRAIN)  //这里开始的3行都是我们需要增加的
  23. surgery.transplant(solver.net,vgg_net)
  24. del vgg_net
  25. # surgeries
  26. interp_layers = [k for k in solver.net.params.keys() if 'up' in k]
  27. surgery.interp(solver.net, interp_layers)
  28. # scoring
  29. val = np.loadtxt('../data/pascal/VOC2010/ImageSets/Main/val.txt', dtype=str)
  30. for _ in range(50):
  31. solver.step(8000)
  32. score.seg_tests(solver, False, val, layer='score')
  33. ~
  34. ~
  35. ~
  36. ~
④我们这里需要用到 vgg16-fcn.caffemodel 和VGG_ILSVRC_16_layers_deploy.prototxt
caffemodel我们之前已经下载了,prototxt这个其实github上可以搜到,很多的,顺手给个链接把:
https://gist.github.com/northeastsquare/ea30d8e12a1e7c91ac82381f2df8c861

然后把这两个文件放到你sovle.py中写的对应位置去即可

至于为什么这么改?
其实它是先把这个权重值放到了VGG16的网络中,就是vgg_net = caffe.Net(vgg_proto,vgg_weights,caffe.TRAIN)这一句话
然后把vgg_net的权值通过一个函数转化到我现在这个solver.net里面去,surgery.transplant(solver.net,vgg_net)
就是这么一个过程,附上transplant函数的源码以供参考


然后就ok了
输入 python solve.py 0
附上一张成功转换权值的过程图

可以看到fc6和fc7的权重也被合理reshape之后coercing过去了

⑥看一下现在的loss下降的速度
开始时:


1个小时后:


才一个小时就下降到十八万了,这回感觉没毛病了,就等过几天跑完来更新博文了。

-----------------------------------------------------------------8.18分割线--------------------------------------------------------------------------

8-18 14:30的seg tests情况,overall accuracy已经达到了66.06%,mean accuracy达到了49.43%左右。
可见的确是精度在提高,但是真的感觉训练速度很慢,我的Tesla K40C现在用了67个小时了,也才只完了112000迭代,而迭代总数设置的是30 0000, 也就是说如果跑完的话,估计需要180多个小时,粗略的估计是7--8天左右,我的神啊……

--------------------------------------------------------------------8.31分割线------------------------------------------------------------------
最近开学太忙忘了更了,现在贴上最终的结果:


可以看到结果稳定在0.664左右,这与之前的作者给出的准确率是差不多一样的,就百分位上有些小小的区别
作者论文结果如图:

caffe随记(八)---使用caffe训练FCN的pascalcontext-fcn32s模型(pascal-context数据集)相关推荐

  1. pascal行人voc_在Pascal VOC 数据集上训练YOLOv3模型

    上节介绍了<从零开始在Windows10中编译安装YOLOv3>,本节介绍在Pascal VOC 数据集上训练YOLOv3. 第一步,下载并安装YOLOv3训练依赖项. a.下载Pasca ...

  2. Caffe实践】如何利用Caffe训练ImageNet分类网络

    Caffe实践]如何利用Caffe训练ImageNet分类网络 源文章:https://github.com/BVLC/caffe/tree/master/examples/imagenet 由于要使 ...

  3. Caffe学习系列(20):用训练好的caffemodel来进行分类

    caffe程序自带有一张小猫图片,存放路径为caffe根目录下的 examples/images/cat.jpg, 如果我们想用一个训练好的caffemodel来对这张图片进行分类,那该怎么办呢? 如 ...

  4. Ubuntu上用caffe的SSD方法训练Pascal VOC数据集

    实验目的 继caffe和ssd搭建完成,demo也演示完毕,了解一些基本知识后,现在开始训练自己的数据集,在给自己的训练集处理之前,先跟着官方的示例将Pascal VOC数据集训练走一遍,把可能会踩坑 ...

  5. Caffe 在自己的数据库上训练步骤

    回忆ImageNet的步骤:http://caffe.berkeleyvision.org/gathered/examples/imagenet.html Brewing ImageNet This ...

  6. Ubuntu下caffe:用自己的图片训练并测试AlexNet模型

    目录 1.准备图片 2. 将 图片路径写入txt 参考 这篇文章 3.转换格式 还是参考这篇文章 4.训练模型 参考这篇 参考这篇 参考这篇 5.测试模型 看过这篇转换均值文件 看过这篇 ------ ...

  7. windows下训练FCN模型所遇到的问题

    想在windows上训练FCN模型,得有以下几步: 安装python: 1.首先在windows上安装python,最好安装python2.7.最新版python和旧版python有很大的区别. 2. ...

  8. 训练FCN时遇到的问题总结

    按照下面这个博客的教程训练FCN http://blog.csdn.net/wangkun1340378/article/details/70238290 刚开始了出现'SIFFlowSegDataL ...

  9. Caffe学习系列(22):caffe图形化操作工具digits运行实例

    上接:Caffe学习系列(21):caffe图形化操作工具digits的安装与运行 经过前面的操作,我们就把数据准备好了. 一.训练一个model 右击右边Models模块的" Images ...

最新文章

  1. 软件性能测试过程详解与案例剖析_推荐软件测试书籍
  2. css清除浮动的几种方法_CSS 分享几种传统布局方法[上]
  3. 外卖餐饮点餐系统,连锁餐饮,公众号小程序源码2.1.5
  4. AS3 XML全部用法
  5. 移动端页面滚动穿透问题解决方案
  6. HTM皮质学习算法资料
  7. php 多个文件,PHP一个文件显示多个不同页面是什么机制?
  8. Python的基本数据类型(1)
  9. paip.java 调用c++ dll so总结
  10. java读取文件效率优化_java 读文件 性能
  11. R语言利用openxlsx包输出EXCEL报告
  12. [渝粤教育] 北京化工大学 自然辩证法概论 参考 资料
  13. Win10下运行红色警戒2
  14. 巾帼绽芬芳 一起向未来(中篇)
  15. Zalando Postgres Operator 快速上手
  16. 详细说明VScode设置中文,主题更改,文件图标及字体设置
  17. 【JS】 # js获取当前日期,比较日期大小
  18. error C2065: “pair”: 未声明的标识符
  19. arduino如何加载OLED屏幕库
  20. 基本IO函数的使用(open,write,read)(一)

热门文章

  1. boost::weak_from_raw相关的测试程序
  2. boost::proto模块实现在外部指定转换的示例的测试程序
  3. boost::bron_kerbosch_all_cliques用法的测试程序
  4. boost::filesystem模块和boost::timer混合的测试程序
  5. GDCM:gdcm::SplitMosaicFilter的测试程序
  6. ITK:将两个图像加在一起
  7. VTK:网格之ExtractEdges
  8. VTK:图片之ImageText
  9. OpenCV级联识别器cascade recognizer的实例(附完整代码)
  10. Qt Creator操作方法