基于MIndSpore框架的道路场景语义分割方法研究

概述

本文以华为最新国产深度学习框架Mindspore为基础,将城市道路下的实况图片解析作为任务背景,以复杂城市道路进行高精度的语义分割为任务目标,对上述难处进行探究并提出相应方案,成功地在Cityscapes数据集上完成了语义分割任务。

整体的技术方案见图:

本帖仅对代码上的更改以及项目进行介绍。

项目地址

https://gitee.com/xujinminghahaha/mindspore_model

相关配置

硬件配置

操作系统 Ubuntu 18.04 硬件架构 X86_64
CPU Intel(R) Xeon(R) Gold 6154 CPU @ 3.00GHz GPU NVIDIA-A100(40G)
深度学习框架 Mindspore 1.6.0 Batch_sizes 7

Cityscapes数据集:

Cityscapes数据集提供了3475张细粒度分割标签图,以及20 000张粗略分割的图像,本文使用了细粒度标注的train/val集进行训练和验证,此数据集与之前的CamVid,Leuven,Daimler 城市数据集不同,Cityscapes更多的捕捉到了真实世界的城市道路场景的多样性与复杂性,尤其是为城市环境中的自动驾驶量身定制,涉及范围更广的高度复杂的市中心街道场景,并且这些场景分别在50个不同城市采集。



数据集下载地址:https://www.cityscapes-dataset.com/

实现流程记录

1、 参考华为官方gitee仓库的modelzoo克隆至本地,找到research/cv/PSPNet目录,在此代码基础上进行修改。



本项目基于GPU平台,对modelzoo中原有的昇腾文件已清除。代码中shell_command提供了训练脚本和验证脚本的启动命令,同时附带linux服务器一键下载Cityscapes下载方式。

2、由于选题是道路场景,所以需要更改数据集为Cityscapes,由于modelzoo上的数据集仅支持VOC2012和ADE20K,所以需要增加对数据集的适配和标签信息转换。

在代码中已经添加了对于cityscapes的像素点和label的转换代码,可以直接使用,其中颜色和类别的映射关系请见:config/cityscapes_colors.txt以及config/cityscapes_names.txt

3、网络架构选用可插拔的残差网络,以及金字塔池化模块解码。相关代码实现在src/model目录下。

ResNet论文地址:https://arxiv.org/abs/1512.03385

PSPNet论文地址:https://arxiv.org/abs/1612.01105

网络结构图:



金字塔池化模块:



loss函数的设计:



实际训练时的loss值变化趋势:

特色功能

4、测试时增强(TTA, Test Time Augmentation),通过多尺度推理最后取平均的方法获得更好的效果:

以下给出方法伪码,供大家参考,具体实现请结合代码仓库查阅。

# Algorithm 1: TTA(Test Time Augmentation)
# Input:Image,Scales,Crop_size,Net
# OutPut:Image with Label batch, _,ori_height, ori_width = image.shape #获取图像shape
stride_h ,stride_w = crop_size #步长,cropsize为训练时设置的crop参数
final_pred = Tensor(np.zeros([1, dataset.num_classes, ori_height, ori_width])) #初始化结果
for scales:
image = dataset.multi_scale_aug(image,scale)
height, width = image.shape[:-1]
new_h, new_w = image.shape[:-1]
rows, cols = GetParam(new_h, new_w) #一张图片分为row行和col列分块推理
preds = np.zeros([1, dataset.num_classes, new_h, new_w]).astype(np.float32)#初始化
count = np.zeros([1, 1, new_h, new_w]).astype(np.float32)#记录像素点推理次数
for rows,cols:
h0 , w0, h1, w1 = GetIndex(rows,cols,stride_h,strid_w) #获得格点坐标
crop_img = new_img[h0:h1, w0:w1, :]
crop_img = crop_img.transpose((2, 0, 1))
crop_img = np.expand_dims(crop_img, axis=0)
pred = dataset.inference(model, crop_img, flip)
preds[:, :, h0:h1, w0:w1] += pred.asnumpy()[:, :, 0:h1 - h0, 0:w1 - w0]
count[:, :, h0:h1, w0:w1] += 1 #将推理矩阵相加,再把标记矩阵相加
preds = preds / count #求得平均推理像素值
preds = preds[:, :, :height, :width]
preds = P.ResizeBilinear((ori_height, ori_width))(preds) #恢复原始大小
final_pred = P.Add()(final_pred, preds)
return final_pred

在config/pspnet_resnet_cityscapes_gpu.yaml下scales那一行,可以输入一个数组,该数组中每一个Value对应一个Scale,inference将会在此scale下输出一次。

5、 结果展示:

