图像语义分割算法(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)。这样一来,类别越少的,权重越大,避免长尾类别对训练的贡献被高频类别压制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ERPNext SQL 注入漏洞复现

0x01 产品简介 ERPNext 是一套开源的企业资源计划系统。 0x02 漏洞概述 ERPNext 系统frappe.model.db_query.get_list 文件 filters 参数存在 SQL 注入漏洞,攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权…

同旺科技 USB TO SPI / I2C --- 调试W5500_TCP Client测试

所需设备: 内附链接 1、USB转SPI_I2C适配器(专业版); 首先,连接W5500模块与同旺科技USB TO SPI / I2C适配器,如下图: 网关IP地址寄存器(192.168.1.1)子网掩码寄存器(255.255.255.0)源MAC地址寄存器源IP地址寄存器(192.168.1.8)…

idea__SpringBoot微服务01——了解Springboot

了解Springboot 一、回顾学习与现在三、回顾什么是Spring三、Spring是如何简化Java开发的四、什么是SpringBoot五、看图————————创作不易,如觉不错,随手点赞,关注,收藏(* ̄︶ ̄),谢谢~~ 一…

互联网Java工程师面试题·Spring Boot篇·第一弹

目录 1、什么是 Spring Boot? 2、Spring Boot 有哪些优点? 3、什么是 JavaConfig? 4、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? 5、Spring Boot 中的监视器是什么? 6、如何在 Sprin…

Mysql集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上

1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上,提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…

微服务--一篇入门kubernets

Kubernetes 1. Kubernetes介绍1.1 应用部署方式演变1.2 kubernetes简介1.3 kubernetes组件1.4 kubernetes概念 2. kubernetes集群环境搭建2.1 前置知识点2.2 kubeadm 部署方式介绍2.3 安装要求2.4 最终目标2.5 准备环境2.6 系统初始化2.6.1 设置系统主机名以及 Host 文件的相互…

两种内网穿透的实现方法

目录 前言: 一、IP和端口的作用 二、公网IP不够用 三、内网穿透实现方法 方法一:设置路由器 方法二:使用某些APP,例如花生壳 前言: 本文会介绍为什么需要使用内网穿透以及实现内网穿透的两种方法 一、IP和端口…

sqlmap400报错问题解决

python sqlmap.py -r sql.txt --batch --techniqueB --tamperspace2comment --risk 3 --force-ssl–batch 选项全部默认 不用再手动输入 –techniqueB 使用布尔盲注,该参数是指出要求使用的注入方式 –tamperspace2comment使用特殊脚本,space2comment是把…

LeedCode刷题---双指针问题

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 双指针简介 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。 对撞指针:一般用于顺序结构中&…

Powercli常用命令

背景 vcenter web界面不如命令行快,且不能批量操作。 根据实际需求逐步补充使用到的powercli 命令。 00 通过bat脚本配置terminal标签页 在WindowsTerminal上配置新的标签页,实现打开标签页即默认连接vcenter。 脚本内容如下: echo off p…

Linux进程通信——内存映射mmap

Linux进程通信——内存映射mmap 1、创建内存映射区2、进程间通信2.1 有血缘关系2.2 没有血缘关系 3、拷贝文件 原文链接 1、创建内存映射区 如果想要实现进程间通信,可以通过函数创建一块内存映射区,和管道不同的是管道对应的内存空间在内核中&#xf…

Nat easy IP ACL

0表示匹配,1表示任意(主机位0.0.0.255(255主机位)) rule deny source 192.168.2.1 0 设置拒绝192.168.2.1的主机通过 记住将其应用到接口上 [AR2]acl 2000 //创建基本ACL [AR2-acl-basic-2000]rule deny source 192…

网络安全(二)-- Linux 基本安全防护技术

4.1. 概述 安全防护基础主要是会用Linux系统, 熟悉Linux基本操作命令。 在这个章节中,我们主要探讨自主访问控制(许可位、ACL)、文件属性、 PAM技术、能力机制等。 4.1.1. 补充命令 本章节中,涉及一些新的命令&#…

NPS内网穿透教程

1.简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网ht…

python socket编程6 - 使用PyQt6 开发UI界面实现TCP server和TCP client单机通讯的例子

使用PyQt6 开发UI界面实现TCP server和TCP client单机通讯的示例。 一、PyQt6 实现的界面 二、TCP server代码的修改示意 界面提供网络参数的配置,以及提供人机交互过程中的数据获取和显示。 1、把上面的server代码封装成两个部分 A、class Server 负责接受UI界面…

JS浮点数精度问题及解决方案

前端面试大全JS浮点数精度问题及解决方案 🌟经典真题 🌟浮点数精度常见问题 🌟为什么会有这样的问题 🌟真题解答 🌟总结 🌟经典真题 为什么 console.log(0.20.10.3) 得到的值为 false 🌟…

Spring Security 6.x 系列(9)—— 基于过滤器链的源码分析(二)

一、前言 在本系列文章: Spring Security 6.x 系列(4)—— 基于过滤器链的源码分析(一)中着重分析了Spring Security在Spring Boot 的自动配置、 DefaultSecurityFilterChain 的构造流程、FilterChainProxy 的构造流…

12.4 C++ 作业

完成沙发床的多继承 #include <iostream>using namespace std;//封装 沙发 类 class Sofa { private:string *sitting; public://无参构造函数Sofa(){cout << "Sofa::无参构造函数" << endl;}//有参构造函数Sofa(string s):sitting(new string(s)…

手机升级到iOS15.8后无法在xcode(14.2)上真机调试

之前手机是iOS14.2的系统,在xcode上进行真机测试运行良好&#xff0c;因为想要使用Xcode的Instruments功能&#xff0c;今天将系统更新到了iOS15.8 &#xff0c;结果崩了 说是Xcode和手机系统不兼容不能进行真机测试。在网上查不好些方法&#xff0c;靠谱的就是下载相关版本的…

C语言小游戏:三子棋

目录 &#x1f30d;前言 &#x1f685;目录设计 &#x1f48e;游戏逻辑设置 ⚔三子棋棋盘设计 ⚔三子棋运行逻辑 &#x1f440;怎么设置人下棋 &#x1f440;怎么设置电脑下棋 ✈如何判断输赢 ✍结语 &#x1f30d;前言 Hello,csdn的各位小伙伴你们好啊!这次小赵给大…