一、前言
此示例演示如何使用语义分割网络对图像进行分割。
语义分割网络对图像中的每个像素进行分类,从而生成按类分割的图像。语义分割的应用包括自动驾驶的道路分割和医疗诊断的癌细胞分割。
此示例首先向您展示如何使用预训练的 Deeplab v3+ [1] 网络分割图像,该网络是一种专为语义图像分割而设计的卷积神经网络 (CNN)。其他类型的语义分割网络包括全卷积网络(FCN),SegNet和U-Net。然后,您可以选择下载数据集以使用迁移学习训练 Deeplab v3 网络。此处显示的训练过程可以应用于其他类型的语义分割网络。
为了说明训练过程,此示例使用了剑桥大学的CamVid 数据集[2]。此数据集是包含驾驶时获得的街道级视图的图像集合。该数据集为 32 个语义类(包括汽车、行人和道路)提供像素级标签。
二、下载预训练语义分割网络
下载在CamVid数据集上训练的DeepLab v3+的预训练版本。加载预训练网络。列出此网络经过训练以分类的类。
三、执行语义图像分割
读取包含网络被训练进行分类的类的图像。将图像大小调整为网络的输入大小。使用函数和预训练网络执行语义分割。将分割结果叠加在图像顶部。将叠加颜色图设置为CamVid数据集[2]定义的色彩图值。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
尽管该网络是在城市驾驶图像上进行预训练的,但它在高速公路驾驶场景中产生了合理的结果。为了改善分割结果,应使用包含高速公路驾驶场景的其他图像重新训练网络。此示例的其余部分介绍如何使用迁移学习训练语义分割网络。
四、训练语义分割网络
此示例使用从预先训练的 Resnet-3 网络初始化的权重训练 Deeplab v18+ 网络。ResNet-18 是一种高效的网络,非常适合处理资源有限的应用。其他预训练网络,如MobileNet v2或ResNet-50,也可以根据应用要求使用。
五、下载凸轮维数据集
从以下 URL 下载 CamVid 数据集。注意:数据的下载时间取决于您的互联网连接。上面使用的命令会阻止 MATLAB,直到下载完成。或者,您可以使用 Web 浏览器先将数据集下载到本地磁盘。要使用从 Web 下载的文件,请将上面的变量更改为下载文件的位置。
六、加载摄像头图像
使用图像数据存储加载CamVid图像。使您能够有效地在磁盘上加载大量图像。显示其中一个图像。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
七、加载 CamVid 像素标记的图像
加载 CamVid 像素标签图像数据。A 将像素标签数据和标签 ID 封装到类名映射中。为了使培训更容易,请将CamVid中的32个原始课程分组为11个班级。
要将 32 个类减少到 11 个类,原始数据集中的多个类将分组在一起。例如,“Car”是“Car”,“SUVPickupTruck”,“Truck_Bus”,“Train”和“OtherMoving”的组合。使用本示例末尾列出的支持函数返回分组的标签 ID。
使用类和标注 ID 创建pixelLabelDatastore.
通过将其中一个像素标记的图像叠加在图像上来读取和显示该图像。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
没有颜色叠加的区域没有像素标签,并且在训练期间不使用。
八、分析数据集统计信息
按类可视化像素计数。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
理想情况下,所有类将具有相同数量的观测值。然而,CamVid中的类是不平衡的,这是街景汽车数据集中的常见问题。此类场景的天空、建筑物和道路像素比行人和骑自行车者像素多,因为天空、建筑物和道路覆盖了图像中的更多区域。如果处理不当,这种不平衡可能会对学习过程有害,因为学习偏向于主导阶级。在本示例的后面部分,您将使用类权重来处理此问题。
CamVid数据集中的图像大小为720 x 960。选择图像大小时,在具有 12 GB 内存的 NVIDIA™ Titan X 上进行训练时,内存中可以容纳足够大的图像。如果您的 GPU 没有足够的内存或减小训练批次大小,您可能需要将图像大小调整为较小的大小。
九、准备训练、验证和测试集
Deeplab v3+ 使用数据集中 60% 的图像进行训练。其余图像分别平均分为 20% 和 20% 进行验证和测试。以下代码将图像和像素标签数据随机拆分为训练集、验证集和测试集。
60/20/20 拆分会产生以下数量的训练、验证和测试映像:
十、创建网络
使用该函数创建基于 ResNet-3 的 DeepLab v18+ 网络。为您的应用程序选择最佳网络需要实证分析,这是超参数调优的另一个级别。例如,您可以尝试不同的基础网络,如 ResNet-50 或 MobileNet v2,或者您可以尝试其他语义分割网络架构,如 SegNet、全卷积网络 (FCN) 或 U-Net。
十一、使用类权重平衡类
如前所述,CamVid 中的类不平衡。为了改进训练,您可以使用类权重来平衡类。使用像素分类图层指定类权重。
十二、选择培训选项
用于训练的优化算法是随动量随机梯度下降 (SGDM)。
学习率使用分段时间表。学习率每 0 个时期降低 3.10 倍。这使得网络能够以更高的初始学习率快速学习,同时能够在学习率下降后找到接近局部最优的解决方案。
通过设置参数,每个纪元都针对验证数据对网络进行测试。设置为 4 可在验证精度收敛时提前停止训练。这可以防止网络在训练数据集上过度拟合。
小批量大小 8 用于减少训练时的内存使用量。您可以根据系统上的 GPU 内存量增加或减少此值。
此外,设置为临时位置。此名称-值对允许在每个训练时期结束时保存网络检查点。如果训练因系统故障或断电而中断,您可以从保存的检查点恢复训练。确保 指定的位置有足够的空间来存储网络检查点。例如,保存 100 个 Deeplab v3+ 检查点需要 ~6 GB 的磁盘空间,因为每个检查点为 61 MB。
十三、数据增强
数据增强用于通过在训练过程中随机转换原始数据来提高网络准确性。通过使用数据增强,您可以向训练数据添加更多种类,而无需增加标记训练样本的数量。要对图像和像素标签数据应用相同的随机变换,请使用数据存储和 。
请注意,数据增强不适用于测试和验证数据。理想情况下,测试和验证数据应代表原始数据,并且不加修改以进行无偏评估。
十四、开始训练
如果标志为 true,则使用 trainNetwork(深度学习工具箱)开始训练。否则,请加载预训练网络。doTraining 注意:训练是在具有 12 GB GPU 内存的 NVIDIA™ Titan X 上验证的。如果您的 GPU 内存较少,则可能会在训练期间耗尽内存。如果发生这种情况,请尝试设置为 1 in ,或减少网络输入并调整训练数据的大小。训练此网络大约需要 70 分钟。根据您的 GPU 硬件,可能需要更长的时间。
十五、在一个映像上测试网络
作为快速健全性检查,请在一个测试映像上运行经过训练的网络。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
将 中的结果与 中存储的预期基本事实进行比较。绿色和洋红色区域突出显示分割结果与预期地面实况不同的区域。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
在视觉上,语义分割结果对于道路、天空和建筑物等类的重叠很好。但是,行人和汽车等较小的物体并不那么准确。每个类的重叠量可以使用交集联合 (IoU) 指标(也称为 Jaccard 指数)来衡量。
IoU 指标确认视觉结果。道路、天空和建筑类的 IoU 分数很高,而行人和汽车等类的 IoU 分数较低。
十六、评估训练的网络
要测量多个测试图像的准确性,请在整个测试集上运行语义eg。小批量大小 4 用于在分割图像时减少内存使用量。您可以根据系统上的 GPU 内存量增加或减少此值。
将测试集的结果作为对象返回。中每个测试图像的实际像素标签数据将写入参数指定位置的磁盘。尽管整体数据集性能相当高,但类指标显示,代表性不足的类(如 、 和)未像 、 和 等类那样分段。包含更多代表性不足类样本的其他数据可能有助于改善结果
十七、程序
下载方式一:基于matlab使用深度学习的语义分割算法实现资源-CSDN文库
下载方式二:基于matlab使用深度学习的语义分割算法实现