用自己的数据集训练Deeplab v2,包括跑通run_pascal.sh
和 run_densecrf.sh
两个脚本
make 部分不做详细介绍了,网上参考的内容也比较多,出错耐心改一下即可。
代码用的是 git clone https://github.com/xmojiao/deeplab_v2.git
之后的目录结构也按照down下来的,无需调整。
按照voc2012分割数据集的格式准备,分为train,val,test,train和val集要准备好原图+label图,test集准备原图即可。放的目录无所谓,之后注意修改路径即可。
例如,我在/new/xxx/DeepLab/deeplab_v2/下新建了一个放自己数据集的目录: dataset
在/new/xxx/DeepLab/deeplab_v2/dataset/ 下img 用来放训练原图,cls用来放训练标签图。testpic里放了几张没有标签的测试图。/new/xxx/DeepLab/deeplab_v2/dataset/val/img 放验证原图,/new/xxx/DeepLab/deeplab_v2/dataset/val/cls 放验证label图。
同时,准备好train_aug.txt(训练时用的数据列表),val.txt(验证集的数据列表),test.txt(测试集的数据列表)这三个文件内容都是需要前缀路径的。(原图 label图)还有一个val_id.txt和test_id.txt,这两个只需要保存图片id,不需要前缀也不需要后缀。这些.txt放在/new/xxx/DeepLab/deeplab_v2/voc2012/list
目录下
例如,我的
/img/segnet_train_ori/1511664041284.png /cls/segnet_train_label/1511664041284.png
/img/segnet_train_ori/1511664333882.png /cls/segnet_train_label/1511664333882.png
……
/val/img/1515056226901.png /val/cls/1515056226901.png
/val/img/1515056240708.png /val/cls/1515056240708.png
……
/testpic/xxx-1.png
/testpic/xxx-2.png
……
val_id.txt内容为:(test_id.txt格式相同)
515056226901
1515056240708
1515056262675
在此之前,确保:
- 1. 数据准备好,.txt文件准备好
- 2. init.caffemodel 模型准备好,放在
/new/xxx/DeepLab/deeplab_v2/voc2012/model/deeplab_largeFOV/
路径下,
模型文件可以从这里下载:deeplab-v2的模型文件
- 3. 修改run_pascal.sh文件,主要修改一些路径,我把我自己的修改后.sh的放在链接里,大家可以参考一下,里面有一些注释,就不贴出来了,链接里面有run_pascal.sh
, run_densecrf.sh
, 以及run_densecrf_grid_search.sh
deeplab_v2的sh文件(run_pascal.sh,run_densecrf.sh,run_densecrf_grid_search.sh)
以上内容都准备好之后,执行:
cd /new/xxx/DeepLab/deeplab_v2/voc2012
sh run_pascal.sh
注意:下载的sh里面路径部分有的我为了直观,直接写成了绝对路径,把原来的${}写法注释掉了,后来觉得这种习惯很不好,大家注意看自己的路径。
如果上面的训练,测试没问题的话,会得到.mat的结果,以我的测试集为例,我会在
/new/xxx/DeepLab/deeplab_v2/voc2012/features/deeplab_largeFOV/test/fc8
下得到测试集的.mat结果。
如果想看.png的结果,可以通过create_labels_21.py脚本
create_labels_21.py在 /new/xxx/DeepLab/deeplab_v2/voc2012/下,注意修改里面的路径,以及自己的palette,否则就对应回voc分割数据集的颜色了。
cd /new/xxx/DeepLab/deeplab_v2/voc2012
python create_labels_21.py
之后会在/new/xxx/DeepLab/deeplab_v2/voc2012/features/deeplab_largeFOV/test/fc8/labels/下得到转换出的png图片,不过图片的大小是513*513。
接下来进行crf的部分:
首先先对densecrf进行编译
cd /new/xxx/DeepLab/deeplab_v2/deeplab-public-ver2/densecrf
make
warning信息不用管,继续执行下面的。
转换成PPM格式需要执行.m文件,需要安装matlab。
转换的脚本在 /new/xxx/DeepLab/deeplab_v2/deeplab-public-ver2/densecrf/my_script/下:
注意修改原图路径和要保存的PPM文件路径:
cd /new/xxx/DeepLab/deeplab_v2/deeplab-public-ver2/densecrf/my_script
matlab -nodesktop -nosplash -r SaveJpgToPPM
注意修改文件中的路径,传入自己的PPM文件路径和.mat的路径,修改后的.sh在上面的sh文件链接中已经有了,大家可以参考一下。
cd /new/xxx/DeepLab/deeplab_v2/voc2012
sh run_dencecrf.sh
成功之后,会得到.bin文件。
这个脚本主要用到的.cpp文件有:
主函数在:
/densecrf/refine_pascal_v4/dense_inference.cpp
一些其他的主要功能函数在:
/densecrf/libDenseCRF/densecrf.cpp
/densecrf/libDenseCRF/util.cpp
这一步中,如果发现voc的数据集运行正常,但自己的数据集出现segmentation fault(core dumped)的错误,应该是因为图片大小的原因,voc的数据集基本上都是<513的,分割之后得到513*513的大小,在crf的脚本中会crop成原图大小,如果原图出现>513的边,crop不了,就会报segmentation fault(core dumped)的错误,具体怎么修改,可以crop原图,也可以修改网络。看具体情况吧。(特别感谢小伙伴@-的帮助,帮我发现了这个错误~~)
(1)修改:
/new/xxx/DeepLab/deeplab_v2/deeplab-public-ver2/densecrf/my_script/GetDenseCRFResult.m 中的路径: 传入自己的.bin文件路径,以及保存结果的路径。
(2)修改
/new/xxx/DeepLab/deeplab_v2/deeplab-public-ver2/matlab/my_script/SetupEnv.m
1.修改:load('./xxxx.mat') 传入自己的colormap.mat文件,不然对应回去的是voc的类别颜色
2.修改:#以下参数修改为和run_pascal.sh中一致:
bi_w = 4;
bi_x_std = 49;
bi_r_std = 5;
pos_w = 3;
pos_x_std = 3;
3.修改: dataset = 'voc2012';
4.修改:model_name = 'deeplab_largeFOV';
cd /new/xxx/DeepLab/deeplab_v2/deeplab-public-ver2/densecrf/my_script
matlab -nodesktop -nosplash -r GetDenseCRFResult
完成后会在刚才脚本中的保存路径中看到转换后的结果,已经恢复成原图大小了。
deeplab_v2是将分割和crf两个阶段分开进行,经过crf,也并不一定能提高分割效果,如果想把crf加入到网络中,可以直接考虑训练deeplab_v3。