我们都知道入门语义分割最简单的就是先把模型跑起来;但是偏偏有时候架不住bug太多啊!别着急,使用本文的代码和方法,让新手村的每一位童鞋都能训练出高分的语义模型,主打的就是一个快准狠。废话不多说
▍目录
- 代码介绍
- 算法简述
- 数据准备
- 模型训练
- 模型使用
- 资源获取(项目源码(pytorch实现)和deeplabv3++论文中文版)
▍代码介绍
本项目使用pytorch实现的deeplabv3+算法训练自动驾驶场景的语义分割模型。该数据集使用labelme工具标注,总共6个类别,分别是:车辆,虚线,右车道,中间车道,坑洼和背景。
【关键词】:DeepLabv3+ labelme数据标注 数据解析 中文版deeplabv3+论文
项目目录结构:
▍算法简述
Deeplabv3+模型的核心思想是将一个卷积神经网络模型应用于图像分割问题,并在模型中使用空洞卷积来提高感受野。Deeplabv3+模型使用ResNet作为其基础骨干网络,并增加了一些附加模块和技巧来提高模型的性能。
Deeplabv3+模型的第一个关键模块是ASPP(空洞空间金字塔池化),它可以通过用不同的空洞卷积在不同的尺度上进行特征提取来改善图像分割的性能。 ASPP模块包括一个1x1卷积层,四个空洞卷积层和一个全局平均池化层。
Deeplabv3+还使用了编解码器结构来提高模型的性能。编解码器结构中的编码器可以提取输入图像中的特征,而解码器可以使用上采样技术将特征图像放大并进行分割预测。此外,Deeplabv3+还使用了CRF(条件随机场)来进一步提高图像分割质量。
▍数据准备
将数据集按照以下步骤整理即可,如【data】目录所示结构。
1. 使用labelme标注自己的数据集
对labelme标注工具不熟悉的同伴可以查阅其他资料,此处不做过多赘述;简单的使用步骤如下。
1. 工具安装:pip install labelme
2. 启动工具:命令行输入labelme
3. OpenDir打开图片目录,并且勾选File/Save With Image Data
4. 使用create Ploygons标注需要进行识别分割的区域
标注得到的数据如下所示,文件夹中应包含原图和json标注文件:
2. 数据解析
使用【scripts】文件夹下的labelme2seq.py脚本将标注数据转换为可直接训练数据。脚本中需要设置ann_dir和out_dir。值得注意的是,在windows环境下,由于中文编码的问题,路径中最好不要带有中文符号,不然可能会报错。
- ann_dir:指定labelme标注数据的目录路径;
- out_dir:指定解析后的数据的输出目录。
运行labelme2seq.py脚本得到的数据内容如下所示。
【image】和【label】为我们所需要的模型训练数据,将这两个目录的数据按照7:3的比例分成train和val两份,分别用于模型训练和评价;放置于data\trainData目录下,格式如下。
trainData
|_train
|_image
|_label
|_val
|_image
|_label
准备好训练数据,我们的项目就已经算是完成一半啦!
下面设置好训练的参数和数据路径就可以开始训练了。当然,如果数据是按照上面的步骤整理并且被放到trainData目录下,不用设置参数(除了模型类别num_classes之外)也可以直接训练,因为代码中的参数都设置好了。
▍模型训练
1. 环境安装
命令行执行如下命令,安装python依赖库和pytorch以及对应的cuda,此处方法只针对英伟达显卡。如果没有显卡,可用pip install torch torchvision安装cpu版本。
pip install -r requirements.txt
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html
ps:使用的python版本最好是3.9.12或者以下,3.10或以上版本只能安装torch的cpu版本,安装不了gpu版本。如果不知道python怎么安装和版本设置请看本知乎的另一篇文章。
在cmd中检查cuda是否安装成功:
nvidia-smi:检查计算机显卡的运行状态;
torch.cuda.is_available():测试gpu版本的pytorch是否安装成功;安装成功返回True,安装失败返回False。命令行如下图输入所示即为安装成功。
2. train.py文件参数设置
train.py需要修改的参数通常有以下几个:
–data_root:指定训练数据和测试数据的路径;默认放在data\trainData目录下,不做改动。
–num_classes:指定模型类别数;值得注意的是,类别数应该是实际识别的类别数+1,即实际识别的类别数+背景。
–batch_size:指定训练的batch,此处一般根据自己设备性能调节;值得注意的是,此处batch最小不能小于2,不然会报错。
–val_batch_size:指定模型验证的batch;此处最小可以设置为1。
3. 执行训练
在train.py文件中设置完参数之后点击运行即可。但是,如果不想改动源代码,也可以直接在命令行直接传入参数。
python train.py --data_root data\trainData --num_classes 6 --batch_size 2 --val_batch_size 1
训练过程:
训练之后的模型权重有两个:best(当前训练过程得分最高的模型)和latest(最后一个epoch训练出来的模型),其命名规则分别是:
best_主干网络_数据集_比值.pth
latest_主干网络_数据集_比值.pth
▍模型使用
1. predict.py文件参数设置
–ckpt:指定所使用的模型权重路径;
–input:指定测试图片的目录;
–num_classes:指定模型的类别数;此处应该和模型训练时保持一致。
2. 执行测试
在predict.py文件中设置完参数点击运行即可。但是,如果不想改动源代码,也可以直接在命令行直接传入参数。
python predict.py --input data\trainData\val\image --num_classes 6 --ckpt checkpoints/best_deeplabv3plus_mobilenet_myDataset_os16.pth
测试结果:
代码预测的结果默认是测试图片跟测试图片保存在同个目录下,并且以(res_原图名称)命名。
▍资源获取
文章中有任何问题欢迎评论区讨论交流。项目资源包括本文的模型代码,数据解析脚本等,以及deeplabv3+的论文中文翻译。支付宝扫码支付自动弹出项目资源的百度网盘链接和提取码,永久有效。
独家整理资料:
- 论文人工翻译,语句通顺无歧义
- 关键地方添加中文注释,简单易懂
- 代码已调好参,直接训练即可收敛
- windows和linux下皆无bug