课程打卡凭证
语义分割
语义分割是计算机视觉的一个重要任务,其目标是对图像中的每一个像素进行分类,使得每个像素都被分配到一个特定的类别。与图像分类任务不同,图像分类只要求识别出图像中主要对象的类别,而语义分割则需要对图像中的每一个像素点都进行精确的类别划分,从而实现对图像内容的更细致理解。具体如下图所示。
FCN模型
FCN(Fully Convolutional Networks,全卷积神经网络)是一种利用深度学习进行语义分割的深度学习模型,它有如下三个主要特点:
卷积化
FCN将传统CNN中的全连接层替换为卷积层,使得网络可以处理任意尺寸的输入图像,并输出与输入图像尺寸相对应的分割结果。具体如下图所示。
上采样
为解决卷积和池化操作导致图像尺寸变小的问题,FCN使用上采样(如转置卷积)方式恢复图像尺寸,从而实现对每个像素的分类。具体如下图所示。
跳跃结构
FCN采用跳跃结构,将不同层次的特征图进行融合,以确保分割结果的鲁棒性和精确性。这种结构有助于在保留图像细节的同时,获取更强的语义信息。具体如下图所示。
数据处理
下载数据集。
这个类的初始化函数定义了数据预处理所需的参数,例如图像均值、标准差、数据文件路径、批次大小、裁剪大小、缩放比例等,并且确保最大缩放比例大于最小缩放比例。
该函数负责对图像和标签进行预处理,包括解码、缩放、归一化、填充、随机裁剪和随机水平翻转等操作。处理后的图像和标签会被转换为合适的格式以供模型使用。
get_dataset函数配置NUMA(非统一内存访问)并加载MindSpore格式的数据集。它将preprocess_dataset函数作为映射操作应用于数据集中的每一对图像和标签,随后对数据集进行打乱和分批处理。
最后实例化数据集。
训练集可视化,结果如下图所示。
网络构建
定义FCN-8s的类,继承自nn.Cell。
conv1是第一组卷积层,包含两个卷积操作,每个卷积操作后面跟随一个批量归一化层和ReLU激活函数。pool1是一个2x2的最大池化层,将特征图的大小减半。
同理,定义conv2到conv5和对应的池化层pool2到pool5。
将全连接层替换为卷积层,使得网络可以处理任意大小的输入。
定义最后的分类层和上采样层,用于将低分辨率的特征图恢复到与输入图像相同的大小。
定义前向传播过程。将输入的x经过一系列卷积层和池化层提取特征,接着通过上采样层逐步恢复分辨率,最终输出与输入图像相同大小的分割图。
训练准备
下载预训练的VGG16模型参数,并且加载这些参数到前面定义的FCN-8s网络中。
该类用于计算整体像素准确度,即正确分类的像素数与总像素数的比值。
该类用于计算每个类别的像素准确度的平均值。
该类用于计算每个类别的交并比 (IoU) 的平均值。
该类用于计算频率加权的交并比 (IoU),考虑类别不平衡的问题。
模型训练
结果如下图所示。
模型评估
四个指标的结果如下图所示。
模型推理
结果如下图所示。