跳转到主要内容

图像分割2020总结:结构,损失函数,数据集和框架

demi 提交于

作者:Derrick Mwiti
编译:ronghuaiyang

<font style="line-height: 40px;"><strong>导读</strong></font>

一个很好的入门小短文,内容很全,适合上手。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

在这篇文章中,我们将进入使用深度学习进行图像分割的世界。我们将讨论:
<ul><li>图像分割是什么以及图像分割的两种主要类型</li></ul>
<ul><li>图像分割结构</li></ul>
<ul><li>图像分割中使用的损失函数</li></ul>
<ul><li>你可以使用的框架</li></ul>

就让我们一探究竟吧。

<font style="line-height: 40px;"><strong>什么是图像分割?</strong></font>

顾名思义,这是将图像分割为多个部分的过程。在这个过程中,图像中的每个像素都与一个对象类型相关联。图像分割主要有两种类型:语义分割和实例分割。

在语义分割中,所有相同类型的对象都使用一个类标签进行标记,而在实例分割中,相似的对象使用各自的标签。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

<font style="line-height: 40px;"><strong>图像分割结构</strong></font>

图像分割的基本结构包括编码器和解码器。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

编码器通过滤波器从图像中提取特征。解码器负责生成最终输出,该输出通常是包含对象轮廓的分割掩码。大多数架构都有这种架构或它的变体。

让我们来看几个例子。

<font style="line-height: 40px;" color="#c200ff">U-Net</font>

U-Net是一种卷积神经网络,最初是为分割生物医学图像而开发的。当它被可视化的时候,它的架构看起来像字母U,因此被命名为U-Net。其体系结构由两部分组成,左侧为收缩路径,右侧为扩展路径。收缩路径的目的是获取上下文,而扩展路径的作用是帮助精确定位。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

U-Net是由右侧的扩张路径和左侧的收缩路径组成的。收缩路径由两个3乘3的卷积组成。卷积之后是一个ReLU和一个2x2的最大池计算用于下采样。

你可以在这里找到U-Net的完整实现:https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/

<font style="line-height: 40px;" color="#c200ff">FastFCN —Fast Fully-connected network</font>

在这个架构中,使用一个联合金字塔上采样(JPU)模块来替换膨胀卷积,因为它们消耗大量的内存和时间。在应用JPU进行上采样时,其核心部分采用全连接网络。JPU将低分辨率的feature map采样到高分辨率feature map。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

如果你想动手实现一些代码,看这里:https://github.com/wuhuikai/FastFCN

<font style="line-height: 40px;" color="#c200ff">Gated-SCNN</font>

这个架构由一个 two-stream CNN架构组成。在该模型中,使用一个单独的分支来处理图像的形状信息。利用形状流来处理边界信息。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

实现参考代码:https://github.com/nv-tlabs/gscnn

<font style="line-height: 40px;" color="#c200ff">DeepLab</font>

在这种架构中,上采样滤波器的卷积用于涉及密集预测的任务。多尺度的目标分割是通过空间金字塔池实现的。最后,利用DCNNs来改进目标边界的定位。通过对滤波器插入零进行上采样或对输入特征图进行稀疏采样来实现卷积。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

实现参考代码:https://github.com/fregu856/deeplabv3https://github.com/sthalles/deeplab_v3

<font style="line-height: 40px;" color="#c200ff">Mask R-CNN</font>

在这个架构中,使用边界框和语义分割将每个像素划分为一组类别,对对象进行分类和局部化。对每个感兴趣的区域得到一个分割掩码,生成一个类标签和一个边界框作为最终输出。该架构是Faster R-CNN的扩展。Faster R-CNN由regions proposer和深度卷积网络和利局部检测器组成。

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

这里是COCO测试集中的一张图像的结果:

<center><img width="600" src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

<font style="line-height: 40px;"><strong>图像分割损失函数</strong></font>

语义分割模型在训练过程中通常使用一个简单的交叉分类熵损失函数。但是,如果你对获取图像的细粒度信息感兴趣,那么你需要用到稍微高级一点的损失函数。

我们来看看其中的几个。

<font style="line-height: 40px;" color="#c200ff">Focal Loss</font>

这种损失是对标准交叉熵的改进。这是通过改变它的形状来实现的,这样分配给分类良好的样本的损失就降低了。最终,这确保了没有类别不平衡。在这个损失函数中,交叉熵损失被缩放,随着对正确类的置信度的增加,缩放因子衰减为零。在训练时,比例因子会自动降低简单样本的权重,并聚焦于困难样本。

<center><img src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

<font style="line-height: 40px;" color="#c200ff">Dice loss</font>

这个损失是通过计算smooth dice coefficient得到的。这种损失是最常用的分割损失。

<center><img src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

