利用“DeepLab”算法在“树莓派”人工智能摄像头上检测路面坑洼
扫描二维码
随时随地手机看文章
该项目使用了一款定制训练的 DeepLabv3+ 语义分割模型来检测摄像头画面中的路面坑洼。该模型会生成一个像素级别的掩码:一类用于背景,一类用于坑洼。您可以在 Jupyter 笔记本中对图像进行推理操作,或者在配备 AI 相机的树莓派上实时运行该模型。训练、转换和运行该模型所需的所有代码都在教程笔记本和配套的 aicamera 脚本中。
项目概述
它的作用/功能是
•使用定制的 DeepLabv3+ 模型(例如 RoadVis-Segmentation 数据集)对道路坑洼进行分段处理,该模型包含两个类别:背景和坑洼。
•通过应用模块库(modlib)在树莓派人工智能摄像头上运行;笔记本电脑和树莓派都使用相同的 DeepLab 模型类和 modlib 标注器。
•在每一帧上绘制分割掩码,以便您能够核实坑洼区域;在笔记本电脑上,您可对图像进行推理并保存或显示带有注释的帧;在树莓派上,有一段脚本会使用人工智能摄像头流,并显示一个带有掩码叠加的实时窗口(例如,坑洼显示为黄色)。
主要组件
1.DeepLabv3+ 模型 是一种具有两类(背景、坑洞)的语义分割模型。输入图像会被调整为 120×120 的尺寸,进行标准化处理(例如除以 256),然后通过网络进行处理。后处理程序会将模型的输出转换为单通道的掩码。
2.预处理和后处理
预处理会将图像调整至模型的输入尺寸,并对像素值进行缩放。后处理会在类别维度上应用“最大值”操作,并将背景类别映射为 -1,以便能够正确地可视化掩码。
3.可视化 在笔记本中,您需对一组图像文件(例如验证集)调用“visualize()”函数,该函数会使用 Keras 解释器并将标注后的帧保存到磁盘;随后的单独单元格会显示保存的图像。在树莓派上,您需使用教程中的笔记本文件夹“deeplab3-pothole/aicamera”中的脚本(deeplab_aicam.py),该脚本会将转换后的模型部署到 AI 相机上,并在帧上叠加分割掩码并显示实时窗口。
启动项目
你需要的东西
硬件
•树莓派(需搭配兼容的操作系统;该教程中提到可在人工智能摄像头上运行的树莓派操作系统“特里西”)
•树莓派人工智能摄像头
树莓派上的软件(用于运行模型)
•已安装 modlib 的 Python 环境(有关安装步骤,请参阅 modlib 仓库)。
•您转换后的模型输出文件(名为“packerOut.zip”的文件)或已打包的模型(文件扩展名为“.rpk”的文件),需放置在 aicamera 脚本所期望的路径中。
用于训练和转换(通常在个人电脑或 Colab 上进行)
•该教程是一个在 Colab 环境中使用 GPU 的 Jupyter 笔记本。其内容包括:安装训练库、数据集设置、训练与量化、推理与可视化、转换为 IMX500 格式以及在 Raspberry Pi AI 相机上运行。
教程和代码
所有步骤:数据集、训练、量化、转换以及推理/可视化代码——都存于本存储库中:
DeepLabv3+ 路坑修复教程(custom_deeplab.ipynb)
•数据集:RoadVis-Segmentation(版本 2),包含坑洼类别的语义分割。要使用 Roboflow 数据集,您需要拥有 Roboflow 账户并同意 Roboflow 服务条款。
•训练使用了来自 aitrios-rpi-training-samples 的“deeplab3”工具以及关于 DeepLab 的训练文档。
•该笔记本包含了 DeepLabv3 模型类、一个 Keras 解释器设备以及一个用于处理图像的可视化函数。同一个代码库还提供了适用于树莓派的脚本,位于 notebooks/deeplab3-pothole/aicamera 文件夹中,用于实现实时的人工智能摄像头可视化。
代码分解(来自教程)
该笔记本定义了一个深度学习模型包装器和一个可视化流程。以下是主要思路;如需查看完整代码,请使用该笔记本。
1. DeepLabv3 模型类
该模型类会加载权重(使用 Keras 格式或转换后的格式),并采用固定的输入尺寸 120×120 以及归一化处理(归一化均值为 0,归一化标准差为 256)。
预处理步骤:将图像调整为 120×120 的尺寸并进行归一化(除以 256),然后通过解释器添加批次维度。
后处理步骤:在输出张量的类别轴上应用最大值运算,并在掩码中将背景(类别 0)设置为 -1;返回一个“分割对象”。
2. Keras 解释器(仅适用于笔记本环境)
该笔记本使用了一个进程内解释器(InterpreterDevice,它通过 MCT 自定义对象加载 .keras 模型)。它会运行模型的预处理和后处理步骤,从而确保相同的 DeepLab 流程用于推理。该笔记本的 visualize() 函数仅接受 .keras 模型;而对于 AI 相机,您需要使用单独的 aicamera 脚本。
3. 可视化:笔记本电脑与树莓派的比较
在该笔记本中,visualize() 函数:
•接收一个.keras 模型路径、一个图像文件夹(例如验证集)以及诸如输出目录和保存图像等选项。
•使用图像(images)作为数据源,并使用 InterpreterDevice 来部署模型。
•对于每一帧:如果没有分割区域,则直接保存或显示该帧;否则,调用 annotator.annotate_segments() 函数,并传入 frame.detections 参数,然后保存或显示已标注的帧。
•若设置“save_image=True”,则会将标注后的帧保存至输出文件夹;另外还有一个单元格会显示这些已保存的图像。
在树莓派上,该教程在“notebooks/deeplab3-pothole/aicamera”文件夹中提供了“deeplab_aicam.py”文件。它使用了相同的 DeepLabv3 模型类和 modlib Annotator,但将转换后的模型(例如路径为“MODEL_CONVERTED”中的“packerOut.zip”)部署到 AI 相机中,并使用相机作为帧源。该脚本通过调用“frame.display()”显示了一个实时窗口,并在坑洼区域绘制了分割掩码。
4. 配置文件(训练)
训练使用了在笔记本中创建的两个配置文件:
•deeplab_v3p_pothole.ini:框架(基于 Keras),模型名称(DeeplabV3p),输入尺寸为 [120, 120],类别数量为 2,批次大小,训练轮数(带提前停止机制),以及 YAML 配置文件的路径。
•deeplab_v3p_pothole.yml 文件:基础架构(例如 mobilenetv2),模型参数中的 classes(0:背景,1:坑洞,2:空域),以及指向数据集的数据根路径。尽管数据集配置中列出了第三个标签(空域),但在训练过程中它被当作忽略/掩码类处理,因此模型在训练时仅被训练预测两个类别:背景和坑洞。
•对于不同的分割任务,您需要按照“DeepLab 新数据集文档”中的说明更改类别数量、类别名称以及数据集路径。
培训与转换
1. 数据集
该教程使用了 RoadVis-Segmentation 数据集。通过 Roboflow 下载后(格式为 png-mask-semantic),该笔记本会将其整理成深度学习训练器所期望的文件夹结构:train/JPEGimages、train/SegmentationClassRaw、train/label_data.txt,以及类似的结构用于 valid 和 test 文件夹。
2. 训练与量化
在该笔记本中,训练和量化操作的运行参数为:
训练采用了提前停止的策略;该笔记本指出,大约进行 75 个周期的训练就能获得可用的分割结果,而继续训练会进一步提升效果。最终输出的是一个量化后的 Keras 模型(例如:deeplab_v3p_pothole_quantized.keras)。
3. 转换与包装
将量化模型转换为 IMX500 所需的格式:
这会生成 packerOut.zip(以及其他相关文件)。按照 Raspberry Pi AI 相机文档(“打包”)中所述,为 Raspberry Pi 上的 AI 相机打包模型,并使用生成的 packerOut.zip 作为输入。
转换过程也在索尼 IMX500 转换器的使用说明书中有所记载。
在树莓派人工智能摄像头上运行
1.从教程仓库中获取 aicamera 脚本:前往 notebooks/deeplab3-pothole/aicamera 文件夹。名为 deeplab_aicam.py 的脚本使用与笔记本相同的 DeepLabv3 模型和 modlib Annotator,但将转换后的模型部署到了 AI 相机上,并显示了一个实时窗口。
2.在树莓派上安装 uv(来自 Astral)和 modlib。
3.在脚本中设置模型路径:变量“MODEL_CONVERTED”应指向您转换后的模型(例如“packerOut.zip”)。首次运行时,该应用程序可能会先将转换后的模型打包,然后部署到人工智能摄像头上。
4.将转换后的输出文件(例如“packerOut.zip”)放置在“MODEL_CONVERTED”所指向的位置(例如“~/models/deeplabv3/pothole/”)。
5.运行该应用程序(例如,在“aicamera”文件夹中执行“uv run deeplab_aicam.py”命令)。该脚本使用了 PEP 723 内联脚本元数据,因此“uv”能够自动安装依赖项。
6.将相机对准道路表面或者屏幕上的验证图像,以确认坑洼的分割情况。
查看结果
在笔记本中:在调用 visualize() 并设置 save_image=True 后,标注后的帧会保存在输出文件夹中(例如 saved_images/)。下一单元格会显示这些帧,以便您确认坑洼类是否被正确分割。如果模型训练的周期较短,某些图像可能不会显示任何检测结果。
在树莓派上:aicamera 脚本会显示一个实时窗口。每一帧都会标注上分割掩码(例如,黄色区域表示坑洼区域)。利用此功能来验证坑洼区域是否如预期那样被突出显示。然后,您可以根据自己的逻辑扩展该流程(例如,发出警报或进行记录)。
本文编译自hackster.io





