图像语义分割算法(FCN/U-net)

Some definitions

 与目标检测不同,语义分割任务不但要对图片中的物体的位置和类别进行预测,还要精确地描绘出不同类物体之间的边界(注意是不同类物体,而不是不同物体。若对同一类的不同物体也进行区分,则为实例分割(instance segmentation)。语义分割只考虑类别。)。因此,对图像的语义分割可以看成是对图像中的每个像素点的逐点分类。

图像语义分割相对于整图分类或者目标检测的一个重要的困难点在于:该任务一方面要求高层语义特征(正确分类),又要求轮廓尽可能贴合真实的边界(像素级别要对齐)。这两个要求实际上是相反的,语义层级高意味着整体、coarse,也就是不关注具体的像素细节,而关注整体的形态。而像素级别的轮廓则要求特征尽可能的fine-grained,即少关注高层语义,多关注边缘、细节这类low-level的特征。语义分割的优化,基本就是以解决此问题为最终目标,对模型进行改进。

Evaluations of semantic segmentation task

  • pixel accuracy: 分类正确的像素点占总体的比例。相当于普通样本分类问题中的acc。
  • mean accuracy: 每个类别的分类的acc的平均值。类似目标检测中的mAP。
  • mean IU: 平均IoU,即每个类别的IoU的平均值。
  • frequency weighted IU: 对mean IU进行加权,权重为该类别的比例。
  • BF(Boundary F1-score): 对所有的ground-truth和prediction的轮廓(contour)点进行比较,计算准确率和召回率,得到F1-score。注意,由于轮廓不会完全精准,因此这里的准确指的是在一定容忍范围内的相等(distance error tolerance),即prediction的轮廓上点与gt上点的距离小于某个阈值。(Reference : [1] Csurka, G., D. Larlus, and F. Perronnin. "What is a good evaluation measure for semantic segmentation?" Proceedings of the British Machine Vision Conference, 2013, pp. 32.1-32.11.)

FCN

reference: Fully Convolutional Networks for Semantic Segmentation

Jonathan Long_ Evan Shelhamer_ Trevor Darrell

UC Berkeley

FCN是第一个用分类CNN处理图像语义分割的模型。实际上,如果不考虑分类CNN的全连接层, 仅考虑conv和pool的话,最终生成的二维图形其实就是对应的每个位置(区域)的类别的heatmap,只不过在整图分类的任务中,这个heatmap中的信息被整合在一起了。关于CNN全连接层之前的feature map可以表示对应区域的预测结果这一结论,早在整图分类的某经典模型中就已经提出了,FCN处理语义分割就是沿用了这一思路。

FCN的基本网络结构如下:

可以看出,FCN首先按照整图分类的方式,对原始图像进行卷积+下采样,直到某个较高的层次(小尺寸feature map),此时网络已经提取了各个位置的高层语义信息。然后,将最后这个含有语义信息的feature map上采样到原图的大小,然后加上一个1x1的conv层,conv层共有21个filter(即输出的channel数目为21),分别预测该像素属于21个类别的概率(20个object类别+1个背景)。并与原图的GT 分割轮廓标签对齐,进行训练优化。

对于FCN来说,由于多次池化后,feature map的尺寸非常小,虽然包含了较多的语义信息,但是并不精确,无法做到像素级别的要求,因此,考虑将前面的语义较低但是细节较丰富的feature map与最后一层进行结合,并基于此结果进行升采样和预测。如图所示:

根据包含的最细(fine-grained)grid的feature map的下采样/池化倍数(可以理解为conv的stride的大小),获得的三种不同模型分别称为FCN-32s、FCN-16s和FCN-8s。其中s前面的数表示和原图相比分辨率降了几倍。可以看出,8s的相对细节更多,实验结果也证实了这一结论。

不同分辨率的feature map的合并方式如下:以FCN-8s为例,首先对conv7的结果进行4x上采样,然后对pool4结果进行2x上采样,此时这三个(包括pool3的结果)feature map已经大小相同了。然后将三者进行求和。

除了与前面的feature map合并以外,作者还提到有另一种可以获得finer detailed prediction的方法,即shift-and-stitch。

U-net

reference: U-Net: Convolutional Networks for Biomedical Image Segmentation
Olaf Ronneberger, Philipp Fischer, and Thomas Brox
Computer Science Department and BIOSS Centre for Biological Signalling Studies,
University of Freiburg, Germany

U-Net最初是用于医学图像分割的,现在仍然再医学影像处理中有应用。其网络的基本结构如下:

Ciresan et al.先前的工作利用一个滑动窗对每个像素进行预测,输入是一个局部的区域(patch),然后通过CNN预测出中心点所属的类别(该类型方法再高光谱分类任务中也有应用)。这样做可以预测位置的类别,但是滑动窗切出来的patch数量要远远超过图像本身的数量,而且,由于patch有很多重叠部分,重复计算较多,效率比较低。另外,还有一个问题在于,patch的大小(对context的使用)和定位的准确性这两者之间具有一个trade-off的过程,patch越大,能利用的信息就越多,但是max pooling也更多,导致分类的结果不一定就是中心点的类别,有可能会受到其它点的影响,因此定位会不准确。而如果要得到一个准确的定位,那么势必要减少外围的干扰,即减小patch的尺寸,但这样又会导致语义信息不全面。

因此,U-net复用了FCN的基本思路,但是再后面的上采样阶段上做了改进。首先,增加了上采样阶段(网络后半段)的feature map数量,并且通过跳线将原始的像素级的底层特征合并到后面的预测阶段,从而增加定位的准确性。整个网络为U型,前后基本对称。相同层级的下采样和上采样上的feature map都通过跳线进行合并。

除此以外,由于U-net处理的是尺寸较大的医学图像,因此也需要切分成小一些的区域分别进行训练,为了处理边界问题,对于大图内部的小区域,可以切的大一些,然后输出只保留内部的部分(相当于用周围真实的图像内容进行镶边);对边界的区域,镜像外推插值(extrapolation),从而使得最终的输出在valid卷积的情况下,输出刚好等于设定的大小。

U-net的loss函数就是类别的交叉熵:

但是对于细胞分割,不同的instance之间的交界问题比较明显,因此,还加入了一个权重变量:

其中,wc是用来平衡不同类别的权重map,w0是预设的参数,d1和d2分别表示到距离最近和第二近的细胞边界的距离。也就是说,对于距离边界越近的pixel惩罚越大,反之,越远的惩罚越小,以此在训练中关注border pixels。

另外,考虑到样本量小的情况,U-net的作者对已有的图像进行了大量的数据增广,比如:旋转、平移,模拟人体组织中的形变。增加数据量,并且让网络学习到这些形变下的不变性。最终,U-net在很小的标注样本集上(30张图像,512*512)进行训练,花了10个GPU hour(Titan 6GB),比较高效地获得了很好的效果。

SegNet

reference: SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
Vijay Badrinarayanan, Alex Kendall, Roberto Cipolla, Senior Member, IEEE,

SegNet设计的初衷是为了处理街景理解任务(road scene understanding),它的最主要的特点在于它的非线性上采样(non-linear upsampling)。SegNet的encoder部分采用了VGG16的结构,然后将全连接去除,加上上采样的decoder网络,实现端到端的训练。SegNet文章对它的decoder与FCN的decoder进行的分析。

SegNet的基本结构如下所示:

首先,SegNet也是一个encoder-decoder架构,encoder阶段就是常规的conv+BN+ReLU,然后接上max pooling进行下采样。但是在SegNet中,max pooling阶段取出每个max的所在的位置index,然后将其储存起来,并传到decoder中对应的上采样步骤,然后,在通过多次conv+BN+ReLU,对上采样的结果进行处理,并输出给下一层。这种架构的思路来源于无监督的图像分类pretrain模型,以及神经网络可视化也用到了类似的模型。与pretrain模型最终只保留encoder有所不同,SegNet是端到端的网络,encoder和decoder都用来训练和预测。