<font style="line-height: 40px;" color="#c200ff">Intersection over Union (IoU)-balanced Loss</font>

IoU平衡分类损失的目的是增加高IoU样本的梯度,降低低IoU样本的梯度。这样提高了机器学习模型的定位精度。

<center><img src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

<font style="line-height: 40px;" color="#c200ff">Boundary loss</font>

边界损失的一种变体应用于分割高度不平衡的任务。这种损失的形式是空间等高线上的距离度量,而不是区域。这种方法解决了高度不平衡的分割任务中区域损失的问题。

<center><img src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

<font style="line-height: 40px;" color="#c200ff">Weighted cross-entropy</font>

在交叉熵的一种变体中,所有正样本都用一定的系数进行加权。它用于类别不平衡的场景。

<center><img src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

<font style="line-height: 40px;" color="#c200ff">Lovász-Softmax loss</font>

该损失是对基于子模块损失凸Lovasz扩展的神经网络平均IoU损失的直接优化。

<center><img src="http://imgtec.eetrend.com/files/2020-11/%E5%8D%9A%E5%AE%A2/100058986-11…; alt=""></center><br>

其他值得一提的损失包括:
<ul><li>TopK loss,其目的是确保网络在训练过程中聚焦于困难样本上。</li></ul>
<ul><li>距离惩罚交叉熵损失,引导网络难以分割的边界地区。</li></ul>
<ul><li>敏感性-特异性(SS)损失,计算特异性和敏感性的均方差的加权和。</li></ul>
<ul><li>Hausdorff distance(HD) loss,估计了卷积神经网络的Hausdorff距离。</li></ul>

这只是在图像分割中使用的几个损失函数。想了解更多内容,看这里:https://github.com/JunMa11/SegLoss

<font style="line-height: 40px;"><strong>图像分割数据集</strong></font>

从哪里可以得到一些数据集来开始?让我们来看几个例子。

Common Objects in COntext — Coco Dataset
COCO是一个大型物体检测、分割和图像描述数据集。数据集包含91个类。它有25万个人标注了关键点。它的大小是37.57 GiB。它包含80个物体类别。它遵循Apache 2.0许可,
下载链接:http://cocodataset.org/#download

PASCAL Visual Object Classes (PASCAL VOC)
PASCAL有9963个图像和20个不同的类。训练/验证集是一个2GB的tar文件。
数据集下载:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/

The Cityscapes Dataset
此数据集包含城市场景的图像。它可以用来评估城市场景中视觉算法的性能。
数据集下载:https://www.cityscapes-dataset.com/downloads/

The Cambridge-driving Labeled Video Database — CamVid
这是一个基于运动的分割和识别数据集。它包含32个语义类。
数据集下载:http://mi.eng.cam.ac.uk/research/projects/VideoRec/CamVid/

<font style="line-height: 40px;"><strong>图像分割框架</strong></font>

现在你已经有了数据集,让我们介绍一些工具/框架,你可以使用它们来开始。
<ul><li>FastAI library - 给定一幅图像,该库能够创建该图像中对象的mask。</li></ul>
<ul><li>Sefexa Image Segmentation Tool  - Sefexa是一个免费的工具,可以用于半自动图像分割,图像分析,创建ground truth</li></ul>
<ul><li>Deepmask - Deepmask由Facebook Research开发,是Deepmask和SharpMask的Torch实现。</li></ul>
<ul><li>MultiPath - 这是来源于A MultiPath Network for Object Detection的物体检测网络的Torch实现。</li></ul>
<ul><li>OpenCV - 这是一个开源的计算机视觉库,有超过2500个优化算法。</li></ul>
<ul><li>MIScnn - 这是一个医学图像分割开源库。它使用最先进的卷积神经网络和深度学习模型建立管道,只需几行代码。</li></ul>
<ul><li>Fritz - Fritz提供多种计算机视觉工具,包括用于移动设备的图像分割工具。</li></ul>

<font style="line-height: 40px;"><strong>总结</strong></font>

本文为你提供了一些图像分割的背景知识,并为你提供了一些工具和框架,可以用于入门。

我们讨论了:
&nbsp; • &nbsp; 什么是图像分割,
&nbsp; • &nbsp; 图像分割架构,
&nbsp; • &nbsp; 图像分割损失,
&nbsp; • &nbsp; 图像分割工具和框架。

要了解更多信息,请查看每个架构和框架的链接。

英文原文:https://neptune.ai/blog/image-segmentation-in-2020
本文转自:<a href="https://mp.weixin.qq.com/s/IO4cUTgcFO9hCMT9hTCXiQ"><u>AI公园</u></a&gt;,作者:Andre Ye,编译:ronghuaiyang
转载此文目的在于传递更多信息,版权归原作者所有。