使用cityscapes数据集在mmsegmentation框架下训练语义分割模型

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型


1. mmseg安装

mmsegmentation有着完整的中英文文档:依赖 — MMSegmentation 0.29.1 文档

安装mmseg可以根据文档一步步完成,由于我是在服务器上部署,使用CPU时出现报错,因此在验证安装时需要将使用的设备改为GPU:

python demo/image_demo.py demo/demo.png pspnet_r50-d8_512x1024_40k_cityscapes.py pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --out-file result.jpg

2. 数据集下载

进入cityscapes官网:Download – Cityscapes Dataset (cityscapes-dataset.com)

下载数据集需要用教育邮箱注册账号,我们注册并登录后下载这三个数据集:

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第1张图片

3. 数据集准备

在以上三个数据集下载完成后,我们需要使用cityscapes数据集官方公开工具集创建带有标签ID的png图像

工具集github地址:cityscapesScripts/cityscapesscripts at master · mcordts/cityscapesScripts (github.com)

我们主要使用其中的preparation/createTrainIdLabelImgs.py,使用时需要将数据集放在工具集的目录中,使其与工具集的cityscapesscripts同级,但是这样未免有些麻烦,我们后续又需要将数据集移动到mmsegmentation中的data目录下,因此对代码做些修改

注意将cityscapesPath改为自己数据集的路径

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第2张图片

我们运行这个文件

python preparation/createTrainIdLabelImgs.py

此时可能报错:ModuleNotFoundError: No module named ‘cityscapesscripts’

解决方法非常简单,我们只需在代码中添加一行,同样注意将工具包的路径改为自己的

sys.path.append('/home/mmsegmentation/data/cityscapes/cityscapesScripts')

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第3张图片

然后我们再运行文件,标签的转换就会进行了,等待转换完成即可

我在训练中使用的是cityscapes默认的19个分类,没有对训练分类进行修改,但是如果需要修改我们要训练的类别,可以通过修改工具包中的helper/label.py文件来实现

代码中的trainID为255的类别没有加入训练,可以修改trainID和ignoreInEval来将其加入

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第4张图片

4. pspnet模型训练

当数据集准备好后,在项目中新建一个data/cityscapes路径存放数据集,可以忽略我的cityscapesscripts工具包

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第5张图片

如果在安装时选择了从源码安装,那么在项目的config目录下有着各种各样的模型文件可供选择,并且可以直接使用,我在本次训练中选择了PSPNet模型

mmsegmentation的官方文档中介绍了单卡训练的命令:

python tools/train.py ${CONFIG_FILE} [可选参数]

多卡训练的命令:

sh tools/dist_train.sh ${CONFIG_FILE} ${GPUS} [可选参数]

我使用的是服务器中的4张3090进行训练,运行命令:

./tools/dist_train.sh configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py 4

若没有权限运行sh文件,运行命令:

chmod a+x tools/dist_train.sh

再次运行多卡训练的命令,即可成功开始训练,训练命令中的4指的是在本次训练中使用4张显卡进行训练,省略了其他可选参数,–work-dir参数若没有指定则会自动生成一个work_dirs文件夹,用来存储模型的权重文件和训练日志

我此次训练80000轮耗时4小时,训练结果:

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第6张图片

这里有一个小技巧,我在使用服务器训练时如果将终端关闭训练也将中断,因此使用screen来实现服务器后台进行训练,无需终端一直保持连接

首先下载screen

apt-get install screen

然后创建一个screen任务

screen -S mmseg

创建成功后再开始训练,就可以退出终端后服务器在后台进行训练不会中断啦

关闭终端再次连接服务器后,可以使用 screen -r mmseg 来重新回到这个screen任务

但是当有时网络波动断开连接时,可能出现报错:

在这里插入图片描述

这是由于之前的连接没有断开,我们通过使用 screen -d 8061 命令来删除这个连接,再重新使用-r命令连接即可

我们也可以使用 screen -ls 命令来查看创建的screen任务,在打开的screen任务中输入 exit 即可将任务终止

5. 模型测试

运行如下的命令进行测试:

./tools/dist_test.sh configs/pspnet/pspnet_r18b-d8_512x1024_80k_cityscapes.py work_dirs/pspnet_r18b-d8_512x1024_80k_cityscapes/iter_80000.pth 4 --eval cityscapes --show

这是我的测试结果:

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第7张图片

测试过程中仍然可能出现报错:ModuleNotFoundError: No module named ‘cityscapesscripts’

在datasets/samplers/cityscapes.py文件加入两行,注意将路径改为自己的:

import sys
sys.path.append('/home/mmsegmentation/data/cityscapes/cityscapesScripts')

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第8张图片

随便找一张华科的街景图看下效果

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第9张图片

运行命令

python demo/image_demo.py hust.jpeg work_dirs/pspnet_r18b-d8_512x1024_80k_cityscapes/pspnet_r18b-d8_512x1024_80k_cityscapes.py work_dirs/pspnet_r18b-d8_512x1024_80k_cityscapes/iter_80000.pth --device cuda:0 --out-file hust_result.jpg

效果不是很好哈哈,本次训练只是学习一下

使用cityscapes数据集在mmsegmentation框架下训练语义分割模型_第10张图片

你可能感兴趣的:(学习中的碎碎念,深度学习,人工智能,计算机视觉,目标检测)