上图表示的即SegNet的max pooling indeces的上采样方法。不同于直接进行插值或者deconv得到更大尺寸的feature map,SegNet存储的是每一级max pooling时那些被转移到下一级的最大值的坐标点的位置index。因此,通过这种方式上采样后的直接输出是一个稀疏矩阵,只在那些产生局部max的点处有值。然后,将这个稀疏矩阵用具有可学习的参数的decoder filters进行卷积滤波,得到输出结果。

实际上,为了保持高分辨率的细节,最好的方法自然是将所有的encoder的feature map都存起来(右图的FCN即如此,先将encoder的feature map进行通道压缩,得到和deconv后的feature map同样大小的tensor,然后直接逐点相加)。但是这只是在预测时间以及存储空间无限制的情况下的方案。SegNet仅仅保存max pooling的indices,那么,以2x2的pooling为例,每个2x2中的位置只需要2个bit就能存储。大大减小了资源消耗。

在SegNet的文章中,作者发现各种分割网络的encoder都区别不大,主要的差异在decoder部分,因此,文章对比了多种decoder的方法,结果如下:

通过上述比较可以得出一些结论:首先,双线性插值效果最差,说明需要学习decoder中的deconv卷积。另外,在同等效果的情况下,SegNet相比于FCN具有效率上的优势,即存储空间小。SegNet的参数量和直接bilinear插值的参数量是基本一样的,因为2bit的位置记录所占的空间相对可以忽略不计。另外,通过BF metric的结果可以看出,加入encoder的feature map有助于对边界的刻画。总的来说,效果最好的方法就是讲整个encoder feature map直接用上,但是这也是效率上最差的解决方案。

SegNet的训练阶段细节如下:损失函数是交叉熵,下降方式为带有动量的SGD,参数初始化用的是He方法,每个epoch对所有样本进行shuffle,然后取mini-batch逐批次训练。除此之外,考虑到不同类别的频率不同,对样本进行了平衡,用的方法为 median frequency balancing(中位数频率平衡),基本思路是对不同类别施加不同的权重,权重为 频率中位数/该类别频率 (median of class frequency / class frequency)。这样一来,类别越少的,权重越大,避免长尾类别对训练的贡献被高频类别压制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iptables防火墙之SNAT与DNET

NAT 1.SNAT:让内网可以访问外网 2.DNAT:让外网可以访问到内网的机器 网关服务器,要开启路由功能 内核功能: sysctl -a 列出所有参数 内核参数,然后grep可以查看到默认的内核参数 内核参数配置文件 /etc/sysctl.…

【ArcGIS Pro微课1000例】0046:深度学习--汽车检测

本实验讲述ArcGIS Pro中人工智能深度学习应用之–汽车检测。 文章目录 一、学习效果二、工具介绍三、案例实现四、注意事项一、学习效果 采用深度学习工具,可以很快速精准的识别汽车。 案例一: 案例二: 下面讲解GIS软件实现流程。 二、工具介绍 该案例演示的是ArcGIS Pro中…

L1-018:大笨钟

题目描述 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数…

Java笔记

md5加密 spring框架我我们提供了一个工具类DigestUtils 调用类中的md5digestAsHes对密码进行加密 但是要将密码转成bytes数组 password DigestUtils.md5DigestAsHex(password.getBytes()); 对象的属性拷贝 BeanUtils.copyProperties(有数据的对象,空对象)&#…

python毕业设计论文选题管理系统b615y

毕业论文管理方式效率低下,为了提高效率,特开发了本毕业论文管理系统。本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分,具体功能分析如下: (1)导师功能模块:…

微信小程序自定义数据实现级联省市区组件

前言 在微信小程序中,官方文档提供的省市区组件,可以让用户更加方便快捷地选择省市区,但是官方提供的组件有一个缺点,无法自定义数据,但如果项目中需要使用自己的数据,显然就得寻找其它的组件实现。 官方组…

使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问,实现随时随地在任意设备上传或者…

《视觉SLAM十四讲 从理论到实践(第2版)》

书中代码:GitHub - gaoxiang12/slambook2: edition 2 of the slambook 书籍PDF:关注【Learn from Zero】回复【SLAM142】即可领取

如何去掉Win10电脑右下角弹出来的广告?

如何去掉Win10电脑右下角弹出来的广告?在Win10电脑中,用户看到桌面右下角老是弹出来广告,特别影响用户自己的操作体验感。接下来小编给大家分享不同的关闭方法,操作后大家可以看到Win10电脑右下角不再出现广告。 具体去掉方法如下…

【蓝桥杯】二分查找

二分查找 题目描述 输入 n n n 个不超过 1 0 9 10^9 109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_{n} a1​,a2​,…,an​,然后进行 m m m 次询问。对于每次询问,给出一…

ClassNotFoundException: org.apache.hive.spark.client.Job

hive使用的是3.13版本,spark是3.3.3支持hadoop3.x hive将engine从mr改成spark,通过beeline执行insert、delete时一直报错,sparkTask rpc关闭, 查看yarn是出现ClassNotFoundException: org.apache.hive.spark.client.Job。 开始…

iOS17苹果备忘录怎么设置提醒?

在我们快节奏的生活中,苹果备忘录成了记录灵感、任务和重要事项的得力助手,面对着一个让人头疼的问题——备忘录竟然不能设置提醒!突然感觉我的备忘录只是个寂寞的清单,没有提醒的陪伴。 于是,我着手寻找解决之道&…

数组逆序重放

数组逆序重放的意思是将数组的元素逆序排列,然后重新放回原数组中。这个操作可以在很多编程语言中实现,例如Python、Java等。 下面是一个Python的示例代码,可以实现这个操作: def reverse_and_rearrange(arr): # 反转数组 …

二维码智慧门牌管理系统升级解决方案:重新制牌审核快速审批

文章目录 前言一、快速审批与重新安装一、其他系统优势 前言 随着城市化进程的加速,门牌号码的管理变得日益重要。然而,传统的门牌管理方式已经无法满足现代社会的需求。在这样的背景下,二维码智慧门牌管理系统应运而生。但随着系统使用&…

LLM之RAG实战(一):使用Mistral-7b, LangChain, ChromaDB搭建自己的WEB聊天界面

一、RAG介绍 如何使用没有被LLM训练过的数据来提高LLM性能?检索增强生成(RAG)是未来的发展方向,下面将解释一下它的含义和实际工作原理。 ​ 假设您有自己的数据集,例如来自公司的文本文档。如何让ChatGPT和其他…

Golang使用Swagger文档教程

Golang开发效率是杠杠滴,简单几行代码就可完成一个可用的服务,如下代码: 采用Gin作为web framework采用Gorm作为持久化ORM采用Swagger作为OpenAPI文档管理工具 package mainimport ("encoding/csv""fmt""os"…

【Linux | 编程实践】防火墙 (网络无法访问)解决方案 Vim常用快捷键命令

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

LeetCode | 226. 翻转二叉树

LeetCode | 226. 翻转二叉树 OJ链接 不为空就翻转,空空就停止翻转左子树的节点给了右子树右子树的节点给了左就完成了翻转 struct TreeNode* invertTree(struct TreeNode* root) {//不为空就进行翻转if(root){//翻转struct TreeNode* tmp root->left;root->…

计算机网络安全问题分析与防护措施研究

计算机网络安全问题分析与防护措施研究 【摘要】在信息技术快速发展的今天,网络对于人类的生活方式影响显著增强,网络技术快速地在社会各个领域普及,使得计算机网络的安全成为一个亟待解决的问题。如何能够保证网络的快速健康发展己成为研究…

数据库之 redis

前言: 就学习爬虫而言,对于三种常见的数据库做个基本了解足以,所以笔记都是浅尝辄止,不会涉及太深入的东西。 redis简介 Redis(Remote Dictionary Server ,远程字典服务) 是一个使用ANSI C编写…