使用MXNet完成一个基于FCN的盲道实时语义分割

2023-11-13

一点说明

前段时间根据gluon的教程动手学深度学习和同学项目实地拍摄的盲道图片完成了一个基于FCN的盲道语义分割程序,也是自己第一次做语义分割的项目。一方面发现深度学习在盲道这种具有简单纹理和颜色特征的识别上具有非常好的效果,在速度和效果上表现都还不错,另一方面这也是为了练习如何使用gluon接口完成一个语义分割项目。

由于盲道纹理比较简单,为了提高推理速度仅训练FCN32s网络不再继续训练16s和8s。分别使用ResNet18,MobileNetV2以及0.25倍剪枝版的MobileNetV2作为backbone做了实验。测试硬件为笔记本Core™ i5-5200U CPU以及GeForce 920M GPU。为了轻量化以达到实时性最后使用的是0.25倍剪枝版的MobileNetV2,在CPU 上能跑到10帧,笔记本920M上能到接近20帧。

虽然还有很大的优化空间(例如:更好的语义分割算法,尝试Focal Loss效果,模型量化为Int 8,将完整分割网络的剪枝等,随着后续的学习有时间会继续尝试),不过目前综合速度和精度上来看都远胜过网上大多数基于颜色和简单规则纹理人工设计的盲道识别算法。

基本原理

FCN原理上面链接教程里已经写得很清楚了,这里就不再赘述:

  1. 使用在ImageNet上与训练好的模型作为主干网络,观察网络结构,去掉最后的全连接层或者是全局平均池化层以及输出层;
  2. 在主干网络后接一个1x1卷积层进行通道整理,卷积核数量就是你的类别数,后续会在每个通道上分别预测像素类别的概率,此处有盲道和背景,自然就是两类;
  3. 后接一个转置卷积层,通常此时网络将原图像下采样了1/32,此处转置卷积就设置为把特征图上采样32倍以达到和原图相同大小,可以随机初始化一个ndarray输入看看是否如此;
  4. 将转置卷积初始化为双线性插值,利于上采样效果提高和快速收敛,gluon教程里提供了双线性插值的初始化方法;
  5. 使用labelme软件制作语义分割的mask标签;
  6. 划分训练集和验证集读入数据进行训练,收敛很快,大概训练10个epoch左右即可(5个epoch对直道,多数横向纵纹理和远处效果已经很好,由于训练集中横向横纹理的图片较少,需要继续训练提高拟合效果),训练监测acc。根据实验经验,训练集和验证集acc至少达到98以上后在测试集上分割效果较好误检率也较低。另外实验表明0.25倍剪枝版的MobileNet识别能力不如另外两个网络并且相对容易过拟合,误检率稍高,训练这个网络时候更需要注意测试误检情况;
  7. 拍摄数据集时候需要拍摄尽可能多角度,远近以降低过拟合。训练时更科学的做法是监测精确率P和召回率R以PR曲线或ROC曲线作为评估指标。这里类别没有严重不平衡所以监测acc也能起到效果;

测试集效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

数据标注

用labelme多边形标注500张盲道图片(当然数量和角度距离的变化越多越好,我标了500张测试下来效果不错 ),当然亲测labelme语义分割标注还是很方便的。
标注完保存会得到与原图同名的.json文件,使用以下命令可以生成同名文件夹,包含原图,mask标签图等文件

labelme_json_to_dataset <文件名>.json

