语义分割学习笔记
presented by quarterlist
Attention! 笔记是完整学习后总结后写出来的,可能不会和学习时的顺序一样。
其实,学完一切再回头来看,也不是那么难。
语义分割是指使用视觉模型识别图片中不同物体的工作。要进行语义分割视觉模型的训练和使用,需要进行以下几个步骤:
- 配置环境 environment(悲)
- 配置要使用的机器学习框架及其依赖,主流的包括pytorch、tensorflow等。
- 配置语义分割要使用的模型库及其依赖,本次使用mmsegmentation库,及其配套的mmcv组件。mmsegmentation是包含有很多预训练好的模型的开源模型库,方便后续的学习者使用。
- *使用显卡等硬件训练模型需要安装带cuda的pytorch,这又要求对应的依赖,这还是相当麻烦的。*如果不打算使用显卡,普通版本的pytorch也可以。
- 准备训练数据 dataset
- 准备训练用图片
- 准备训练用图片的模板
模板是指mask文件,一般为png格式,用来给模型指出对应的图片中每个像素的类别(这个类别由你设置,相关的物体可以细分,不相关的可以粗略地归为其他)。训练时的模板一般需要手动标注,但也可以先用已有的模型自动标准,在其基础上进行人工微调。 - 这里的图片和模板需要一一对应,且mask模板一定一定得是单通道的灰度图像。否则会出现严重的后果。
- 图片和模板一般会被随机分为train和val两个类,但图片和其对应的模板一定在同一个类中。train中的用于训练视觉模型,而val中的图片用于验证模型的训练效果。
- 注册数据集 __init__
-
在mmsegmentation的数据集库中添加自己的数据集并注册
-
注册数据集需要在__init__文件中引入自己的数据集类文件并写入all类中
-
数据集类文件定义了你需要进行语义分割任务的图片中的物体类别及其蒙版颜色,具体来说:
‘classes’: [‘buildings’, ‘background’],
‘palette’: [[200, 200, 200], [50, 50, 50]],比如,在本次语义分割任务中,我将物体分为两类,一类是要区分出来的buildings,另一类是完全无关的其他事物background。而palette则对应上方的类,设置在预测结果中预览时的蒙版颜色,在这里建筑物会用亮白色标记出来,而其他背景都会是深灰色。
-
当然也可以使用现有的数据集,但对于任务较为精确的语义分割任务来说,还是去准确定位自己的目标数据比较好
-
- 设置预处理模型 pipeline
- 由于有时条件受限,数据数量不足,或是为了增加模型精度,在输入图片和模板之前会对二者进行一些处理,比如裁剪、旋转、放大等等。就像数学题改几个数字,一来能多出几道题,二来可以看出是否真的掌握了方法,而不是背答案。这个处理图片的过程就称为预处理。
- 预处理文件一般命名为pipeline,即预处理管道。
- 设置语义分割模型参数 config
- 模型分为很多个部分,包括头处理、中间层和尾处理,可以给三者设置不同的处理模型和处理参数。不同的模型有不同的原理,导致有不同的学习率、预测速度、预测精度等,要根据实际需要选择合适的模型。
- 训练的次数、隔多久测试一次、训练指标等参数都由这里设置。测试指标有很多种,一般在这里设置精度方面的指标,包括IoU(交并比)、MIoU(平均交并比)、Dice(集合相似度)。
- 值得一提的是,训练次数过多可能会出现过拟合现象,类似于学生背题。换个题目就会准确率大幅下降。
- 开始训练
link start- 你需要做的事:等待 以及 密切关注有没有爆显存。
- 显存爆了的解决方案:换一个更好的显卡 或 降低批处理大小(通过设置config文件中的参数) 或 减小图像尺寸(通过设置预处理模型)
- 训练通过修改模型内部的连接方式改变模型对事物的认知能力,可以从空白的模型开始训练,也可以选择从预训练好的模型开始进行迁移训练。后者是一种方便省事而又高效的操作,可谓是站在了巨人的肩膀上。
- 训练结束后,结果会保存在mmsegmentation下主目录的work_dirs中一般best_xxxx_iter_xxxx.pth就是为你保存的最优模型。
保存好它哦
不然你训练了几个小时乃至几天的成果就没了
- 设置语义分割模型入口
-
设置训练好的权重文件,一般是pth格式
-
设置训练时用的config文件,也就是第四步的config
-
选择进行预测时使用的设备,这个工作量不大,即使是cpu也可以
-
初始化模型,使用模型的推理方法对图片进行预测,使用入口为:
inference_model(model, img_bgr)
其中model是通过config和权重文件初始化的模型,img_bgr是你要预测的图片。返回值是一个对象,可以通过python的一些方法将其转化为图片,查看训练效果。
-