乐趣区

关于机器学习:MindSpore课程作业经验基于MindSpore框架的道路场景语义分割方法研究

基于 MIndSpore 框架的路线场景语义宰割办法钻研概述本文以华为最新国产深度学习框架 Mindspore 为根底,将城市道路下的实况图片解析作为工作背景,以简单城市道路进行高精度的语义宰割为工作指标,对上述难处进行探索并提出相应计划,胜利地在 Cityscapes 数据集上实现了语义宰割工作。整体的技术计划见图:

本帖仅对代码上的更改以及我的项目进行介绍。我的项目地址 https://gitee.com/xujinmingha… 相干配置硬件配置操作系统 Ubuntu 18.04 硬件架构 X86_64CPUIntel® Xeon® Gold 6154 CPU @ 3.00GHzGPUNVIDIA-A100(40G)深度学习框架 Mindspore 1.6.0Batch_sizes7Cityscapes 数据集:Cityscapes 数据集提供了 3475 张细粒度宰割标签图,以及 20 000 张粗略宰割的图像,本文应用了细粒度标注的 train/val 集进行训练和验证,此数据集与之前的 CamVid,Leuven,Daimler 城市数据集不同,Cityscapes 更多的捕捉到了真实世界的城市道路场景的多样性与复杂性,尤其是为城市环境中的主动驾驶量身定制,波及范畴更广的高度简单的市中心街道场景,并且这些场景别离在 50 个不同城市采集。

数据集下载地址:https://www.cityscapes-datase… 实现流程记录 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.txt3、网络架构选用可插拔的残差网络,以及金字塔池化模块解码。相干代码实现在 src/model 目录下。ResNet 论文地址:https://arxiv.org/abs/1512.03… 论文地址: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、后果展现:roadtraffic lightriderbicyclesidewalktraffic signcarpole97.81%63.08%56.61%74.33%83.69%69.24%92.79%45.66%buildingvegetationtruckpersonfenceskytrainmIoU90.71%90.43%71.73%75.35%55.50%92.89%43.63%74.874%

退出移动版