road traffic light rider bicycle sidewalk traffic sign car pole
97.81% 63.08% 56.61% 74.33% 83.69% 69.24% 92.79% 45.66%
building vegetation truck person fence sky train mIoU
90.71% 90.43% 71.73% 75.35% 55.50% 92.89% 43.63% 74.874%

基于MIndSpore框架的道路场景语义分割方法研究的更多相关文章

  1. MindInsight:一款基于MindSpore框架的训练可视化插件

    技术背景 在深度学习或者其他参数优化领域中,对于结果的可视化以及中间网络结构的可视化,也是一个非常重要的工作.一个好的可视化工具,可以更加直观的展示计算结果,可以帮助人们更快的发掘大量的数据中最有用的 ...

  2. 基于C++17的泛型函数容器实现方法研究

  3. 笔记:基于DCNN的图像语义分割综述

    写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...

  4. 深度学*点云语义分割:CVPR2019论文阅读

    深度学*点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...

  5. 多篇开源CVPR 2020 语义分割论文

    多篇开源CVPR 2020 语义分割论文 前言 1. DynamicRouting:针对语义分割的动态路径选择网络 Learning Dynamic Routing for Semantic Segm ...

  6. CVPR2020:4D点云语义分割网络(SpSequenceNet)

    CVPR2020:4D点云语义分割网络(SpSequenceNet) SpSequenceNet: Semantic Segmentation Network on 4D Point Clouds 论 ...

  7. CVPR2020:点云弱监督三维语义分割的多路径区域挖掘

    CVPR2020:点云弱监督三维语义分割的多路径区域挖掘 Multi-Path Region Mining for Weakly Supervised 3D Semantic Segmentation ...

  8. 语义分割--全卷积网络FCN详解

    语义分割--全卷积网络FCN详解   1.FCN概述 CNN做图像分类甚至做目标检测的效果已经被证明并广泛应用,图像语义分割本质上也可以认为是稠密的目标识别(需要预测每个像素点的类别). 传统的基于C ...

  9. TensorFlow中的语义分割套件

    TensorFlow中的语义分割套件 描述 该存储库用作语义细分套件.目标是轻松实现,训练和测试新的语义细分模型!完成以下内容: 训练和测试方式 资料扩充 几种最先进的模型.轻松随插即用 能够使用任何 ...

随机推荐

  1. Linux系统安装Python3环境

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 本文基于如下Linux系统版本: 1.默认情况下,Lin ...

  2. 【hexo博客搭建】将搭建好的hexo博客部署到阿里云服务器上面(下)

    一.部署到阿里云服务器 既然博客也已经成功在本地部署,然后主题也成功安装,接下来就可以部署到服务器上面了,如果你也想要魔改matery主题,可以去各种博客上面找一找大佬的教程,或者联系我,也可以让你少 ...

  3. (AAAI2020 Yao) Graph Few-shot Learning via knowledge transfer

    22-5-13 seminar上和大家分享了这篇文章 [0]Graph few-shot learning via knowledge transfer 起因是在MLNLP的公众号上看到了张初旭老师讲 ...

  4. 131_Power Query之获取钉钉日志自动刷新Power BI报告

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 最近在玩钉钉日志,企业填写简单数据后方便汇总到一起比较实用的工具,但数据填写以后还是需要下载日志报表,比较麻烦. ...

  5. ML第一周学习小结

    最近的学习内容为<Python机器学习基础教程>这本书 从第一章开始,慢慢来,比较快. 一下为我的本周机器学习小结,以及下周的Flag. 本周收获 总结一下本周学习内容: 1.了解到机器学 ...

  6. 《Effective C++》阅读总结(四): 设计、声明与实现

    第四章: 设计与声明 18. 让接口更容易被正确使用,不易被误用 将你的class的public接口设计的符合class所扮演的角色,必要时不仅对传参类型限制,还对传参的值域进一步限制. 19. 设计 ...

  7. Django-request的常见属性

    瞧一瞧,看一看,Django时,获取Request的各个属性. Request的常见属性 request.META 返回一个python字典.它包含了所有的HTTP请求信息.如下代码: 点击查看代码 ...

  8. SQL如何用表A更新表B

    文章标题很短,因为问题的描述过于具体,标题就会显得过长. 这个问题更为准确地描述应该是这样:表结构雷同或者有相似字段的两张表A和B,如何用A表的字段数据去更新B表字段的数据? 操作方法: 1 upda ...

  9. Java命令行传递参数

    目录 命令行传参 代码运行 视频 命令行传参 有时候你希望运行一个程序的时候再传递给它消息. 这要靠传递命令行参数给main()函数实现 package com.broky.base; public ...

  10. 【C++函数题目】重载求数组中最小值的函数

    题目来源:https://acm.ujn.edu.cn Time Limit: 1 Sec  Memory Limit: 128 MB Description 写一个函数名称为miniElement( ...