【图像分割】Windows10训练DeepLabv3模型
2021.1.14更新:
出现识别类别色彩与原图不一样的情况,原因是代码默认是pascal数据集的上色策略,请将
./dataloaders/utils.py
下第五行:
def decode_seg_map_sequence(label_masks, dataset='pascal'):
更改为
def decode_seg_map_sequence(label_masks, dataset='cityscapes'):
更新日期:2020.12.23
环境:Win10 + Anaconda3 + pytorch1.6.0 + cuda10.2.89 + cudnn7.6.5
GPU:2070
IDE:pycharm
图像分割是计算机视觉中除了分类和检测外的另一项基本任务,它意味着要将图片根据内容分割成不同的块。相比图像分类和检测,分割是一项更精细的工作,因为需要对每个像素点分类,如下图的街景分割,由于对每个像素点都分类,物体的轮廓是精准勾勒的,而不是像检测那样给出边界框。
一、环境搭建
1、安装Anaconda3、cuda、cudnn、pytoch
详见此文
2、安装相应库
由于github源码中并没有阐明环境中具体工具包的版本号或requirement.txt,因此读者可以选择:
a、待运行代码时根据报错逐一弥补缺漏的工具包,安装时直接conda install 库名
,如不确定有哪些版本可选,可运行conda search 库名
查询。
b、依据上面链接中yolov5的环境配置工具包
3、安装pycocotools包
pycocotools,即python api tools of COCO。COCO是一个大型的图像数据集,用于目标检测、分割、人的关键点检测、素材分割和标题生成。这个包提供了Matlab、Python和luaapi,这些api有助于在COCO中加载、解析和可视化注释。
若不安装pycocotools包,在后续运行训练模型的代码时,会报错:
No module named ‘pycocotools’
点击此链接下载Microsoft Visual C++ 14.0,压缩包内附教程。
二、准备数据集(cityscapes)
Cityscapes拥有5000张在城市环境中驾驶场景的图像(2975train,500 val,1525test)。它具有19个类别的密集像素标注(97%coverage),其中8个具有实例级分割。Cityscapes数据集,即城市景观数据集,这是一个新的大规模数据集,其中包含一组不同的立体视频序列,记录在50个不同城市的街道场景。
官网链接——需要注册账号、下载速度慢。
百度云链接 提取码:dhr8
并将文件摆放为如下结构:
----cityscapes
--------gtFine_trainvaltest
------------gtFine
----------------test
----------------train
----------------val
--------leftImg8bit
------------test
------------train
------------val
--------preprocess.py
--------read_depth.py
--------testImages.txt
……一堆.txt
本人尝试过使用pascal VOC 2012 ,只有1.9G,训练效果并不佳。(可能是我参数没调对)
三、准备源码
github:源码地址
四、训练模型
配置参数
1、打开mypath.py
将cityscapes下的return地址改为自己的cityscapes文件夹地址,如return 'E:\cityscapes/'
,并保存。
2、打开train.py
,将设置中的dataset设为cityscapes;use-sbd改为false;修改自己合适的batch-size(本人RTX2070 8G,只能设为2);backbone可根据需要自行选择,我选的是xception模型,其它模型如下:
其它参数本人均为默认。如有需要也可自行修改。
开始训练
运行train.py
首次训练时,会自动下载xception预训练模型至C:\Users\HP.cache\torch\hub\checkpoints,但速度很慢。因此可以点击此处下载预期训练模型直接拷贝到目录下。再次运行训练代码。
请关注模型是否能顺利运行完第一个Epoch,如有报错:ValueError: Expected more than 1 value per channel when training, got input size是因为模型中用了batchnomolization,训练中用batch训练的时候当前batch恰好只含一个sample,而由于BatchNorm操作需要多于一个数据计算平均值,因此造成该错误。
解决方法:删掉一个训练样本(包括每个文件夹下的图片和.txt中的标签),使得train、test、val的样本数量均能被batchsize整除。(我train和test下各删了一个样本)
其它疑难杂症
待发现