神经网络学习笔记2:图像语义分割模型的选型与部署实践
在智能驾驶领域,常使用图像语义分割使控制器了解周围的环境。图像语义分割还能为视觉惯性组合导航生成其所需的语义化特征,具有广阔的应用前景。本文记录了一次完整的图像语义分割模型选型和部署的流程,以供参考。
在 Papers With Code 中挑选模型
Papers With Code 是一个社区驱动、公开透明的平台,专注于将最新的机器学习/人工智能研究论文与其开源代码实现、数据集与性能指标整合在一起。它提供论文摘要、GitHub 实现链接、基准榜单(如 SOTA leaderboard)及数据集和方法分类,帮助研究者和开发者快速了解、复现并比较技术细节与性能。
以这次需要的图像语义分割模型为例,在其 Browse State-of-the-Art 页面选择 Computer Vision 中的 Semantic Segmentation,可以发现很多 benchmarks 和在这些数据集中表现最好的模型。可以发现,其中较为流行的数据集为 Cityscapes,在 2024 年有 434 篇文章选择使用它作为数据集。它是一个专注于城市街景语义理解的大型图像数据集,包含来自德国等城市的高分辨率街景图像,主要用于语义分割、实例分割和场景理解等任务。数据集中提供了精细标注的像素级语义标签,广泛应用于自动驾驶与智能交通系统的研究中。
在 Cityscapes 数据集的详情页面,可以看到很多 benchmark,包括基于 Cityscapes 测试集和验证集的 Semantic Segmentation 测试、Panoptic Segmentation 测试、Real-Time Semantic Segmentation 测试等。测试中的每个条目都有论文链接和对应的开源 Github 链接,非常适合快速挑选并应用模型。
为了满足实时性需求,应该选择 Real-Time Semantic Segmentation 测试中表现较好的模型作为比较对象。注意到性能较好的模型为 PIDNet,它在 31.1 fps 的帧率下实现了 80.6% 的 mIoU,具备较强的识别能力,因此选择它进入下一阶段。
部署 PIDNet
在详情页面可以看到 PIDNet 的 (Github 仓库链接)[https://github.com/XuJiacong/PIDNet],在仓库的 README 中给出了不同尺寸的模型下载链接,以及详细的使用和复现流程。通过如下命令克隆仓库到本地:
1 | git clone https://github.com/XuJiacong/PIDNet.git |
接下来,为了将模型整合进现有的系统中,需要找到调用这个模型的方法。根据使用教程,在仓库的 tools
文件夹中找到了一些可以直接运行的文件。其中 train.py
是训练流程,此处不涉及。eval.py
用于验证模型在 Cityscapes 中的性能,包含了一些冗余代码。而 custom.py
用于对给出的单个图片进行语义分割,最为精简,可供参考。其代码如下:
1 | # ------------------------------------------------------------------------------ |
程序首先根据指定的模型类型(如 pidnet-l
)初始化模型,并通过 load_pretrained
函数加载预训练模型参数,该函数会读取指定路径下的预训练权重文件,并将符合形状要求的权重加载进模型。随后,从指定目录读取所有图像路径,对每张图像进行预处理:先通过 input_transform
函数进行归一化和标准化处理(按照 ImageNet 的 mean
和 std
),然后将图像维度从 HWC 转换为 CHW 并封装成 PyTorch Tensor,再将其送入模型进行前向推理。推理结果通过 F.interpolate
进行尺寸恢复,然后用 torch.argmax
获取像素级的分类结果。
由此,可以剔除多余的代码,封装一个类。这个类在创建时可以完成模型权重和各种常量的定义,并提供一个分割函数。将 OpenCV 的图像传入后,返回一个分割并着色后的结果。代码如下:
1 | import torch |
然后,可以将其整合进 ROS 节点,这个节点监听相机的图片 topic,在相机拍摄图片后进行分割并且输出到自己的 topic 中,供后续节点进行处理。代码如下:
1 | #!/usr/bin/env python3 |
至此,完成了图像语义分割模型的选型和部署。