| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【语义分割】语义分割综述 -> 正文阅读 |
|
[人工智能]【语义分割】语义分割综述 |
文章目录
一、分割方法介绍
图像分割是机器视觉任务的一个重要基础任务,在图像分析、自动驾驶、视频监控等方面都有很重要的作用。图像分割可以被看出一个分类任务,需要给每个像素进行分类,所以就比图像分类任务更加复杂。此处主要介绍 DL-based 方法。 mmsegmentation 分割网络结构通用模式:
分割主要面临的问题及对应的已有解决方案:
参考文献: [1] Image Segmentation Using Deep Learning: A Survey 1.1 Fully Convolutional Networks [2015]1.1.1 FCN论文:Fully convolutional networks for semantic segmentation 语义分割可以看做一个分类模型,唯一复杂的地方在于需要给图像中的每个像素进行分类。 分类模型一般都是接受相同大小的输入图像,摒弃空间坐标。其使用的全连接层可以被看成一个核能够覆盖全部元素的卷积层。 所以,是否能使用全卷积网络来替代全连接网络呢? 答案是可以的,使用全卷积网络还避免了必须使用“相同大小的输入”的需求,两个网络的转换如图 2 所示。 FCN 方法是第一个基于深度学习的分割方法,只包含卷积层,可以输入任意大小的图然后生成其分割结果图。 如何从分类任务到 dense FCN: backbone:VGG-16(和 VGG-19 的效果类似)或 GoogLeNet(使用最后的 loss 层) 使用 backbone 的方式:去掉最后一层分类层,使用 1x1 卷积将通道数变成分割的类别数(PASCAL 中使用 21,其中一类为背景),然后使用 deconvolution 层上采样。 将类别和位置进行结合: 如图 3 所示,作者采用将层级特征进行结合的方式来精细化分割任务在空间上的类别预测。 详解:
贡献:该方法是图像分割的一个重要的转折点,证明了深度学习网络可以端到端的实现对不同大小图像的语义分割。 缺点:FCN 模型速度较慢,无法支持实时的语义分割;没有考虑全局上下文信息;无法方便的扩展到 3D 图像。 1.1.2 ParseNet论文:Parsenet: Looking wider to see better FCN 为使用卷积网络来实现端到端的语义分割提供了很好的思考方式,但却忽略了很重要的全局上下文信息,但在 FCN 中添加全局上下文信息也很容易,所以 ParseNet 使用平均特征来加强特征,并且这种特征为语义分割带来了很好的提升。 ParseNet 贡献点: 使用全局上下文信息来来解决局部误识别问题,且引入的计算量非常小,和标准 FCN 基本一致。 ① 添加全局特征的方式:parsenet 使用早融合的方式
如图 1e 所示,unpool(也就是重复的扩大)全局特征到和原特征相同大小,然后 concat 起来,一起去学习分类结果。
全局特征和原特征都分别学习分类,然后将两个预测的分类结果结合起来,作为最终的分类结果。 如果忽略结合特征后的训练过程,则两种融合方式的结果差不多,但是在某种特征辅助下的局部特征才能判断出正确的分类结果,所以,如果先训练再整合则造成的损失是不可逆的。 ② 为什么要归一化 如图 3 所示,当要结合两组特征时,如果两者的 scale 和 norm 相差很大的话,则大的一方容易吞掉小的一方,如果使用归一化,则能较好的避免该问题,且训练更稳定。
1.2 Encoder-Decoder Based Models还有很多图像分割是基于卷积 encoder-decoder 结构的,可以分为两个大类:通用分割、医学图像分割 1.2.1 通用分割1.2.1.1 Deconvolutional semantic segmentation论文:Deconvolutional semantic segmentation FCN 有两点不足的地方:
Deconvolutional semantic segmentation 的框架结构:
① Deconvolution Network for Segmentation
② Deconvolution 网络分析: 下图 4 可视化了网络的输出,可以看出,deconvolution 能够从粗到细提取目标的特征,unpooling 层通过追踪最强响应的位置来捕捉 example-specific 结构,能够高效的重建目标的细节信息。deconvolution 层能够捕捉 class-specific 形状,经过 deconvolution 后,与目标密切相关的激活特征被放大,而其他区域的噪声被抑制。这两者的结合能更有利于准确的 maps 的生成。 图 5 也展示了不同网络的输出效果,和 FCN-8s 相比,本文的网络结构预测更为精准 1.2.1.2 SegNet论文:SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 语义分割是像素级的分类任务,也出现了很多方法能够实现端到端的预测,直接得到每个像素的预测类别,但其结果大都比较粗糙。其问题主要是由 max-pooling 和 下采样导致丢失了一些信息。 作者为了将具有全局信息的低分辨率特征图更好的映射到输入大小的分辨率,这种映射需要很好的保留边界的位置信息。 所以本文构建了 SegNet,来实现高效且精细的语义分割。 关键点:
结构:
1.2.1.3 HRNetOriginal HRNet 论文:Deep High-Resolution Representation Learning for Human Pose Estimation HRNet 通过将由高到低的分辨率特征结合起来的方式,实现对高分辨率特征的保留,并且不同分辨率的特征也进行了信息交换。所以有很多分割的方式使用 HRNet 作为 backbone,来为模型中引入上下文信息的开拓能力。 深度学习中有高层特征也有低层特征,有很多研究都证明了,低分辨率的高级特征适合于分类任务,高分辨率的低级特征对密集预测有重要意义,如姿态估计、目标检测、语义分割等。 最开始提出的 Original HRNet 仅仅使用了 high-resolution 的特征表达,如图所示,本文对 Original HRNet 做了一些修改,并行使用了 high-to-low resolution 的特征表达,也叫 HRNetV2。 Original HRNet: 这里展示一组 HRNetV2 输出的分辨率:
分割如何使用这组多分辨率特征:上采样到相同大小,也就是最大的特征图大小,然后 concat,最后得到如下大小,再送入 decode_head 来使用:
HRNetV2 结构: 如上图 1 所示,总共有 4 stages,每个stage结构类似,都是 multi-resolution block,都是高分辨率特征和低分辨率特征的结合。 第一个 stage 的输入:原图经过两层 3x3 的卷积进行特征提取后的图(1/4原图大小) multi-resolution block 主要包括两个模块:
HRNet 的对比:
下图也通过定量分析,验证了 HRNetV2 和 HRNetv2p 确实优于 HRNetV1。 1.2.2 医学图像分割1.2.2.1 U-Net [2015]论文:U-net: Convolutional vnetworks for biomedical image segmentation 训练深度学习网络需要大量的数据,语义分割的难点在于:高分辨率特征和低分辨率特征的结合,也可以看做是低层位置信息和高层语义信息的结合,缺一不可,所以两者如何联合使用是一个很值得研究的问题
本文在 FCN 的基础上,进行了一些修改和优化,能够保证在使用少量数据的基础上产生更准确的分割结果。 FCN 的主要核心:
U-Net 的主要改进在于:
U-Net 框架结构: 如图 1 所示,U-Net 和 FCN 结构类似,也分为 encoder 和 decoder 模块,网络结构中只有卷积和池化层,包括两个路径:
特点:
1.2.2.2 V-Net [2016]论文:V-net: Fully convolutional neural networks for volumetric medical image segmentation 1.3 Multi-Scale and Pyramid Network Based Models1.3.1 FPN [2017]论文:Feature Pyramid Networks for Object Detection FPN 最初被提出的时候是被用于目标检测的,目标检测任务中的目标大小不一,尺度相差也比较大,但由于计算量和内存的原因,特征金字塔在很长一段时间并没有被广泛使用。所以本文的作者就提出了 FPN 模块,可以嵌入任何网络结构(如 Faster R-CNN 等),并且计算开销很小。 结构:
FPN 的特点:晚融合 也就是在每层和上层融合后,分别进行结果预测,然后再把结果进行融合
之后也被用于分割任务。FPN 能在只增加很少计算量的情况下,融合多尺度金字塔特征。之后,使用两个多层 MLP 来生成分割 mask。 1.3.2 PSPNet [2017]论文:Pyramid Scene Parsing Network Pyramid Scene Parsing Network(PSPNet),也是一个多尺度网络,能更好的学习全局上下文信息。 Scene Parsing 是基于语义分割的,也是计算机视觉的基础,需要给每个像素分配其类别。其难点在于场景和类别的多样性。 下图 2 的第一行展示了一种误识别:将船识别为了车 这种误识别可能是由于船和车的目标具有一定的相似性,但作者考虑,如果模型能考虑该目标(船)的上下文信息,则会发现船一般会和河流离得近,也许会降低误识别。
提出了pyramid pooling module (PPM) 模块,聚合不同区域的上下文信息,从而提高获取全局信息的能力。 现有的深度网络方法中,某一个操作的感受野直接决定了这个操作可以获得多少上下文信息,所以提升感受野可以为网络引入更多的上下文信息。 框架:
Step2: global average pooling 之后,每层都接一个1x1的卷积来降低通道维度。 Step3: 上采样到和原图相同的尺寸,然后和进入PPM头之前的feature map 进行concat 来预测结果。 1.4 R-CNN Based Models(for Instance Segmentation)Mask-RCNN 可以实现 object instance segmentation,在 COCO 数据集上取得了很好的成绩。 还有很多基于 Mask-RCNN 的实例分割结构。如 R-FCN、DeepMask、PolarMask、CenterMask 等。 1.5 Dilated Convolutional Models and DeepLab Family膨胀卷积(Dilated,也叫 atrous 卷积)为卷积网络引入了一个新的参数——膨胀率。膨胀卷积能够在不引入额外参数的情况下,提高感受野,所以有很多实时的分割网络都会使用膨胀卷积。如 DeepLab 家族[78]、multi-scale context aggregation[79]、dense upsampling convolution and hybrid dilatedconvolution(DUC-HDC)[78]、densely connnected atrous spatial pyramid pooling(ASPP)[81] 和 efficient neural network(ENet)[82]。 1.5.1 Deeplab v1论文:Semantic image segmentation with deep convolutional nets and fully connected crfs 本文认为语义分割的主要问题:
本文的方法:
1.5.2 Deeplab v2本文认为语义分割的主要问题:
Deeplab v2 有三个关键点:
1.5.3 Deeplab v3论文:Rethinking atrous convolution for semantic image segmentation 改进:
本文认为语义分割的主要问题(Deeplab 系列提出的问题基本一样):
DeeplabV3 的解决方法:膨胀卷积(多种膨胀率)+ SPP
语义分割的高级语义特征是需要从深层的低分辨率特征图中提取的,对比了使用和不使用膨胀卷积的情况:
使用全局平均池化的原因: ASPP 是使用不同的膨胀率来捕捉不同尺度的信息,但是当膨胀率变大的时候,有效的元素就越少,也就是间隔越大,会有很多权重落到特征图外,无法起作用,极端情况就是这个3x3的卷积的效果类似于一个1x1的卷积。 解决方式: 在最后一层特征图使用全局平均池化,将该 “image-level” 的特征输入 1x1 卷积中+BN 中,再上采样到需要的大小 修改后的 ASPP 如下图 5 所示,有两个部分:
1.5.4 Deeplabv3+论文:Encoder-decoder with atrous separable convolution for semantic image segmentation 语义分割中的两个常用策略:
Deeplabv3+:将这个两个策略结合起来 Deeplabv3+ 和 Deeplabv3 的联系:
改进的动机:
1.6 Attention-based Models1.6.1 Non-Local [2018]卷积网络是提取 local 特征的网络结构,为了捕捉长距离的依赖关系,作者提出了 non-local 的方法。可以和现有的结构结合,用于分类、目标检测、分割、姿态估计等。 non-local 的核心思想是计算特征图中的每个点和其他点的相关关系,也就是空间上的注意力。 1.6.2 PSANet论文:PSANet: Point-wise Spatial Attention Network for Scene Parsing 上下文信息聚合的来提升感受野的操作,在 ParseNet、ASPP、PPM 等都有用到。 PSANet 中,作者提出了 point-wise spatial attention,来自适应的聚合长距离上下文信息。 1.6.3 OCNet论文:Ocnet: Object context network for scene parsing 1.6.4 DANet [2019]论文:Dual attention network for scene segmentation
为了同时捕捉空间和通道的相关性,DANet 使用并行的方法,在通道和空间同时使用了 non-local 模块。两个模块如图 3 所示。
1.6.5 OCRNet论文:Object-Context Representations for Semantic Segmentation 动机: 语义分割任务中,每个像素的类别是该像素所属目标的类别,所以作者提出了和目标本身类别相关的方法,来给每个像素分配类别。 方法(以 cityscapes 为例):这里最终的加权可以看做是像素和类别之间的加权
语义分割研究的一个重要分支就是抽取某个位置周边的上下文语义信息:
1.7 Transformer-based Segmentation1.7.1 SETR论文: Rethinking semantic segmentation from a sequence-to-sequence perspective with transformers SETR 是首个在分割任务上超越 CNN 的 Transformer 网络结构,该论文作者认为,虽然 FCN 及其衍生网络都取得了较好的成绩,但本质上都是 encoder-decoder 的结构,所以,该论文作者想要将分割任务构建成一个 sequence-to-sequence 的结构,所以就提出了一个纯 Transformer 的结构(无 CNN 和分辨率降低)。 自从 ViT 证明了 Transformer 在图像分类任务上的的效果后,催生了很多相关的研究。而分割任务可以看做对逐个像素的分类任务,和图像分类有很强的关系,所以 SETR 使用 ViT 作为 backbone,然后使用 CNN 来进行特征图恢复。 框架结构:
Decoder的作用:生成和原图大小一致的2维分割结果 所以,这里需要把 encoder 的特征 Z 从 H W 256 \frac{HW}{256} 256HW? reshape 成 H 16 × W 16 × C \frac{H}{16} \times \frac{W}{16} \times {C} 16H?×16W?×C。 方法一:Naive upsampling (Naive) ① 将transformer得到的特征 Z L e Z^{L_e} ZLe? 映射到分割类别数(如cityscape就是19)
② 使用双线性插值进行上采样,然后计算loss 方法二:Progressive UPsampling (PUP)→ 效果最好 使用渐进上采样,使用卷积核上采样交替变换来实现,为了避免直接上采样多倍带来的误差,这个上采样方法每次只上采样2倍,也就是说如果要把大小为
H
16
×
W
16
\frac{H}{16} \times \frac{W}{16}
16H?×16W? 的
Z
L
e
Z^{L_e}
ZLe? 上采样到原图大小,需要进行4次操作。 1.7.2 PVT论文: Pyramid vision transformer: A versatile backbone for dense prediction without convolutions 但 ViT 有一些不足:
所以 PVT 提出了一种金字塔的 Transformer,能够适用于密集预测。PVT 和 ViT 的主要不同在于:
框架结构:
1.7.3 SegFormer论文:SegFormer:Simple and Efficient Design for Semantic Segmentation with Transformers PVT、Swin 和 Twins 等方法,主要考虑设计 encoder,忽略了 decoder 带来的提升,所以作者提出了 SegFormer,同时考虑了效果、效率、鲁棒性,使用了 encoder-decoder 的模式。 框架结构:
SegFomer 和 SETR 的区别:
Hierarchical Transformer Encoder 作者设计了一系列的 Mix Transformer encoders (MiT),MiT-B0 到 MiT-B5,结构相同,大小不同,MiT-B0 是最轻量级的,可以用来快速推理,MiT-B5 是最重量级的,可以取得最好的效果。 MiT 灵感来源于 ViT,但为适应分割做了一些优化。 ① Hierarchical Feature Representation: 给定输入图像 H × W × 3 H\times W \times 3 H×W×3,作者使用 patch merging 的方法来得到层级特征图 F i F_i Fi?,其分辨率为 H 2 i + 1 × W 2 i + 1 × C i \frac{H}{2^{i+1}} \times \frac{W}{2^{i+1}} \times C_{i} 2i+1H?×2i+1W?×Ci?,其中 i = { 1 , 2 , 3 , 4 } i=\{1, 2, 3, 4\} i={1,2,3,4},且 C i + 1 > C i C_{i+1}>C_{i} Ci+1?>Ci? ② Overlapped Patch Merging: ViT 中,将 N × N × 3 N\times N \times 3 N×N×3 的 patch,merge 成了 1 × 1 × C 1 \times 1 \times C 1×1×C 的特征,所以,作者可以吧特征从 H 4 × W 4 × C 1 \frac{H}{4} \times \frac{W}{4} \times C_{1} 4H?×4W?×C1? 变换到 H 8 × W 8 × C 2 \frac{H}{8} \times \frac{W}{8} \times C_{2} 8H?×8W?×C2?。并且不重叠的 patch 会失去局部连续性,所以作者使用有重叠的 patch merging 方法。 作者的 patch size K=7,相邻 patch 的 stride 为 S=4,padding size P=1,基于此来实现有重叠的 patch merging,得到和无重叠 patch merging 相同大小的结果。 ③ Efficient Self-Attention encoder 中计算量最大的就是 self-attention 层,所以作者使用了文献 [8] 中提出的方法,使用了一个 reduction ratio R R R 来降低序列的长度: ④ Mix-FFN ViT 使用 position encoding(PE) 来引入局部位置信息,但是 PE 的分辨率大小是固定的,所以当测试不同于训练图像大小的图像时,需要插值,这样会导致准确率下降。 作者认为 PE 在语义分割中是不需要的,引入了一个 Mix-FFN,考虑了零填充对位置泄露的影响,直接在 FFN 中使用 3x3 的卷积,格式如下: Mix-FFN 在 FNN 中使用了 3x3 的卷积和 MLP,并且也证明了 3x3 的卷积能够保留位置信息。 Lightweight ALL-MLP Decoder SegFormer 使用 MLP 构建了一个 Decoder,能够使用 MLP 来实现 decoder 的一个重要原因是,Transformer 有比 CNN 高的感受野。 Decoder 的过程:
Effective Receptive Field Analysis: 语义分割任务中,保持大的感受野非常重要,所以作者使用 Effective Receptive Field Analysis(ERF)作为工具来可视化并解释为什么 MLP decoder 在 Transformer 上如此有效。 如图 3 所示,作者分别可视化了SegFormer 和 Deeplabv3+ 的 4个 stage 和 decoder head 的 ERF。
所以,MLP 形式的 decoder 能在 Transformer 网络中发挥比 CNN 中更好的作用的原因在于感受野。 这里以训练 cityscapes 为例,来展示其中的要点。 代码运行:
① Encoder 主要过程
四个 stage 的输出被 concat 成为一个 list,也就是四种不同分辨率大小的多层级特征图。 transformer block 1 如下:
② SegFormer Head
1.7.4 HRFormerNeurIPS 2021 论文:HRFormer:High-Resolution Transformer for Dense Prediction HRFormer 是一个针对密集预测任务提出的方法,不同于 ViT 系列只使用低分辨率特征的方法。 ViT 系列的方法在分类任务上的优势有目共睹,其将图像切分为小块,分别提取小块中的特征,网络输出是单个分辨率的,缺失了处理多尺度目标的能力。 HRFormer 能够提取多尺度空间信息,为密集预测提供多分辨率特征表达。 HRFormer block:
HRFormer 框架结构:
HRFormer 的输出包含了 4 种不同分辨率的特征图,对于不同的任务,作者罗列了不同的 head 设计方法:
1.7.5 PoolFormer论文:PoolFormer: MetaFormer is Actually What You Need for Vision
所以,作者使用简单的 spatial pooling 模块替换了 attention 模块,来实现 token 之间的信息交互,称为 PoolFormer,也能达到很好的效果。 在 ImageNet-1K 上达到了 82.1% 的 top-1 acc。 作者使用 PoolFormer 证明了他们的猜想,并且提出了 “MetaFormer” 的概念,也就是一种从 Transformer 中抽象出来的结构,没有特殊的 token mixer 方式。 框架结构: 1、MetaFormer MetaFormer 其实是 Transformer 的一个抽象,其他部分和 Transformer 保持一致,token mixer 方式是不特殊指定的。 ① 首先,输入
I
I
I 经过 embedding: ② 然后,将 embedding token 输入 MetaFormer blocks,该 block 包含两个残差 sub-blocks
Y = T o k e n _ M i x e r ( N o r m ( X ) ) + X Y=Token\_Mixer(Norm(X))+X Y=Token_Mixer(Norm(X))+X
2、PoolFormer 作者为了证明猜想,使用了非常简单的 pooling 算子来实现 token mixer,没有任何可学习参数。 假设输入形式为 T ∈ R C × H × W T\in R^{C\times H \times W} T∈RC×H×W,channel 维度在前,则 pooling 操作如下, k k k 为 pooling 大小:
二、2D 数据集介绍2.1 PASCAL Visual Object Classes (VOC)可以支持 5 类任务:分类、分割、检测、姿势识别、人体。 对于分割任务,共支持 21 个类别,训练和验证各 1464 和 1449 张图: vehicles, household, animals, aeroplane, bicycle, boat, bus, car, motorbike, train, bottle, chair, dining table, potted plant, sofa, TV/monitor, bird, cat, cow, dog, horse, sheep, and person 2.2 PASCAL Context是 VOC 2010 检测比赛的扩充集,包含 400 个类别,三个大类(objects、stuff、hybrids),经常只使用 59 个常见类别。 2.3 Microsoft Common Objects in Context (MS COCO)共包括 91 个类别,328k 图像,2.5 million 带 label 的实例。 检测任务共包含 80 个类别,82k 训练,40.5 验证。 2.4 Cityscapes街景数据集,包含 5k 精细标注数据,20k 粗糙标注数据。标注了 30 个类别。
类别定义:
2.5 ADE20K/MIT Scene Parsing包含 20k 训练,2k 验证数据,共 150 个类别。 2.6 MapillaryMapillary Vistas 数据集包含 66 类共 25,000 张高分辨率街景场景的数据,其中有 37 个类是以实例区分的标签。数据总量是 cityscapes 的5倍之多,包括不同天气、季节、时间。采集方式包括手机、摄像机、电脑、运动相机等。
三、评价指标3.1 Pixel accuracy对于 K+1 个类别(K 类目标,1 类背景),PA 计算如下: 其中, p i j p_{ij} pij? 是第 i 个类别预测为第 j 个类别的总量 3.2 Mean Pixel Accuracy(MPA)是 PA 的扩展,对每个类别分别计算,然后求平均 3.3 IoU是语义分割中的一个很重要的衡量指标,表示的是预测的 map 和 gt map 之间的交并比: I o U = T P T P + F P + F N IoU = \frac{TP}{TP+FP+FN} IoU=TP+FP+FNTP? 语义分割中,IoU是用mask来评价的: GT: Prediction: Intersection: Union: mIoU:各个类别的IoU的均值 mIoU 的计算:
混淆矩阵:
混淆矩阵的对角线上的值表示预测正确的值,IoU是只求正例的IoU,如何找出和正例有关的混淆矩阵元素呢,可以通过划线法来得到,
假设一个3类的预测输出的混淆矩阵如下所示:
精确率:
p
r
e
c
i
s
i
o
n
0
=
a
/
(
a
+
d
+
g
)
precision_0 = a/(a+d+g)
precision0?=a/(a+d+g)
p
r
e
c
i
s
i
o
n
0
=
3
/
(
3
+
0
+
0
)
=
1
precision_0 = 3/(3+0+0)=1
precision0?=3/(3+0+0)=1 召回率:
r
e
c
a
l
l
0
=
a
/
(
a
+
b
+
c
)
recall_0 = a/(a+b+c)
recall0?=a/(a+b+c)
r
e
c
a
l
l
0
=
3
/
(
3
+
0
+
0
)
recall_0 = 3/(3+0+0)
recall0?=3/(3+0+0) CPA:Class Pixel Accuracy(每类的像素精度)→按类别计算正确的像素占总像素的比例
P
i
=
对角线值
/
对应列的像素总数
P_i = 对角线值/对应列的像素总数
Pi?=对角线值/对应列的像素总数 MPA:Mean Pixel Accuracy→每类正确分类像素比例的平均 IoU:
mIoU: m I o U = s u m ( I o U i ) / c l a s s mIoU = sum(IoU_i)/class mIoU=sum(IoUi?)/class
3.4 Mean-IoU是所有类别 IoU 求平均 3.5 Precision/Recall/F1 score3.6 Dice coefficient类似于 IoU: 当为二值 map 时,等于 F1 score 四、Loss 函数代码链接:https://github.com/shruti-jadon/Semantic-Segmentation-Loss-Functions 分割的 loss 函数可以被大体分为 4 个大类:
4.1 Cross-Entropy lossCross-entropy 是衡量两个概率分布的距离的量,一般被用作分类的目标函数,分割作为一个像素级别分类的任务,也同样可以使用该函数作为目标函数。 1、Binary Cross-entropy 信息量:用来衡量一个事件所包含的信息大小,一个事件发生的概率越大,则不确定性越小,信息量越小。公式如下,从公式中可以看出,信息量是概率的负对数: 熵:用来衡量一个系统的混乱程度,代表系统中信息量的总和,是信息量的期望,信息量总和越大,表明系统不确定性就越大。 E n t r o p y = ? ∑ p l o g ( p ) Entropy = -\sum p log(p) Entropy=?∑plog(p) 交叉熵:用来衡量实际输出和期望输出的接近程度的量,交叉熵越小,两个概率分布就越接近。 pytorch中的交叉熵: Pytorch中CrossEntropyLoss()函数的主要是将softmax-log-NLLLoss合并到一块得到的结果。
交叉熵loss可以用到大多数语义分割场景中,但他有一个明显的缺点,对于只用分割前景和背景时,前景数量远远小于背景像素的数量,损失函数中y=0的成分就会占据主导,使得模型严重偏向背景,导致效果不好。 语义分割 cross entropy loss计算方式: 输入 model_output=[2, 19, 128, 256] # 19 代表输出类别 1、将model_output的维度上采样到 [512, 1024] 2、softmax处理:这个函数的输入是网络的输出预测图像,输出是在dim=1(19)上计算概率。输出维度不变,dim=1维度上的值变成了属于每个类别的概率值。
3、log处理:
4、nll_loss 函数(negative log likelihood loss):这个函数目的就是把标签图像的元素值,作为索引值,在temp3中选择相应的值,并求平均。
如果第一个点真值对应的3,则在预测结果中第3个通道去找该点的预测值,假设该点预测结果为-0.62,因为是loss前右负号,则最终结果变为0.62。其余结果依次类推,最后求均值即时最终损失结果。
二值 Cross-entropy 公式如下: 2、Weighted Binary Cross-entropy Weighted Binary Cross-entropy(WCE) 是二值 cross-entropy 函数的变体,正样本会通过加权系数来得到权重的加强。适用于分布较倾斜的数据,如下图所示。
2、Balanced Cross-entropy Balanced cross entropy (BCE) 类似于 WCE,唯一的不同在于正样本, BCE 的公式如下: 4.2 Focal lossFocal loss 可以被看做 Binary Cross-entropy loss 的变体,特点如下:
Focal loss 其实是源于 Cross-entropy loss 的,目的是解决样本数量不平衡的情况:
一般分类时候通常使用交叉熵损失: C r o s s E n t r o p y ( p , y ) = { ? l o g ( p ) , y = 1 ? l o g ( 1 ? p ) , y = 0 CrossEntropy(p,y)= \begin{cases} -log(p), & y=1 \\ -log(1-p), & y=0 \end{cases} CrossEntropy(p,y)={?log(p),?log(1?p),?y=1y=0? 为了解决正负样本数量不平衡的问题,我们经常在二元交叉熵损失前面加一个参数 α \alpha α。负样本出现的频次多,那么就降低负样本的权重,正样本数量少,就相对提高正样本的权重。因此可以通过设定 α \alpha α的值来控制正负样本对总的loss的共享权重。 α \alpha α取比较小的值来降低负样本(多的那类样本)的权重。即: C r o s s E n t r o p y ( p , y ) = { ? α l o g ( p ) , y = 1 ? ( 1 ? α ) l o g ( 1 ? p ) , y = 0 CrossEntropy(p,y)= \begin{cases} -\alpha log(p), & y=1 \\ -(1-\alpha) log(1-p), & y=0 \end{cases} CrossEntropy(p,y)={?αlog(p),?(1?α)log(1?p),?y=1y=0? 虽然平衡了正负样本的数量,但实际上,目标检测中大量的候选目标都是易分样本。这些样本的损失很低,但是由于数量极不平衡,易分样本的数量相对来讲太多,最终主导了总的损失。 因此,这篇论文认为易分样本(即,置信度高的样本)对模型的提升效果非常小,模型应该主要关注与那些难分样本 。一个简单的想法就是只要我们将高置信度样本的损失降低一些, 也即是下面的公式: 当 γ = 0 \gamma=0 γ=0 时,即为交叉熵损失函数,当其增加时,调整因子的影响也在增加,实验发现为2时效果最优。 假设取 γ = 2 \gamma=2 γ=2,如果某个目标置信得分p=0.9,即该样本学的非常好,那么这个样本的权重为 ( 1 ? 0.9 ) 2 = 0.001 (1-0.9)^2=0.001 (1?0.9)2=0.001,损失贡献降低了1000倍。 为了同时平衡正负样本问题,Focal loss还结合了加权的交叉熵loss,所以两者结合后得到了最终的Focal loss: F o c a l l o s s = { ? α ( 1 ? p ) γ l o g ( p ) , y = 1 ? ( 1 ? α ) p γ l o g ( 1 ? p ) , y = 0 Focal loss = \begin{cases} -\alpha (1-p)^\gamma log(p), & y=1 \\ -(1-\alpha) p^\gamma log(1-p), & y=0 \end{cases} Focalloss={?α(1?p)γlog(p),?(1?α)pγlog(1?p),?y=1y=0? 取 α = 0.25 \alpha=0.25 α=0.25 在文中,即正样本要比负样本占比小,这是因为负样本易分。 单单考虑alpha的话,alpha=0.75时是最优的。但是将gamma考虑进来后,因为已经降低了简单负样本的权重,gamma越大,越小的alpha结果越好。最后取的是alpha=0.25,gamma=2.0 https://zhuanlan.zhihu.com/p/49981234
4.3 Dice LossDice Loss: Dice 系数: 根据 Lee Raymond Dice命名,是一种集合相似度度量函数,通常用于计算两个样本的相似度(值范围为 [0, 1]),公式如下,分子有2是因为分母加了两次TP: D i c e C o e f f i c i e n t = 2 ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ DiceCoefficient = \frac{2|X \cap Y|}{|X|+|Y|} DiceCoefficient=∣X∣+∣Y∣2∣X∩Y∣? 其中, ∣ X ∣ |X| ∣X∣和 ∣ Y ∣ |Y| ∣Y∣分别表示集合的元素个数,分割任务中,两者分别表示GT和预测。 所以 Dice Loss 公式如下: D i c e L o s s = 1 ? 2 ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ DiceLoss = 1-\frac{2|X \cap Y|}{|X|+|Y|} DiceLoss=1?∣X∣+∣Y∣2∣X∩Y∣? 从IoU过度到Dice:
IoU的算式: I o U = T P T P + F P + F N IoU = \frac{TP}{TP+FP+FN} IoU=TP+FP+FNTP? 简单的说就是,重叠的越多,IoU越接近1,预测效果越好。 Dice 系数: D i c e _ C o e f f i c i e n t = 2 ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ Dice\_Coefficient = \frac{2|X \cap Y|}{|X|+|Y|} Dice_Coefficient=∣X∣+∣Y∣2∣X∩Y∣?
所以: 所以我们可以得到Dice和IoU之间的关系了,这里的之后的Dice默认表示Dice Coefficient: I o U = D i c e 2 ? D i c e IoU=\frac{Dice}{2-Dice} IoU=2?DiceDice? 这个函数图像如下图,我们只关注0~1这个区间就好了,可以发现:
需要注意的是Dice Loss存在两个问题:
所以在一般情况下,还是使用交叉熵损失函数。 Dice coefficient 通常被用来度量两幅图像的相似度,Dice loss 公式如下:
4.4 Tversky LossTversky index(TI) 也可以被看成 Dice coefficient 的一种扩展: 当 β = 1 / 2 \beta=1/2 β=1/2 时,就是 Dice coefficient。 Tversky loss 公式如下: |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/29 8:52:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |