简介

SegNet是一个由剑桥大学团队开发的图像分割的开源项目,该项目可以对图像中的物体所在区域进行分割,例如车,马路,行人等,并且精确到像素级别。图像分割的实现由一个卷积神经网络构成,该网络主要有两部分组成:encoder与decoder。encoder是一个沿用VGG16的网络模型,主要对物体信息进行解析。decoder将解析后的信息对应成最终的图像形式,即每个像素都用对应其物体信息的颜色(或者是label)来表示。后面章节会对SegNet的模型进行详解。但是由于SegNet是一个主要由卷基层组成像素处理级的网络,对于像FPGA这类移动设备来说,计算量还是有些大。在选取处理速度和计算量的平衡当中,我们在选择使用另一个轻量级的SegNet实现,使用此实现加上我们的AI芯片DV700,可以在FPGA上运行。

网络模型概要SegNet 网络结构

如上图所示,SegNet是一个由encoder(左)和decoder(右)组成的对称网络。输入一张RGB图像后,网络根据图像中物体的语义信息,把图像中的物体进行分类(例如,“马路”,“汽车”, “楼房”等),最后生成一张分割图像。与SSD图像检测(详见SSD文章)生成的bounding box相比,图像分割可以对物体生成更加精准的二维区域信息,比如道路的free space和路标等信息,这些会给汽车自动驾驶提供极大帮助。

Encoder

虽然有着一个高大上的名字,但是encoder本身其实就是一连串的卷积网络。该网络主要由卷基层,池化层和BatchNormalization层组成。卷基层负责获取图像局域特征,池化层对图像进行下采样并且将尺度不变特征传送到下一层,而BN主要对训练图像的分布归一化,加速学习。

概括地说,encoder对图像的低级局域像素值进行归类与分析,从而获得高阶语义信息(“汽车”, “马路”,“行人”),Decoder收集这些语义信息,并将同一物体对应到相应的像素点上,每个物体都用不同的颜色表示。

Decoder

既然Encoder已经获取了所有的物体信息与大致的位置信息,那么下一步就需要将这些物体对应到具体的像素点上了。这一系列工作是由Decoder完成。Decoder对缩小后的特征图像进行上采样,然后对上采样后的图像进行卷积处理,目的是完善物体的几何形状,弥补Encoder当中池化层将物体缩小造成的细节损失。

换一个角度理解Encoder+Decoder

让我们换一个角度尝试理解这个过程。假设你有一本菜谱,这本菜谱有很多章节,每个章节都是文字描写如何烹饪不同的菜。现在我们讲所有文字输入到SegNet当中,注意此时SegNet接收到的只是文字信息,它并不知道这本菜谱的构成。Encoder所做的就是它能理解这本菜谱的结构,对其中的内容进行抽象,形成一些高阶的信息(比如描述做了什么菜),并将这些信息对应到一个简化的空间里。Decoder对这些简化的高阶信息进行理解与编译,并且对相同语义相近的文字进行分类并对应到具体的菜式上面(比如:凉菜,面食,鱼,肉等)。这样以来,仅从文字上,我们就可以大概知道这是描述哪个菜式了,可能是凉菜,也可能是面食。换句话说,你不仅能获得菜式信息,并且可以知道这些菜式对应的是哪一个章节,哪些字句,是不是很棒?

再回到图像的例子当中,Encoder对图像进行分析,弄清某一区域是什么物体,然后Decoder来寻找这个物体对应的是原图像当中的哪些像素点。这样,一个图像就被分割完成了!

Pooling, Upsampling & Pooling Indices

如下图所示,SegNet中的池化处理对应一个2x2非重叠Max Pooling,2x2区域中的最大值被保留并传递给下一层。2x2 Max Pooling

上采样,顾名思义就是池化的反向处理。但是在上采样当中存在着一个不确定性,即一个1x1的特征点经过上采样将会变成一个2x2特征区域,这个区域中的某个1x1区域将会被原来的1x1特征点取代,其他的三个区域为空。但是哪个1x1区域会被原特征点取代呢?一个做法就是随机将这个特征点分配到任意的一个位置,或者干脆给它分配到一个固定的位置。但是这样做无疑会引入一些误差,并且这些误差会传递给下一层。层数越深,误差影响的范围也就越大。所以把1x1特征点放到正确的位置至关重要。

那么在SegNet中这个处理是如何实现的呢?答案是通过一个叫Pooling Indices方式来保存池化点的来源信息。在Encoder的池化层处理中,会记录每一个池化后的1x1特征点来源于之前的2x2的哪个区域,在这个信息在论文中被称为Pooling Indices。Pooling Indices会在Decoder中使用。既然SegNet是一个对称网络,那么在Decoder中需要对特征图进行上采样的时候,我们就可以利用它对应的池化层的Pooling Indices来确定某个1x1特征点应该放到上采样后的2x2区域中的哪个位置。此过程的如下图所示。

Convolution Layer in Encoder and Decoder

我们可以看到在Encoder和Decoder中都存在卷积层。他们在算法上一模一样,但是在作用上有一点不同。Encoder阶段,卷基层的主要作用就是获取图像的局部信息,并传送给池化层,然后由2x2最大池化处理,把最大值特征再次传递到下一层。所以在这部分当中,Convolution+Pooling的主要作用从图像中获取信息。

与此相反,Decoder阶段的处理是将特征层进行上采样,然后交给卷基层进行处理。上采样后的2x2区域只有一个前一层传来的1x1特征点,其余区域都是空值,因此这些空值需要被填补成适当的特征值,来让这个区域变得完整并且平滑。这个工作就是由卷基层担任的。所以位于Decoder当中的卷积层的作用是对图像进行“填补”。

一句话总结,两个阶段的卷积层在计算上是完全一样的,但是表现出的结果是有差异的。有些人根据此差异,将Encoder阶段的卷积命名为“卷积”,Decoder阶段的卷积命名为“反卷积“(或”转置卷积“),但实际上进行的处理是一样的。下面是卷积与反卷积处理的动画过程。图片出自这里。卷积操作:蓝色是输入 青色是输出反卷积操作:蓝色是输入 青色是输出

Our Implementation Model

由于SegNet的计算量略大,在FPGA上达不到很好的性能,因此我们选择了另一个模型SegNet Basic,并且对通道数进行了削减来获得处理速度的提升。该网络模型如下图所示。

Demo GIF

处理结果如下图所示。可以看到,树木,楼房,车辆,行人均可以很好的分割。

作为比较,我们还放上了SSD检测的结果,此SSD检测是与SegNet同时在我们的AI芯片DV700上进行的,实验表明,我们的AI引擎可以同时处理多个网络,这在实际的自动驾驶处理中也是至关重要的,因为通常一个网络只能处理某一个具体的任务。(a) SegNet Basic output (b) Blended with input (c) Same input with SSD detection

Accuracy: 85% @original training dataset

Processing Time:

SegNet Basic: 250ms/frame

SSD: 50ms/frame

(本文中展示的SSD并非原作者训练的模型,而且我们使用交通道路dataset自己训练的模型。由于还在开发中,可能存在一些误检。)

参考文献

segnet和unet区别_SegNet图像分割网络直观详解相关推荐

  1. segnet和unet区别_图像分割:3D Unet网络性能一定优于2D Unet吗,如果优于,为什么优于?...

    上周在某大厂医疗AI组的一面刚被问到这个问题.我开门见山,先上结论:3D UNet不一定优于2D UNet.科学里面没有绝对的结论,但凡说A一定好于B,需要说明的是在什么样的情况下好于,也就是需要控制 ...

  2. 基于SegNet和UNet的遥感图像分割代码解读

    基于SegNet和UNet的遥感图像分割代码解读 目录 基于SegNet和UNet的遥感图像分割代码解读 前言 概述 代码框架 代码细节分析 划分数据集gen_dataset.py UNet模型训练u ...

  3. 图像分割UNet系列------UNet3+(UNet3plus)详解

    图像分割unet系列------UNet3+(UNet3plus)详解 1.UNet3+结构 2.UNet3+主要部分说明 3.总结     UNet3+发表于2020年的ICASSP,它是对UNet ...

  4. nbns协议_网络协议详解1 - NBNS

    NetBIOS 简介 NetBIOS,Network Basic Input/Output System的缩写,一般指用于局域网通信的一套API,相关RFC文档包括 RFC 1001, RFC 100 ...

  5. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  6. 趣谈网络协议-第二模块-底层网络知识详解:2最重要的传输层

    趣谈网络协议-第二模块-底层网络知识详解:2最重要的传输层 1:第10讲 | UDP协议:因性善而简单,难免碰到"城会玩" TCP 和 UDP 有哪些区别? UDP 包头是什么样的 ...

  7. 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

    网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...

  8. Docker(十四):Docker:网络模式详解

    Docker作为目前最火的轻量级容器技术,牛逼的功能,如Docker的镜像管理,不足的地方网络方面. Docker自身的4种网络工作方式,和一些自定义网络模式 安装Docker时,它会自动创建三个网络 ...

  9. 用netstat查看网络状态详解

    --用netstat查看网络状态详解 -----------------------------2014/06/11 一.Linux服务器上11种网络连接状态:                     ...

  10. ARP命令详解--网络命令详解二

    显示和修改"地址解析协议 (ARP)"缓存中的项目.ARP 缓存中包含一个或多个表,它们用于存储 IP 地址及其经过解析的以太网或令牌环物理地址.计算机上安装的每一个以太网或令牌环 ...

最新文章

  1. linux 判断网线是否插入
  2. Python删除list里面的重复元素的俩种方法
  3. Explore Optimization
  4. asp.net 调用苹果摄像头扫描条码_苹果刚刚发布了近两年最值得买的 iPhone
  5. 最新综述:对话式检索数据集汇总
  6. Elasticsearch新增一个字段并赋值
  7. Docker容器环境下ASP.NET Core Web API应用程序的调试
  8. 怎么不保存退出、保存退出vim、vi编辑
  9. springboot启动报错Exception in thread “main“ java.lang.NoClassDefFoundError: io/netty/util/Timer
  10. Security+ 学习笔记1 恶意软件
  11. 高数上册下册答案详解第七版高数同济7版上册下册答案高等数学答案吧
  12. ppt导出pdf后非矢量图图片失真的解决办法
  13. Go语言学习查缺补漏ing Day1
  14. 文学档次,也可以是背出来的【148…
  15. 水表计量单位_关于民用水表,你知道多少?
  16. 迈出数据安全建设的第一步|公安数据分类分级建设案例实践
  17. Php一键转存微信文章,python如何导出微信公众号文章
  18. 【快速上手教程1】开源编队无人机-开机测试
  19. 分享2022武体考研一战上岸学习心得
  20. 孤独是上天的礼物 | 真北读书

热门文章

  1. JS 获得FileUpload1 的完整路径
  2. php解析krc文件,将酷狗krc歌词解析并转换为lrc歌词php源码_PHP
  3. xcode 5中调试技巧
  4. foxmail删除服务器文件,无法真正删除?Foxmail文件中转站BUG
  5. 图像拼接算法的基本原理
  6. 对于高等代数一下比较基础的概念的认识
  7. 查看Android应用签名信息
  8. FLASH中打开网页链接,本地打不开的问题。
  9. 计算机主板提示ahci,映泰主板设置硬盘模式AHCI或IDE的教程
  10. 《自己动手写爬虫网络》笔记1