推广 热搜: 行业  设备    系统  参数  经纪    教师  机械  中国 

基于MindSpore复现Deeplabv3—语义分割

   日期:2024-11-10     作者:n19v1    caijiyuan   评论:0    移动:http://sjzytwl.xhstdz.com/mobile/news/5739.html
核心提示:本实验主要介绍使用MindSpore深度学习框架在PASCAL VOC2012数据集上训练Deeplabv3网络模型。本实验使用了MindSpore开源仓库model

本实验主要介绍使用MindSpore深度学习框架在PASCAL VOC2012数据集上训练Deeplabv3网络模型。本实验使用了MindSpore开源仓库model_zoo中的deeplabv3模型案例。

基于MindSpore复现Deeplabv3—语义分割

图像的语义分割是计算机视觉中重要的基本问题之一,其目标是对图像的每个像素点进行分类,将图像分割为若干个视觉上有意义的或感兴趣的区域,以利于后续的图像分析和视觉理解。输入输出为大小相同的图片。

随着DCNN(深度卷积网络)的发展,图片中的特征更容易提取。Deeplab系列语义分割算法就是在DCNN算法的基础上发展而来。这里先描述一下语义分割DCNN网络是如 何设计,调整VGG16模型,转为一个可以有效提取特征的语义分割系统。具体来说,先将VGG16的FC层转为卷积层,模型变为全卷积的方式,在图像的原始分辨率上以非常稀疏地方式计算(步幅32,步幅=输入尺寸/输出特征尺寸,为了以更密集(步幅8)的方式计算,我们在最后的两个最大池化层不进行下采样(same padding,而通过2或4的采样率的空洞卷积对特征图做采样扩大感受野,缩小步幅。

此外分类器获取以对象中心的决策是需要空间变换的不变性,这天然的限制了DCNN的定位精度,DeepLabv采用完全连接的条件随机场(DenseCRF)提高模型捕获细节的能力(全局)。Deeplabv1采用了条件随机场(CRF)进行进一步精修,细化边缘分割效果。Deeplabv3使用aspp池化代替crf,简化了模型。

Deeplabv1使用带孔卷积(atrous convolution)(也叫膨胀卷积), 能够明确地调整filters的感受野,并决定DNN计算得到特征的分辨率。使用crf捕捉全局特征,使边缘更锐利。Deeplabv2提出 Atrous Spatial Pyramid Pooling(ASPP)模块,挖掘不同尺度的卷积特征。Deeplabv3 编码了全局内容信息的图像层特征,提升分割效果。详细介绍参考论文:http://arxiv.org/abs/1706.05587 。

带孔卷积/膨胀卷积效果图

png

[1] 图片来源 https://arxiv.org/pdf/1706.05587.pdf

Deeplabv3网络结构图

png

[2] 图片来源 https://img.it610.com/image/info8/2caddeef33e4400791c34e4feed9d910.jpg

  • 了解如何使用MindSpore加载常用的PASCAL VOC2012数据集。
  • 了解MindSpore的model_zoo模块,以及如何使用model_zoo中的模型。
  • 了解Deeplabv3这类语义分割模型的基本结构和编程方法。
  • 熟练使用Python,了解Shell及Linux操作系统基本知识。
  • 具备一定的深度学习理论知识,如Encoder、Decoder、损失函数、优化器,训练策略、Checkpoint等。
  • 了解华为云的基本使用方法,包括OBS(对象存储)、ModelArts(AI开发平台)、训练作业等功能。华为云官网:https://www.huaweicloud.com。
  • 了解并熟悉MindSpore AI计算框架,MindSpore官网:https://www.mindspore.cn/。
  • MindSpore 1.1.1(MindSpore版本会定期更新,本指导也会定期刷新,与版本配套)。
  • 华为云ModelArts(控制台左上角选择“华北-北京四”:ModelArts是华为云提供的面向开发者的一站式AI开发平台,集成了昇腾AI处理器资源池,用户可以在该平台下体验MindSpore。

数据集准备

Pascal VOC2012数据集是针对视觉任务中监督学习的数据集, 它有二十个类别。主要有四个大类别,分别是人、常见动物、交通车辆、室内家具用品。这里使用VOC2012数据集中的分割数据进行fine-tune和测试。 可通过如下方式获取

  • 从官网下载数据集:VOC2012官网地址, 官方下载地址。

预训练模型准备

为了节省训练时间,本实验采用fine-tune的训练方式,我们提前准备好了预训练的checkpoint文件供下载使用,或使用如下方式直接拷贝到ModelArts执行容器中。

 

该模型为VOCaug数据集训练得到。VOCaug数据集是VOC2012数据集和SBD数据集的集合。SBD数据属于VOC2012数据集,但是VOC2012数据集的训练或者验证图片的标签图非常少。但是SBD给出的很多,所以可以综合这两个数据集得到更加多的带标签数据。

数据集名称训练测试VOC2012数据集14641449SBD数据集84982857VOCaug数据集8829

解析 VOCaug数据集8829样例个数已经去重。

本实验采用VOCaug数据集训练得到的DeeplabV3 Checkpoint,使用VOC2012训练数据集对模型进行微调训练,最后在VOC2012测试数据对模型进行测试。

脚本准备

从课程gitee仓库上下载本实验相关脚本。

上传文件

点击新建的OBS桶名,再打开“对象”标签页,通过“上传对象”、“新建文件夹”等功能,将脚本和数据集上传到OBS桶中,组织为如下形式

 
  • 拷贝OBS桶中的数据集。
 

代码梳理

代码文件说明

  • main.ipynb:代码入口文件
  • dataset.py:数据处理文件
  • loss.py:loss定义文件
  • deeplab_v3.py:Deeplabv3网络定义文件
  • learning_rates.py:学习率定义文件。

实验流程

  1. 修改main.ipynb训练参数并运行,运行训练cell得到模型文件。
  2. 修改main.ipynb测试1(test 1 cell)参数并运行,运行测试1单元得到mean iou结果。
  3. 修改main.ipynb测试2(test 2 cell)参数并运行,运行测试2单元得到可视化结果。

数据预处理(dataset.py

数据处理流程如下所示

  1. 将语义标签(原始图片为三通道彩色)转换为灰度图(dataset.py中SegDataset.get_gray_dataset
  2. 将图片和标签灰度图转换为mindrecord格式数据集(dataset.py中SegDataset.get_mindrecord_dataset
  3. 读取mindrecord数据集并预处理。(dataset.py中SegDataset.get_dataset。其中preprocess_为数据预处理。

具体过程如下所示,见(main.ipynb

 
VOC原始数据分析

VOC 数据集主要有 Object Classification(分类,20类) 、Object Detection(目标检测)、Object Segmentation(实例分割)、Human Layout(人体部位识别)、Action Classification(行为识别) 这几类子任务数据。总共分 4 个大类:vehicle、household、animal、person,总共 20 个小类(加背景 21 类)。类别如下所示。

  • Person: person
  • Animal: bird, cat, cow, dog, horse, sheep
  • Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train
  • Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor

VOC原始数据集包含以下目录结构

 

语义分割任务输入为图片(ImageSets/Segmentation文件中编号对应的在JPEGImages中的图片,输出为语义分割图(见SegmentationClass文件)。

ImageSets/Segmentation/train.txt文件如下所示,每一行对应一个编号(年_编号格式,这些编号在JPEGImages文件中可以找到,组成了训练集。测试集同理。

 

输入图片(JPEGImages中图片)如下所示

png

语义分割标签图(SegmentationClass)中图片如下所示(该分割图的原始图片为上图

png

其中颜色对应标签如下所示

png

[1]图片来源 https://blog.csdn.net/weixin_38437404/article/details/78788250?utm_source=blogxgwz7

标签转化为灰度图

从上面的颜色标签对应图可以发现,虽然标签图是三通道的,但是颜色只有21种(加背景的黑色)。为了减少计算量,我们将彩色图转换为灰度图。转换代码见src/dataset.py中get_gray_dataset。如下所示

 
将数据转换为mindrecord格式

本实验将图片和灰度分割图(标签)转换为mindrecord格式。见src/dataset.py中get_mindrecord_dataset函数。mindrecord字段包含

  • file_name :图片名字,字段类型string
  • label :语义分割灰度图,字段类型bytes
  • data:图片,字段类型bytes
 
读取mindrecord数据集并预处理(仅训练

训练时,读取前面构建好的mindrecord数据集,并进行归一化等预处理,参考见src/dataset.py中get_dataset函数preprocess_函数。具体预处理有以下几点

  1. 随机尺度缩放并归一化。
    • sc为随机尺度,最小尺度为self.min_scale,默认为0.5。最大尺度为self.max_scale,默认为2.0。
    • 样本随机尺度缩放是图片增强常用方法之一。
 
  1. 裁剪填充,代码如下所示。
    • self.crop_size设定为513,代表默认训练/测试图片大小为 $ 513 * 513 $ 。
    • self.ignore_label为255,代表标签图(语义分割灰度图)使用黑色填充边框/空白。
    • 图片使用白色填充边框/空白。
    • 经过裁剪填充以后的图片尺寸变大,最小尺寸为 $ 513 * 513 $ 。
    • 经过裁剪以后的图片和标签图保留了图片原有的信息。
 
  1. 图片resize,统一图片尺寸,切割图片尺寸为 [513,513] (self.crop_size,其中offset_h和offset_w为随机切割起点(图片增强方式)。
 
  1. 随机左右翻转,图片随机翻转是数据增强的常用方法之一。
 

注意 测试时,数据输入格式为tensor,数据预处理方式与训练相似(没有经过数据增强)。

Deeplabv3网络结构(deeplab_v3.py

本实验的Deeplabv3网络主要由ResNet特征提取模块、ASPP模块组成。

 
ASPP模块

Deeplabv2中的ASPP在特征顶部映射图使用了四种不同采样率的空洞卷积。这表明以不同尺度采样是有效的,在Deeplabv3中向ASPP中添加了BN层(参考class ASPPConv)。 不同采样率的空洞卷积可以有效捕获多尺度信息,但会发现随着采样率的增加,滤波器有效权重(权重有效的应用在特征区域,而不是填充0的边缘区域)逐渐变小。如下图所示

png

[4] 图片来源 https://arxiv.org/pdf/1706.05587.pdf

针对上面的问题,并将全局内容信息整合进模型中,则采用图像级特征。采用全局平均池化(global average pooling)对模型的feature map进行处理,将得到的 图像级特征输入到一个1×1 convolution with 256 filters(加batch normalization)中,然后将特征进行双线性上采样(bilinearly upsample)到特 定的空间维度。(参考class ASPPPooling

Deeplabv3网络变量分析

名称维度描述images_x(16, 3, 513, 513)输入图片维度 [batch_size, channel,h,w]lables(16, 513, 513)输入图片的标签 [batch_size, h,w] (见loss.py中labels)resnet_out(16, 2048, 65, 65)resnet输出(特征提取)aspp_x1(16,256, 65, 65)第一个aspp输出(见代码aspp1输出), rate = 1aspp_x2(16,256, 65, 65)第二个aspp输出(见代码aspp2输出), rate =6aspp_x3(16,256, 65, 65)第三个aspp输出(见代码aspp3输出), rate =12aspp_x4(16,256, 65, 65)第四个aspp输出(见代码aspp4输出), rate =18aspp_pooling_x5(16,256, 65, 65)aspp_pooling输出(见代码aspp_pooling输出)concat_x(16, 1280, 65, 65)前面五个x concatASPP_out(16, 21, 65, 65)ASPP模块输出(concat以后经过了两个卷积)net_out(16, 21, 513, 513)ASPP模块输出经过P.ResizeBilinear操作,是整个网络输出。

解析

  1. 表中的名称与代码有些出入,请根据表中英文名确定变量与代码对应关系。
  2. Deeplabv3网络输出net_out维度为(16,21,513,513)。训练计算loss时(参考loss.py,使用该结果和lables比较,进行梯度更新。

测试流程(数据流

本实验由两种测试方式,计算平均iou值和结果可视化。这两种方式的数据预处理和模型部分是一致的,只在结果的展示部分有区别。

构建测试网络

构建测试网络的代码如下所示,在DeepLabV3网络(参考前面Deeplabv3网络结构)的最后加了softmax层,保证输出概率为0-1的范围内。

 
测试数据处理

测试数据预处理部分与训练相似,但是没有做数据增强,只保留图片本身信息。测试数据后处理主要是将结果图片resize为原始大小,并利用argmax函数得到最后结果。测试数据处理过程如下所示,参考main.py测试部分。

  1. 读取图片和标签图,并分为batch。batch_img_lst变量中存放原始图片,列表长度为batch_size。batch_msk_lst变量中存放原始标签,列表长度为batch_size。
 
  1. 图像预处理,见pre_process函数。
    • 对原始图片resize并pad得到(513,513)图片 ,作为网络的输入。返回值为
      • resize为(513,513)大小的图片(img_
      • 长宽等比例缩放以后的尺寸(resize_h, resize_w(见resize_long函数)。
    • 归一化,归一化的方差和均值与训练一致。

提示:裁剪结果resize_h, resize_w中有一条边(原始长边)变为513,另一条同比例改变,变为小于513。

 
  1. 利用Deeplabv3网络进行预测,再行后处理。后处理见post_process,支持反向预测来增加结果准备度。后处理将结果(16,21,513,513)resize为原始尺寸大小。
 
  1. 测试支持多尺度预测,即考虑多种尺度输入图片并将结果相加以提高预测精度。参数scales,默认为[1.0],列表(list)类型。可以多添加几种尺度,列表长度 代表每个样例测试次数,会影响测试速度。参考eval_batch_scales函数。
 

训练输入文件导入

 

评价指标和可视化

前面已经提到测试有两种方式,方式一为平均iou,方式二为结果可视化。由测试cfg中参数控制。当为则采用可视化方式,当 为则计算推理结果和真实标签的平均iou(计算方式如下所示)。

 

训练输入文件导入

 

训练参数设定

 

测试参数设定

 

image-20220320180828471

训练日志结果

 

image-20220320182627686

测试iou结果

image-20220320182801473

 

image-20220320183506847

测试图片输出结果

取其中一张图片结果如下所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3OowXuWI-1647773037087)(images/example.png)]

 

注解 以上三张图片,第左边为原始图片,中间为预测语义分割图,最右边为真实语义分割标签图。

模型可视化

image-20220320183611162

 

image-20220320183619660

 

image-20220320183628356

本文地址:http://sjzytwl.xhstdz.com/news/5739.html    物流园资讯网 http://sjzytwl.xhstdz.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新文章
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新文章
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号