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
进入cityscapes官网:Download – Cityscapes Dataset (cityscapes-dataset.com)
下载数据集需要用教育邮箱注册账号,我们注册并登录后下载这三个数据集:
在以上三个数据集下载完成后,我们需要使用cityscapes数据集官方公开工具集创建带有标签ID的png图像
工具集github地址:cityscapesScripts/cityscapesscripts at master · mcordts/cityscapesScripts (github.com)
我们主要使用其中的preparation/createTrainIdLabelImgs.py,使用时需要将数据集放在工具集的目录中,使其与工具集的cityscapesscripts同级,但是这样未免有些麻烦,我们后续又需要将数据集移动到mmsegmentation中的data目录下,因此对代码做些修改
注意将cityscapesPath改为自己数据集的路径
我们运行这个文件
python preparation/createTrainIdLabelImgs.py
此时可能报错:ModuleNotFoundError: No module named ‘cityscapesscripts’
解决方法非常简单,我们只需在代码中添加一行,同样注意将工具包的路径改为自己的
sys.path.append('/home/mmsegmentation/data/cityscapes/cityscapesScripts')
然后我们再运行文件,标签的转换就会进行了,等待转换完成即可
我在训练中使用的是cityscapes默认的19个分类,没有对训练分类进行修改,但是如果需要修改我们要训练的类别,可以通过修改工具包中的helper/label.py文件来实现
代码中的trainID为255的类别没有加入训练,可以修改trainID和ignoreInEval来将其加入
当数据集准备好后,在项目中新建一个data/cityscapes路径存放数据集,可以忽略我的cityscapesscripts工具包
如果在安装时选择了从源码安装,那么在项目的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小时,训练结果:
这里有一个小技巧,我在使用服务器训练时如果将终端关闭训练也将中断,因此使用screen来实现服务器后台进行训练,无需终端一直保持连接
首先下载screen
apt-get install screen
然后创建一个screen任务
screen -S mmseg
创建成功后再开始训练,就可以退出终端后服务器在后台进行训练不会中断啦
关闭终端再次连接服务器后,可以使用 screen -r mmseg
来重新回到这个screen任务
但是当有时网络波动断开连接时,可能出现报错:
这是由于之前的连接没有断开,我们通过使用 screen -d 8061
命令来删除这个连接,再重新使用-r命令连接即可
我们也可以使用 screen -ls
命令来查看创建的screen任务,在打开的screen任务中输入 exit
即可将任务终止
运行如下的命令进行测试:
./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
这是我的测试结果:
测试过程中仍然可能出现报错:ModuleNotFoundError: No module named ‘cityscapesscripts’
在datasets/samplers/cityscapes.py文件加入两行,注意将路径改为自己的:
import sys
sys.path.append('/home/mmsegmentation/data/cityscapes/cityscapesScripts')
随便找一张华科的街景图看下效果
运行命令
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
效果不是很好哈哈,本次训练只是学习一下