用灰度图像训练FCN(一步一步从训练到验证带你实践FCN)
首先我们假定已经成功编译Caffe,并且已经拥有了caffe的Python接口,如果这些没有做好,下面很难成功,配置的话主要还是环境变量的问题,在这里也是遇到了很大的麻烦,关于环境变量怎么配置之后再写一篇说明。
遇到的问题:
首先记录一下可能遇到的一些问题,遇到问题不要慌,多谷歌、多分析、多和别人交流问题就可迎刃而解:
发一个有情链接,几个比较好的Caffe讨论群吧,
- status == CUDNN_STATUS_SUCCESS (4 vs. 0) CUDNN_STATUS_INTERNAL_ERROR Check failure stack trace: Aborted (core dumped) 报这个错,大概是因为当前的CuDNN和CUDA版本不匹配造成的,重新更新一下版本大概可以解决。
- warning: libOpenCV_core.so.3.1, needed by //usr/local/lib/libopencv_imgcodecs.so, may conflict with libopencv_core.so.2.4 报这个错是opencv版本冲突,使用命令 sudo apt-get autoremove libopencv-dev 一般可以解决。
- Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR 这个问题一般都是因为输入除了问题,请检查一下输入的数据集的格式,一定保证是三通道的,如果是2值单通道的灰度图像可以选择使用matlab进行转换,具体可以参照之前的一篇博客
发一个有情链接,几个比较好的Caffe讨论群吧
- 453955686 Caffe 深度学习交流群3
- 560233379 图像语义分割
- 287096310 AI人工智能机器学习
- 255482257 Caffe人工智能Tensorflow
- 91734887 caffe深度学习交流群
参考链接:
传送门→ 主要参考链接
本篇主要记录的是输入是灰度图片的情况,下一篇再补充输入是RGB图像的情况以及遇到的一些问题。
输入图片是之前一篇文章“对Ultra Sound图像进行预处理”中处理过后的图片,
文件结构:
这里使用的model是官方提供的voc-fcn-alexnet,附上链接→fcn.berkeleyvision.org
对于其它模型大同小异,大家按照实际情况进行更改就可以
还是先看一下文件的结构↓
对文件进行配置:
附图,看一下train集合下的img和cls,val集不做展示(也是差不多的结构)↓
train.txt和val.txt
看一下train.txt和val.txt(第一列的数字是gedit显示的行号,不用理会)
1 | #生成train.txt的代码,这里因为都是数字所以直接就是往文件里面写数字,另一种方法,下一篇中会说明 |
1 | #生成val.txt的代码 |
solver.prototxt
先来配置 solver.prototxt 这里面放的主要是训练过程中的一些参数
1 | #下面2行按照自己的情况配置,还有snaapshot的位置也要进行修改,其它的值我没有改动 |
train.prototxt
具体说明看注释
1 | layer { |
val.prototxt
具体说明看注释
1 | layer { |
voc_layer.py
这个文件是FCN的数据层,我们通过这个文件将数据进行连接,具体说明看注释
这里主要分为两个部分,一个是VOCSegDataLayer,这个类用来指向测试数据。还有一个SBDDSegDataLayer指向训练数据。
1 | import caffe |
solve.py
这个文件也是最后我们需要运行的脚本,相当于Caffe在命令行模式下的train.sh文件,详情看注释
1 | import caffe |
最后在voc-fcn-alexnet下开启终端输入python solve.py就开始训练吧!
测试生成的模型
在测试这里我们就需要往voc-fcn-alexnet文件夹下面再加如几个文件,在之前的基础上加入infer.py文件、deploy.prototxt文件,这两个文件。其中infer.py可以在fcn.berkeleyvision.org-master下面找到,deploy.prototxt需要我们自己创建。
infer.py
先来修改infer.py文件,修改之后可以实现读入一张测试图片,然后用我们在原始模型上fine-tuning得到的model输出一张该测试图片的ground图。详情见注释。
1 | import numpy as np |
deploy.prototxt
这个文件需要我们自己创建,我们只需要复制一下train.prototxt或者val。prototxt再进行一些修改就可以了。
总结来说的过程就是“换头去尾、改中间”。
1 | #首先去掉原来.prototxt文件中的数据层,换成下面的Input层,因为这里我只要输入一张图进行测试 |
在terminal中执行 python infer.py就可以看到输出的结果了(在此过程中遇到的问题请参考下面“笔者在参考博客下面的留言“这部分)。
通过test发现最终标记的还是不够理想,因为数据量还是太少了。所以请继续看下一篇文章,继续对FCN进行训练。
笔者在参考博客下面的留言
是在最上面的那篇博客下面的回复,也是记录了当初自己解决问题的一些历程,希望大家可以顺利的跑出实验结果
自我回复,应该是解决了,对于输出是白色图片的问题,最终感觉是迭代次数不够造成的,因为着急看看model的效果,所以在模型一边训练的过程中就用中间snapshot的生成的中间模型做了测试,但是经过了19个小时吧,10w次迭代全部完成,我再使用最终的模型测试的时候发现就是正常的了。
所以总结起来大概要注意一下几点,希望帮到大家:
- 要将最后的那layer的num_output由原来的21转变成2(即最终的分类数目,如果是3类就改成3,以此类推)
- deconvolution层一定要像楼主写的一样,要改名,但是别删除up
- deploy文件中也要如上面第2点中一样对deconvolution层改名,此外对照官方给出的voc-fcn8的demo还发现deploy文件除了改变了第一层为Input、将最后一层删除还将Dropout层都删除了,所以同样记得将其修改,其它网络同样适用)
- 最好是等到模型全跑完用最后迭代出来的model做测试(幸亏耐心等到了最后,其实我的model跑到一半我看测试的结果不好都想要放弃了,耐心,耐心)
- p.s.然后发现了一个软件teamviewer,就让机子放一晚上自己跑去吧,自己可以远程用这个软件在其他地方远程查看结果
这些大概就是自己的一些新的与体会,希望大家都能成功训练出自己满意的模型,最后还是非常感谢博主这篇文章,Thanks♪(・ω・)ノ
希望大家多多支持 XD