labelme的一个不方便之处是没有自带批量生成,为了不浪费时间需要写shell脚本完成批量生成标签文件夹。参考博客(https://blog.csdn.net/lyxleft/article/details/82222452)创建shell脚本可以批量处理,亲测高效可行!

    #!/bin/bash
    echo "Now begin to search json file..."
    for file in ./*
    do
        if [ "${file##*.}"x = "json"x ]
        then
        filename=`basename $file`
        temp_filename=`basename $file  .json`
        suf=_json
        new_filename=${temp_filename}${suf}
    #    echo $new_filename
        cmd="labelme_json_to_dataset ${filename} -o ${new_filename}"
        eval $cmd
        fi
    #    printf "no!\n "
    done

训练

基本设置

照搬教程的双线性初始化函数,其余的设置务必在理解教程的基础上根据自己项目的实际情况修改。注意颜色转换表的颜色应该与用labelme生成的mask的颜色相对应。

import os
import d2lzh as d2l
from mxnet import gluon, image, nd, init
from mxnet.gluon import nn, model_zoo, data as gdata, utils as gutils, loss as gloss
import sys
import numpy as np
import matplotlib.pyplot as plt
import mxnet as mx

#双线性插值初始化函数
def bilinear_kernel(in_channels, out_channels, kernel_size):
    factor = (kernel_size + 1) // 2
    if kernel_size % 2 == 1:
        center = factor - 1
    else:
        center = factor - 0.5
    og = np.ogrid[:kernel_size, :kernel_size]
    filt = (1 - abs(og[0] - center) / factor) * \
           (1 - abs(og[1] - center) / factor)
    weight = np.zeros((in_channels, out_channels, kernel_size, kernel_size),
                      dtype='float32')
    weight[range(in_channels), range(out_channels), :, :] = filt
    return nd.array(weight)

#读取图像和标签图列表,简单划分训练集和验证集(此处使用前50张作验证集,可自行修改k折测试)
def read_br_images()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用MXNet完成一个基于FCN的盲道实时语义分割 的相关文章

随机推荐

  • SCI期刊画图常用颜色归纳总结

    我导师曾审稿300 他经常教导我们 论文中图片的质量是非常重要的 我审稿时主要看稿件的图表 PS 当然他说实验方法和结果很很很重要 还有其他的就不讨论了 因为本篇文章主要讲关于论文画图的事 我通常用PS画学术图 当然其他软件都可以 比如我师
  • 打印A4纸图片需要多少像素和分辨率?

    我们如果要设计杂志用的图片 A4大小的需要多少像素大小和分辨率呢 一般来说 给铜版纸使用的300dpi就够用了 太小打印出来不一定清晰 太大的话耗费内存和CPU处理起来十分慢 所以300dpi是一个很好的分界线 A4物理大小是21厘米 29
  • 【视频解读】动手学深度学习V2_02深度学习介绍

    1 AI地图 人工智能的地图 x轴是不同模式 由符号学到概率模型 到机器学习 Y轴是我想做的东西 最底下的是感知 我得了解这是什么东西 然后做推理 形成自己的知识 最后做规划 最底层的就是感知 就是我能够看到这个物体 比如这个屏幕等 做推理
  • 创建索引分区

    Oracle学习四 创建 索引分区 作者 mckobe23 http mckobe23 itpub net 发表于 2007 03 13 18 30 分类 Oracle 出处 http mckobe23 itpub net post 291
  • vue 中导出的方法,导出xls/zip/mp4等

    在我的项目中会用到导出功能 导出xls zip mp4文件的需求 所以直接整合一下导出功能的方法 首先引入方法 import downloadXls downloadZip from utils download 然后再运用 我这个地方是需
  • python 编码

    1 ASCII Unicode和UTF 8 计算机只能处理数字 如果要处理文本 就必须把文字转换为数字 因为计算机是美国人发明的 因此最早只有127个字母被编码到计算机里 包含大小写英文字母 数字和一些符号 这个编码表被称为ASCII编码
  • python连续小波分析CWT

    目录 0 引言 1 实例 1 1 结果图 1 2 代码 1 3 结果分析 2 cwt 使用介绍 3 参考链接 转自 python连续小波分析 0 引言 我们学过内积 内积的物理含义 两个图形的相似性 若两个图形完全正交 则内积为0 若两个图
  • gradle快速入门

    1 Gradle 入门 1 1 Gradle 简介 Gradle 是一款Google 推出的基于JVM 通用灵活的项目构建工具 支持Maven JCenter 多种第三方仓库 支持传递性依赖管理 废弃了繁杂的xml 文件 转而使用简洁的 支
  • 链路追踪Sleuth入门

    前言 在一个大型的分布式项目中存在各种各样的模块调用 每个模块负责不同的功能 组合成系统 在这种架构下的系统 一次请求往往会调用到许许多多的微服务 这样的跨度对于维护也是存在一定的问题 1 如何快速发现问题 2 如何判断故障影响范围 3 如
  • 前端面试考点---浏览器进程线程篇

    概念解析 进程 操作系统分配调度资源的最小单位 每个软件程序至少一个进程 线程 程序执行的最小单元 多进程 一个操作系统同时运行多个应用程序 一个浏览器同时打开多个tab页面 多线程 浏览器内核多线程协作完成渲染工作 浏览器进程划分 浏览器
  • Nginx nginx.conf配置文件详解

    目录 1 配置文件划分 第一部分 全局块 第二部分 events块 第三部分 http 2 详细配置 events use epoll http 负载方式 server 额外扩展配置 额外注意 1 配置文件划分 worker process
  • ros 样例代码和教程

    中国大学MOOC 机器人操作系统入门 课程代码示例 代码 https github com DroidAITech ROS Academy for Beginners 书 https legacy gitbook com book sych
  • 毕业设计别再做 XX 管理系统了!!!

    前几天写了一篇文章 你的毕业设计是 XX 管理系统吗 阅读量挺高的 很多读者还以为是推荐几个亮眼的 GitHub 项目 发现并不是 今天推荐几个项目 毕业设计可借鉴下面这几个 GitHub 项目 我不是简单的推荐项目 还会给出一些思路 基于
  • Qt 判断集合中的元素是否全部相同

    1 简述 判断元素是否相同 遍历跟第一个比就行 有不同直接返回 情况是有一个设备组 里边包含若干设备 设备全开 组开关显示开 设备全关 组开关显示关 设备状态不一致 禁用组开关 逻辑 判断组内状态是否相同 if 相同 取第一个设备状态即可
  • C语言 ANSI C 库常用处理字符串的函数

    1 char strcpy char restrict s1 const char restrict s2 该函数把s2指向的字符串 包括空字符 拷贝至s1指向的位置 返回值是s1 2 char strncpy char restrict
  • lua 之 math

    参考 Imathlib c Math Library Tutorial 常用接口 abs 返回指定值的绝对值 print math abs 10 10 print math abs 5 5 print math abs 1 02 1 02
  • 题目:L2-035 完全二叉树的层序遍历

    题目 题目详情 L2 035 完全二叉树的层序遍历 25 分 pintia cn 大意 一个二叉树 如果每一个层的结点数都达到最大值 则这个二叉树就是完美二叉树 对于深度为 D 的 有 N 个结点的二叉树 若其结点对应于相同深度完美二叉树的
  • 基于STM32F103的智能门锁系统

    基于STM32F103的智能门锁系统 直接说明实现了什么效果 1 指纹解锁 基于AS608 2 RFID解锁 基于RC522 3 密码解锁 基于LCD电容屏触摸控制 4 蓝牙解锁 基于HC 06 5 后台服务器管理开锁信息 基于ESP826
  • Docker 初学者指南——如何创建您的第一个 Docker 应用程序

    您是开发人员 想从 Docker 入手 这篇文章是为你而写的 在简要介绍什么是 Docker 以及为什么要使用它之后 您将能够使用 Docker 创建您的第一个应用程序 什么是Docker Docker是 Docker Inc 开发的一款免
  • 使用MXNet完成一个基于FCN的盲道实时语义分割

    使用MXNet完成一个基于FCN的盲道识别语义分割 一点说明 基本原理 测试集效果 数据标注 训练 基本设置 读入数据 网络构建 开始训练 测试 一点说明 前段时间根据gluon的教程动手学深度学习和同学项目实地拍摄的盲道图片完成了一个基于