时间: 2022年4月8日
内容:训练 MM Segmentation 中的deeplabv3 深度神经网络
如果想要系统的学习,可以参考官方文档:
https://mmsegmentation.readthedocs.io/en/latest/get_started.html#installation
但是我理解力有限感觉不太详细。
基础的配置和介绍可以看我的上一篇博客,这篇讲一下训练。
安利一个很好用的ssh工具:MobaXterm (比pycharm传文件稳定)
首先我也是在网上参考的教程:
https://zhuanlan.zhihu.com/p/393070556
这个教程我跟着做了下来,里面有很多值得参考的东西。
比如VOCA数据集的生成。
但是我最终没有跑成,总是报错:
File Not Found Error:caugut FileNotFoundError in DataLoader Worker process 0.
这个问题网上很少有人出现,大概就是找不到数据集,但是我按教程来的也不知道错在哪里。
这个bug我始终没改掉。
猜测是这篇教程的作者漏掉了什么东西导致找不到路径。
还有一篇不错的教程,可以参考:
https://blog.csdn.net/weixin_44044411/article/details/118196847
我的环境
anaconda +python 3.7+cuda111+pytorch1.8.0+mmcv-full1.3.16
3 开始
既然我的bug无法解决,于是进行了求助。
但是没人遇到我的奇葩问题,前辈告诉我,教程里在work-dirs中修改的py配置文件,是临时生成的文件,不好直接运行那个,大概是这个原因吧。
首先,将mmsegmentation project 进行还原,对于我是还原,对于刚下载好的文件就是啥都别改。
下载 打开work dir mmsegmentation 初始化 指令:
git clone https://github.com/open-mmlab/mmsegmentation.git
cd mmsegmentation
pip install -e . # or "python setup.py develop"
mmsegmentation文件夹就是我们要工作的文件夹,如图:
划红线的work-dir是运行代码生成的;my-config是我建立的。
在mmsegmentation文件夹下新建data文件夹,把你的数据集放在里面。
比如你的数据集名字叫做 demo_voc
格式是VOC 数据集
demo_voc里面是:
划红线是我自己写的 忽略。
这就是标准的voc数据集需要的文件,其中多出来的ImageSets里面是ImageSets/Segmentation/train.txt、val.txt
这个需要自己做一份,上面知乎的教程里面有。
先在配置文件中修改你的类别数:标出的类别数改成你的,类别数等于 n + 1。
也就是多少类别+背景。
尝试运行
格式: python …/train.py …/xxx.py
第一个是训练文件,不用改;
第二个是配置文件。
我们要运行:
python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py --work-dir work-dirs
注意这个:
configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py
不是:
configs/base/model里面的。
他们俩的区别在上一篇博客里讲过。
运行结果会报错,找不到文件,因为mmsegmentation默认的数据集VOC2012我们没有。
如果跑官方数据集,下载好之后放在指定路径就可以了。
如果跑自己数据集需要修改。
打开:
configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py
这里面就是配置文件和类别,要改两个:
1 类别修改为自己数据集类别。
配置文件可以看到四个。
2 其中pascal_voc12_aug.py(打开看看知道里面只是配置文件)改为pascal_voc12.py。
这两个文件都是这个数据集的配置文件,后缀aug文件会跳转到后者。
_base_ = [
'../_base_/models/deeplabv3_r50-d8.py',
'../_base_/datasets/pascal_voc12.py', '../_base_/default_runtime.py',
'../_base_/schedules/schedule_20k.py'
]
model = dict(
decode_head=dict(num_classes=5), auxiliary_head=dict(num_classes=5))
现在思路很清晰 只改这里面的文件就可以啦。
打开 config/base/pascal_voc12.py
修改data_root
修改 检查 train、val、test 三个dict里面的路径,主要是修改ann_dir
如果你做过上面的教程,这些soeasy。
首先 data_root,就是 data/demo_voc
然后对于voc数据集,ann_dir是 SegmentationClassPNG
这是我的文件,可以参考。
然后就可以运行啦,还是上面的指令,就可以开始训练啦。
应该有人关心训练配置,别忘了上面是四个文件,还差 '…/base/schedules/schedule_20k.py’这个文件没改。
我们在里面修改保存模型interval和迭代次数,一般数据集小的话不用20000.
执行:开始训练
python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py --work-dir work-dirs
4
这样子训练,会发现每隔一个interval就会停下来,因为在保存模型时候出错啦。
我们修改的数据集和官方数据集的类名和类数不同,每次保存模型我设置的都进行测试,测试的时候就会报错。
所以还差两个文件要改: 底层配置 下面借鉴知乎教程
首先是在mmsegmentation/mmseg/datasets下,找到voc.py(因为我们的格式是VOC),做如下修改。
其中PALETTE你可以简单理解为颜色,background对应[0, 0, 0]就是黑色,依次类推。
原来的标注VOC共有21类,我们需要换成我们的类别名字。
关于PALETTE,其实就是类别的颜色,第一个背景是黑色,怎么获得后面的颜色的通道值呢?
你可以用qq的截图工具,在选区域的时候光标会出现这个通道值,抄下来就好了。
(暴露的年龄没错我喜欢用qq)
我的四类分别是 红黄绿蓝。
然后在mmsegmentation/mmseg/core/evaluation下,这就是模型评估时候的文件。
找到class_names.py,做类似修改:
修改和voc有关的两个类
这样类别就修改好了。
训练
python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py --work-dir work-dirs
应该没问题了,后面的 --work-dir +路径是保存的模型和log日志文件;
这些参数还有很多 比如–gpus-ids 、 --gpus
具体的你可以在train.py中找到。
每个interval保存模型,然后跑完了可以测试。
train.py中封装了一个cfg对象。
cfg是一个Config的对象。
这是官方解释:将各种文本设置变成可访问的属性。
参考:
https://blog.csdn.net/qq_20549061/article/details/107871736
只看后面就可以了。
对于GPU,
选参数,gpu-ids,gpu的id号 ,nargs =‘+’。
命令格式为–gou-ids 0 1 2。
也就是在指令后面加上 --gpu-ids 0 1 2 3 4
注意它这个是空格分的 我之前遇到用,分的比较多
多GPU训练:
python tools/train.py configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py --work-dir work-dirs --gpu-ids 1 2 3 4 5 6
nvidia-smi 指令可以查看gpu的情况 编号及占用情况 然后选空闲的编号就行了
5测试:
指令格式 :
python …/test.py …/model.py …/work-dirs/…/latest.pth --参数
解释:
latest.pth 是训练生成的模型,默认在work-dirs中。
后面的参数可以看test.py文件中的解释。
my_output是新建的输出图片的保存路径。
python tools/test.py configs/deeplabv3/deeplabv3_r50-d8_512x512_20k_voc12aug.py work_dirs/latest.pth --show-dir my_output
6
这篇文章的内容可能很简单,但是对于一开始的我来说对于bug无从下手。
网上的教程我没有真正的用上,最后是受到了前辈的指导,所以我需要记录下来,万一有个像我一样的人呢。
刚入门,希望和大家一起交流学习沟通。
希望能帮到您~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)