用自己的数据集训练,测试deeplab_v2

用自己的数据集训练Deeplab v2,包括跑通run_pascal.shrun_densecrf.sh两个脚本

1. 下载编译deeplab_v2

make 部分不做详细介绍了,网上参考的内容也比较多,出错耐心改一下即可。
代码用的是 git clone https://github.com/xmojiao/deeplab_v2.git
之后的目录结构也按照down下来的,无需调整。

2. 准备数据

按照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 目录下
例如,我的

  • train_aug.txt内容为:
 /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.txt内容为:
/val/img/1515056226901.png /val/cls/1515056226901.png
/val/img/1515056240708.png /val/cls/1515056240708.png
……
  • test.txt为:
/testpic/xxx-1.png
/testpic/xxx-2.png
……

val_id.txt内容为:(test_id.txt格式相同)

515056226901
1515056240708
1515056262675

3. sh run_pascal.sh

在此之前,确保:
- 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

用自己的数据集训练,测试deeplab_v2_第1张图片
注意:下载的sh里面路径部分有的我为了直观,直接写成了绝对路径,把原来的${}写法注释掉了,后来觉得这种习惯很不好,大家注意看自己的路径。

4. python create_labels_21.py

如果上面的训练,测试没问题的话,会得到.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分割数据集的颜色了。
用自己的数据集训练,测试deeplab_v2_第2张图片

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。

5. make densecrf

接下来进行crf的部分:

首先先对densecrf进行编译

cd /new/xxx/DeepLab/deeplab_v2/deeplab-public-ver2/densecrf
make 

warning信息不用管,继续执行下面的。

6. 将原图转换成PPM格式

转换成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文件:
用自己的数据集训练,测试deeplab_v2_第3张图片

7. sh run_dencecrf.sh

注意修改文件中的路径,传入自己的PPM文件路径和.mat的路径,修改后的.sh在上面的sh文件链接中已经有了,大家可以参考一下。

cd /new/xxx/DeepLab/deeplab_v2/voc2012
sh run_dencecrf.sh

成功之后,会得到.bin文件。
用自己的数据集训练,测试deeplab_v2_第4张图片
这个脚本主要用到的.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原图,也可以修改网络。看具体情况吧。(特别感谢小伙伴@-的帮助,帮我发现了这个错误~~)

8. 将.bin文件转换成.png文件

(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_第5张图片
完成后会在刚才脚本中的保存路径中看到转换后的结果,已经恢复成原图大小了。


deeplab_v2是将分割和crf两个阶段分开进行,经过crf,也并不一定能提高分割效果,如果想把crf加入到网络中,可以直接考虑训练deeplab_v3。

你可能感兴趣的:(教程,语义分割,深度学习)