DeepLabV2是由Liang-Chieh Chen等提出的一个图像语义分割网络结构,其主要的创新点在于提出了Atrous convolution(带孔的卷积)结构,从而在增大感受野的同时防止了数据的冗余,提高了逐像素点分类精度,而在最顶层使用的全连接条件随机场(CRF)则精细化了分割边界,现在已经有很多的新的网络基于DeepLab提出.
原文地址: https://arxiv.org/abs/1606.00915
原作者给出了两个版本的DeepLab,一个是shell版本的 http://liangchiehchen.com/projects/DeepLab.html
一个是python版本的:https://github.com/TheLegendAli/DeepLab-Context
python版的好坑,一直是protobuf的版本不对,果断换原作者给的shell版.
由于官方给的.sh文件的下载地址下不了,所以我通过clonegithub上一个人的版本得到:
git clone https://github.com/xmojiao/deeplab_v2
接下来进入正题,安装和运行的步骤主要包含下面几点:
一.安装相关依赖库
matio: sudo apt-get install libmatio-dev
wget: sudo pip install wget
二.编译deeplab版本的caffe
在https://bitbucket.org/aquariusjay/deeplab-public-ver2/overview下载官方给出的源码,然后解压到文件夹aquariusjay-deeplab/code中,在源码中像安装BVLC版本的caffe一样复制Makefile.config文件并进行修改,接着依次运行:
make all -j8
make test
make runtest -j8
make pycaffe
最后添加deeplab版本caffe的python路径到环境变量中.
用source~/.bashrc 生效
三.添加相应的模型文件和prototxt文件
在终端运行(默认你的deeplab源码是clone到deeplab这个目录下):
mkdir -p ~/deeplab/exper/voc12/config/deeplab_largeFOV
mkdir -p ~/deeplab/exper/voc12/features/labels
mkdir -p ~/deeplab/exper/voc12/features2/labels
mkdir -p ~/deeplab/exper/voc12/list
mkdir -p ~/deeplab/exper/voc12/log
mkdir -p ~/deeplab/exper/voc12/model/deeplab_largeFOV
mkdir -p ~/deeplab/exper/voc12/res
创建好目录之后,去deeplab官网(https://bitbucket.org/aquariusjay/deeplab-public-ver2/overview)上下载:
(1).sh文件:
https://ucla.box.com/s/4grlj8yoodv95936uybukjh5m0tdzvrf
(2)imagelist文件(.txt):
https://ucla.box.com/s/rd9z2xvwsfpksi7mi08i2xqrj7ab4keb
(3)模型文件及prototxt文件:
http://liangchiehchen.com/projects/DeepLabv2_vgg.html
(这个是deeplab所有官方的模型:http://liangchiehchen.com/projects/DeepLab_Models.html)
PS:一般来(1)(2)链接都很难打开,而网上分享的那些文件都需要积分或者什么的,所以我推荐大家用以下方法获取:
首先clonegithub上这份代码:git clone https://github.com/xmojiao/deeplab_v2
然后在voc2012中将config,list,model文件夹以及根目录中的.py,.sh的文件复制到你新建的~/deeplab/exper/voc12目录相应文件夹中.
四.数据集的准备
按照https://github.com/xmojiao/deeplab_v2/tree/master/voc2012的第2步将benchmark和voc2010两个数据集融合完成.
五.修改run_pascal.sh文件
修改的地方有下面几个:
(1)
#ROOT_DIR=/home/dl/DL_dataset
ROOT_DIR=/home/irsa/deeplab/dataset 这个ROOT_DIR为你存放数据的根目录(它的用途就是得到后面的DATA_ROOT,这个目录是存放数据集的直接目录)
(2)
#CAFFE_DIR=../deeplab-public-ver2
CAFFE_DIR=/home/irsa/deeplab 这个是存放deeplab版本caffe的目录,也就是你在前面编译caffe时,运行make-j8的目录.
(3)
#EXP=.
EXP=/home/irsa/deeplab/exper/voc12
if[ "${EXP}" = "/home/irsa/deeplab/exper/voc12" ];then
NUM_LABELS=21
DATA_ROOT=${ROOT_DIR}/VOC_aug/dataset/
else
NUM_LABELS=0
echo"Wrong exp name"
fi
这里EXP为你前面新建的voc12目录,这个目录下存放着log,config等文件夹,都是训练的参数设置,测试训练数据集的txt,预训练模型等,而定义这个目录之后需要做一个判断,如果是要进行voc数据集的训练,则你还要将if后面判断语句中的判断量改了,这样才能使用DATA_ROOT中的NUM_LABELS类的数据进行训练.
PS:这里的DATA_ROOT和EXP目录很重要,但是所有读取数据的操作都是通过data数据层来获得的,在Deeplab中使用的数据输入层为ImageSegDataLayer.
(4)
## Run
RUN_TRAIN=1 ## Training #1 (on train_aug)
RUN_TEST=0 ## Test #1 specification (on val or test)
RUN_TRAIN2=0 ## Training #2 (finetune on trainval_aug)
RUN_TEST2=0 ## Test #2 on official test set
通过修改这四个参数,用于控制是否进行训练和测试,以及使用那个数据集进行训练和测试.
六.进行训练
在终端中cd到EXP目录下,然后运行以下命令:
sh run_pascal.sh 2>&1|tee train.log
七.进行测试
在run_pascal.sh修改
RUN_TRAIN=0 ## Training #1 (on train_aug)
RUN_TEST=1 ## Test #1 specification (on val or test)
在终端中cd到EXP目录下,然后运行以下命令
sh run_pascal.sh 2>&1|tee test.log
问题:
1.DeepLab版本的caffe编译时报错:fatalerror: google/protobuf/arena.h: 没有那个文件或目录
解决方法:卸载当前版本的protobuf,安装2.6.1版本的protobuf
condainstall protobuf=2.6.1
这样并没有解决问题,而且如果装了anaconda,那么protobuf将会有两个版本的,可以通过以下的命令查看:
protoc–version
sudoprotoc –version
一般使用condainstall或者通过pip安装是安装在anaconda环境中的,而不是安装在sudo下的.'
更新sudo下protobuf的版本可以参考https://blog.youkuaiyun.com/blue_it/article/details/53996216
终于解决了!!参照https://blog.youkuaiyun.com/CDownLoad_ZXL/article/details/79807064
将anaconda的path在.bashrc中先注释掉,然后在重新打开终端(这个很重要,如果没有重新打开,那环境变量将不会生效).主要原因是anaconda中protobuf的版本和sudo下的protobuf版本不匹配导致的,这样注释掉anaconda的路径则会强制让其在默认路径下找,从而不会出现因为版本原因的错误.
2.cudnn.hpp:127:41:error: too few arguments to function ‘cudnnStatus_tcudnnSetPooling2dDescriptor
解决办法:caffe版本太低,而cudnn的版本太高了.有两种方法修改:
第一,直接换最新版的
第二,按照http://www.mamicode.com/info-detail-2236530.html来替换相应文件
3../include/caffe/common.cuh(9):error: function "atomicAdd(double *, double)" has alreadybeen defined
解决方法:https://blog.youkuaiyun.com/Hello_Wendy/article/details/72765160
原因是cuda版本不匹配(一般用cuda8.0的时候会出现这种问题)
注:这是在运行infer.py调用deploy.prototxt时出现的错误
解决方法:在DeepLab版本的caffe中添加Input_layer.hpp,并重新编译caffe\
5.make:没有什么可以做的为 `all'。
解决方法:make clean 这应该是你在删除编译结果时只是删除了build目录下的所有东西,但是caffe编译的东西除了build下的之外,其他如python目录下也有编译结果,这样使得删除不干净,导致系统认为已经有编译结果了,不用再编译了.
参考文献:
https://bitbucket.org/aquariusjay/deeplab-public-ver2/overview官方教程
https://github.com/xmojiao/deeplab_v2/tree/master/voc2012 主要的依据
https://blog.youkuaiyun.com/Xmo_jiao/article/details/77488180
https://blog.youkuaiyun.com/Xmo_jiao/article/details/77897109