干货 | deeplabv3实现自动驾驶数据语义分割(附源码和中文论文)

我们都知道入门语义分割最简单的就是先把模型跑起来;但是偏偏有时候架不住bug太多啊!别着急,使用本文的代码和方法,让新手村的每一位童鞋都能训练出高分的语义模型,主打的就是一个快准狠。废话不多说

▍目录

  1. 代码介绍
  2. 算法简述
  3. 数据准备
  4. 模型训练
  5. 模型使用
  6. 资源获取(项目源码(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+的论文中文翻译。支付宝扫码支付自动弹出项目资源的百度网盘链接和提取码,永久有效。
独家整理资料:

  1. 论文人工翻译,语句通顺无歧义
  2. 关键地方添加中文注释,简单易懂
  3. 代码已调好参,直接训练即可收敛
  4. windows和linux下皆无bug
    在这里插入图片描述
### 关于点云语义分割的代码实现及复现方法 点云语义分割是一种重要的计算机视觉技术,广泛应用于自动驾驶、机器人导航等领域。为了实现点云语义分割并成功复现相关研究工作,可以参考以下内容。 #### 数据集准备 通常用于点云语义分割数据集包括但不限于SemanticKITTI[^2] S3DIS (Stanford 3D Indoor Spaces)[^3]。这些数据集提供了丰富的标注信息以及不同场景下的点云数据。在实际操作中,需下载对应数据集,并按照其官方文档说明完成预处理步骤。 #### 方法论概述 目前主流的方法基于深度学习模型架构设计而成,例如PointNet++ [^4], DGCNN (Dynamic Graph CNN) [^5] 等。这类网络能够有效捕捉局部特征并通过分层聚合机制提取全局特性从而达到较好效果。 对于多智能体强化学习与联邦学习相结合的方式,在边缘缓存优化方面有所应用但较少见诸于传统意义上的点云处理任务当中;不过这并不妨碍我们借鉴其中思想来改进现有算法性能或者探索新型解决方案路径 [^1]. #### 实验环境搭建指南 建议采用Python作为主要编程语言,并安装PyTorch框架支持GPU加速运算过程。以下是部分依赖库列表及其版本号推荐: ```bash pip install torch==1.9.0 torchvision==0.10.0 numpy matplotlib open3d scikit-learn tqdm ``` 此外还需要配置CUDA驱动程序以充分利用NVIDIA显卡资源提升训练效率。 #### 示例代码片段展示 下面给出一段简化版PointNet++实现的核心逻辑供参考: ```python import torch.nn as nn from pointnet2_modules import PointNetSetAbstraction, PointNetFeaturePropagation class SemanticSegmentationModel(nn.Module): def __init__(self): super(SemanticSegmentationModel, self).__init__() # Set Abstraction Layers self.sa1 = PointNetSetAbstraction(npoint=512, radius=0.1, nsample=32, in_channel=3, mlp=[64, 64, 128]) self.sa2 = PointNetSetAbstraction(npoint=128, radius=0.2, nsample=64, in_channel=128 + 3, mlp=[128, 128, 256]) # Feature Propagation Layers self.fp2 = PointNetFeaturePropagation(in_channel=256 + 128, mlp=[256, 256]) self.fp1 = PointNetFeaturePropagation(in_channel=256 + 3, mlp=[256, 128]) # Final Layer for Classification self.conv1 = nn.Conv1d(128, 128, kernel_size=1, bias=False) def forward(self, xyz): l0_points = None l0_xyz = xyz # Forward Pass Through SA Modules l1_xyz, l1_points = self.sa1(l0_xyz, l0_points) l2_xyz, l2_points = self.sa2(l1_xyz, l1_points) # Backward Pass Through FP Modules l1_points = self.fp2(l1_xyz, l2_xyz, l1_points, l2_points) l0_points = self.fp1(l0_xyz, l1_xyz, l0_points, l1_points) # Apply Convolutional Layer For Output Prediction output_features = self.conv1(l0_points).transpose(1, 2).contiguous() return output_features ``` 此段代码仅展示了如何构建一个基本的前向传播流程而不涉及具体损失函数定义等内容,请根据实际情况补充完善整个项目结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值