基于MIndSpore框架的道路场景语义分割方法研究
基于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框架的道路场景语义分割方法研究的更多相关文章
- MindInsight:一款基于MindSpore框架的训练可视化插件
技术背景 在深度学习或者其他参数优化领域中,对于结果的可视化以及中间网络结构的可视化,也是一个非常重要的工作.一个好的可视化工具,可以更加直观的展示计算结果,可以帮助人们更快的发掘大量的数据中最有用的 ...
- 基于C++17的泛型函数容器实现方法研究
- 笔记:基于DCNN的图像语义分割综述
写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...
- 深度学*点云语义分割:CVPR2019论文阅读
深度学*点云语义分割:CVPR2019论文阅读 Point Cloud Oversegmentation with Graph-Structured Deep Metric Learning 摘要 本 ...
- 多篇开源CVPR 2020 语义分割论文
多篇开源CVPR 2020 语义分割论文 前言 1. DynamicRouting:针对语义分割的动态路径选择网络 Learning Dynamic Routing for Semantic Segm ...
- CVPR2020:4D点云语义分割网络(SpSequenceNet)
CVPR2020:4D点云语义分割网络(SpSequenceNet) SpSequenceNet: Semantic Segmentation Network on 4D Point Clouds 论 ...
- CVPR2020:点云弱监督三维语义分割的多路径区域挖掘
CVPR2020:点云弱监督三维语义分割的多路径区域挖掘 Multi-Path Region Mining for Weakly Supervised 3D Semantic Segmentation ...
- 语义分割--全卷积网络FCN详解
语义分割--全卷积网络FCN详解 1.FCN概述 CNN做图像分类甚至做目标检测的效果已经被证明并广泛应用,图像语义分割本质上也可以认为是稠密的目标识别(需要预测每个像素点的类别). 传统的基于C ...
- TensorFlow中的语义分割套件
TensorFlow中的语义分割套件 描述 该存储库用作语义细分套件.目标是轻松实现,训练和测试新的语义细分模型!完成以下内容: 训练和测试方式 资料扩充 几种最先进的模型.轻松随插即用 能够使用任何 ...
随机推荐
- Docker系列教程01-使用Docker镜像
docker系列导读 一文带你读懂什么是docker Docker安装部署 10张图带你深入理解Docker容器和镜像 前言 学习Docker,我们需要掌握它的三大核心概念:镜像.容器和仓库. 今天先 ...
- java.sql和javax.sql的区别
根据 JDBC 规范,javax.sql 包中的类和接口首先作为 JDBC 2.0 可选包提供.此可选程序包以前与 J2SE1.2 中的 java.sql 程序包是分开的.从 J2SE1.4 开始,这 ...
- Redis源码漂流记(二)-搭建Redis调试环境
Redis源码漂流记(二)-搭建Redis调试环境 一.目标 搭建Redis调试环境 简要理解Redis命令运转流程 二.前提 1.有一些c知识简单基础(变量命名.常用数据类型.指针等) 可以参考这篇 ...
- 最新管家婆财贸ERP C9 V22.0的应用网页版的财务软件1000用户补丁免狗授权注册机网络版软件下载
管家婆财贸ERPC9应用价值: 1.多组织独立核算 多种组织形态核算,出具独立的三大财务报表及业务报表,发挥经营管理的积极性,便于专业化运营. 2.兼顾统筹与分权 满足多种集团统管与分权管控模式需求, ...
- .Net 在容器中操作宿主机
方案描述 在 docker 容器中想操作宿主机,一般会使用 ssh 的方式,然后 .Net 通过执行远程 ssh 指令来操作宿主机.本文将使用 交互式 .Net 容器版 中提供的镜像演示 .Net 在 ...
- Android 12(S) 图像显示系统 - GraphicBuffer同步机制 - Fence
必读: Android 12(S) 图像显示系统 - 开篇 一.前言 前面的文章中讲解Android BufferQueue的机制时,有遇到过Fence,但没有具体讲解.这篇文章,就针对Fence这种 ...
- 课堂练习——neo4j简单使用
启动neo4j: neo4j.bat console 进入neo4j数据库的conf目录下,编辑neo4j.conf文件:将当前数据库设置为你要建立的数据库名称(数据库不能重名): dbms.acti ...
- 【工程应用七】接着折腾模板匹配算法 (Optimization选项 + no_pregeneration模拟 + 3D亚像素插值)
在折腾中成长,在折腾中永生. 接着玩模板匹配,最近主要研究了3个课题. 1.创建模型的Optimization选项模拟(2022.5.16日) 这两天又遇到一个做模板匹配隐藏的高手,切磋起来后面就还是 ...
- Solon 1.8.0 发布,云原生微服务开发框架
相对于 Spring Boot 和 Spring Cloud 的项目 启动快 5 - 10 倍 qps 高 2- 3 倍 运行时内存节省 1/3 ~ 1/2 打包可以缩小到 1/2 ~ 1/10(比如 ...
- 【SpringSecurity系列1】基于SpringSecurity实现前后端分离无状态Rest API的权限控制
源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...