zoukankan      html  css  js  c++  java
  • SOLO(SOLO: Segmenting Objects by Locations)论文阅读笔记

    以下为我总结出的论文各部分的主要内容,某些地方可能夹带着一些自己的理解和思考。

    摘要

    • 本文内容:SOLO

      提出新的、非常简单的实例分割方法SOLO

    • 与许多其他密集预测任务(比如语义分割)相比,实例分割的难点

      实例数量的不确定性

    • 实例分割的主流方法,把实例分割任务分解为2个分类任务

      • 先检测后分割,比如Mask R-CNN
      • 先预测embedding vector,然后通过聚类将像素分组成独立实例
    • 本文提出的SOLO的方法

      引入“instance categories”的概念:根据实例的位置和大小为实例中的每个像素分配类别,从而很好地将实例分割转换为分类问题

    • SOLO的性能

      精度与Mask R-CNN持平,比最近的其它single-shot实例分割算法要高。

    1. 引言

    • 实例分割的难点

      语义分割可以视为给每个像素分类的任务,但由于实例数量的不确定性,导致语义分割等任务的方法不能在实例分割中奏效。

    • 实例分割算法分类及其优缺点

      为克服上面提到的实例分割的难点,最近的实例风格算法(也就是摘要提到的主流方法)可分为两类,缺点是step-wise、indirect

      • top-down

        • 思路

          ‘detect-then-segment’,先检测矩形边界框,然后在每个矩形框内做分割

        • 缺点

          严重依赖精准的矩形检测框

      • bottom-up

        • 思路

          通过push属于不同实例的像素并close同一实例中的像素来学习affinity relation(亲和关系),为每个像素分配embedding vector,然后通过分组后处理以分离实例。

        • 缺点

          依赖像素级的embedding learning和分组后处理

      • SOLO

        基于实例分割标注(有监督训练),直接预测实例的掩码

    • rethinking

      • 图片中的物体实例的根本区别是什么?
      • 以MSCOCO为例,绝大多数情况下,图片中的两个实例要么有不同的中心位置、要么有不同尺寸,数据分析如下:
        • 98.3%的object pair(实例对)的中心的距离超过30个像素
        • 剩下的1.7%,其中40.5%的实例对的大小比例大于1.5
      • 所以可以直接通过中心位置和大小区分实例
    • 模仿语义分析主流方法

      • 语义分析主流方法是用FCN(全卷积神经网络)输出N个通道,每个通道负责一个语义类别

      • SOLO模仿语义分析使用FCN的方法,提出“instance categories”的概念,即量化的中心位置center locations和实例大小object sizes

        个人思考:这不是和YOLO很像吗??

    Locations

    • SOLO如何处理Locations,即实例的位置
      • SOLO把一张图片分成a grid of S×S cells(S×S个单元格)即得到S×S个center location classes
      • SOLO根据实例的中心坐标为每个实例分配one of the grid cells,作为该实例的center location category
      • DeepMask and TensorMask,pack the mask into the channel axis。SOLO将center location category编码为channel axis,类似于语义分割中的语义类别。输出的每个channel代表一个center location category,预测属于这个center location category的实例的掩码。
    • SOLO这样处理Location的作用
      • 本质上,instance category近似于center location。因此,把每个像素分类到instance category其中,等效于使用回归从每个像素预测center location。
      • 将location预测任务转换为分类而不是回归的重要性在于,通过分类,使用固定数量的通道对不同数量的实例进行建模更加简单明了,同时又不依赖于grouping或者learning embeddings等后处理
      • 个人思考:前文强调了实例分割任务中实例的数量是不确定的,导致实例分割很难,可以猜测是之前的方法是回归,处理实例数量不确定这个情况的方法并不优雅

    Sizes

    • SOLO如何处理Sizes,即实例的大小
      • 使用特征金字塔网络FPN,为大小不同的实例分配对应大小的特征图,作为其object size classes
      • 注意FPN旨在检测图像中不同大小的实例。在之后,我们根据经验证明FPN是SOLO的核心组成部分,对分割性能(尤其是大小不同的目标)产生深远影响。

    总结

    • SOLO只需要分割标注,不需要框标注(目前多数方法是需要的),即可完成实例分割

    • 在COCO上的性能,摘要里讲过

    • 通用性:我们通过实例轮廓检测的任务展示了我们框架的通用性,将实例边缘轮廓视为one-hot的二进制掩码,几乎没有任何修改,SOLO可以生成合理的实例轮廓。

    • SOLO只需解决两个像素级分类任务

      和语义分割一样,所以可以再参考语义分割领域的进步,提高SOLO

    • 本质上,SOLO通过离散量化将坐标回归转换为分类

      避免了通常在诸如YOLO之类的检测器中使用的坐标规范化和对数转换

    2. 相关工作

    回顾了一些和SOLO最相近的实例分割工作

    Top-down Instance Segmentation

    SOLO和下面的方法相比, 不受限于anchor和box

    • 典型方法

      在边界框里做分割

    • FCIS

      FCIS:由region proposal network(RPN)生成的ROI中assemble(计算?)position-sensitive score maps,以预测实例掩码。

    • Mask R-CNN

      扩展Faster R-CNN,具体来讲是在其中添加一个branch(用于在检测到的边界框中分割实例)

    • PANet

      基于Mask R-CNN,进一步增强了特征表示以提高准确性

    • Mask Scoring R-CNN

      基于Mask R-CNN,添加了mask-IoU分支(预测所预测的掩码的质量并对掩码进行评分)以提高性能。

    • TensorMask

      采用dense sliding window方法,通过预定义的windows和scales在每个像素的本地窗口中分割实例

    Bottom-up Instance Segmentation

    这类方法通过将像素分组为图像中的实例(任意数量)来进行实例分割,可通过损失函数实现,这类方法的精度一般比Top-down的要低,特别是有复杂场景和语义类别的图片。

    • SGN

      把语义分割分解为一系列分组问题

    • SSAP

      学习像素对相关性金字塔,即两个像素属于同一实例的概率,并通过级联图分区顺序生成实例掩码。

    Direct Instance Segmentation

    目前没有这种方法,最近提出的一些方法被视为‘semi-direct’(半直接)。

    这两个方法都是分步骤的,或者是折中的(比如粗略表示掩码)

    • AdaptIS

      先预测点,然后生成位于这些点中的实例的实例的掩码

    • PolarMask

      PolarMask提出使用极坐标表示来编码掩码,并将每个像素的掩码预测转换为距离回归。

    • 本文SOLO

      图片作为输入,直接输出掩码和概率;全卷积;不需要box不需要分组也不需要ROI等

    3. 我们的方法SOLO

    3.1 问题表述

    • 实例分割做什么

      给定一张图片,如果其中存在实例,要求返回实例的掩码

    • SOLO

      • 将实例分割任务分为两个同时的任务:category-aware prediction和instance-aware mask generation
      • 把图片分成a uniform grids(S×S),如果物体中心在某个grid cell中,那这个grid cell负责预测语义类别和掩码

    3.1.1 语义类别

    • 对于每个grid,SOLO都会预测C维输出表示语义类别概率,其中C是类别数,这些概率取决于grid cell。

    • 如果将输入图像划分为S×S grids,则输出空间将为S×S×C,如图2(顶部)所示。

    • 该设计基于以下假设:each cell of S×S grids必须属于一个单独的实例,因此仅属于一个语义类别。

      这个假设很重要

    • 在推理期间,C维输出表示每个对象实例的各类概率。

    3.1.2 实例掩码

    • 与语义类别预测并行,每个正grid cell还将生成相应的实例掩码。

    • 对于输入图像I,如果将其划分为S×S grids,则总共最多会有(S^2)个预测的掩码。我们在3D输出张量的第3维(通道)上显式编码这些掩码。具体而言,实例掩码输出的尺寸为(H_I×W_I×S^2),第k个通道将负责在grid(i,j)处分割实例,其中k = i·S + j(i和j从零开始)。为此,在语义类别和与类无关的掩码之间建立了一对一的对应关系(图2)。

    • 预测实例掩码的直接方法是采用完全卷积网络,例如语义分割中的FCN。

    • FCN的缺点,这一点不是很懂

      常规的卷积运算在某种程度上在空间上是不变的,空间不变性对于某些任务(例如图像分类)是理想的,因为它会引入鲁棒性。
      但是,这里我们需要一个空间变化(spatially variant)的模型,或者更精确地说,是位置敏感的模型,因为我们的分割掩码的条件是网格单元和必须由不同的功能通道分隔。

    • 最后还要进行NMS

    3.2. 网络结构

    • FPN会为每个级别生成具有不同大小的特征图金字塔,并具有固定数量的通道(通常为256-d)。网格数可能在不同的金字塔上有所不同。
    • 这些特征图用作每个预测头的输入:语义类别和实例掩码。
    • 头部的权重在不同级别上共享。

    3.3 SOLO Learning

    3.3.1 标签分配

    • 正负样本

      如果网格(i,j)在任一个实例的中心区域,则视其为正样本;否则,它为负样本。

    • 中心区域

      center (cx, cy),factor,中心区域为(cx, cy, w×factor, h×factor),factor=0.2

    3.3.2 损失函数

    • 损失函数

      L = Lcate + λLmask

    3.4. 推理

    • 给定输入图像,然后通过骨干网络和FPN推理,并获得网格(i,j)处的类别得分pi,j和相应的掩码mk,其中k = i·S + j,因为我们通常保持行优先(有效)。
    • 使用置信度阈值0.1来过滤低置信度的预测,然后选择得分排名前500位的掩码,并将其输入到NMS操作中,使用阈值0.5将预测的软掩码二进制化,保留前100个实例蒙版进行评估。

    4. 实验

    • 测试集:COCO
    • 训练细节
      • synchronized SGD
      • 8 GPUs with a total of 16 images per mini-batch、
      • 36 epochs
      • initial learning rate of 0.01,which is then divided by 10 at 27th and again at 33th epoch
      • All models are initialized from ImageNet pre-trained weights
      • 比例抖动:较短的图像边从640到800像素中随机采样。

    4.1. 主要结果

    引言和摘要里讲过

    4.2. SOLO如何工作/起效?

    核心在图4,可以看到预测出的掩码。每个网格将仅对应一个实例,多个相邻的掩码通道可以预测同一个实例,最后使用NMS抑制这些冗余掩码。

    4.3. Ablation Experiments

    • Grid number
      在MS COCO上,S = 12已经可以达到27.2 AP。
      将网格数提高到24时,SOLO获得29.0 AP。此结果表明,我们的单比例SOLO可适用于对象比例变化不大的某些场景

    • Multi-level Prediction

      单尺度SOLO在分割多尺度实例方面遇到了困难,使用FPN的多级预测可以很大程度上解决此问题,获得了35.8 AP,分割效果的所有指标均得到了很大的改善。

    • CoordConv

      标准卷积可以在某种程度上具有空间变异性,两个或多个CoordConv无法带来明显的改善。
      这表明单个CoordConv已经使预测对空间变体/位置敏感。

    • Loss function

      Focal Loss比BCE要好,因为实例掩码的大多数像素都在背景中,而FL可通过减少分类良好的样本的损失来减轻样本不平衡问题。但DL最好,而无需手动调整损耗超参数。

      通过仔细调整平衡超参数并引入其他训练技巧,可以大大改善BCE和FL的结果。
      但是,这里的要点是,DL使训练通常变得更加稳定,并且在不使用大量启发式方法的情况下更有可能获得良好的效果。

      • BCE
        • 正样本的掩码损失权重设置为10,将像素权重设置为2
      • FL
        • 掩码损失权重设置为20
      • DL
        Dice Loss可将像素视为一个整体,并可以自动在前景像素和背景像素之间建立适当的平衡。

    4.4. SOLO-512

    较小SOLO版本,输入分辨率较小,旨在加快推理速度。SOLO-512和SOLO之间的其他训练和测试参数相同。

    34.2 mask AP,SOLO-512达到了22.5 FPS的模型推断速度

    5. Decoupled SOLO

    • output space is decreased from H×W×(S^2) to H×W×2S
    • 表7所示,Decoupled SOLO的性能与普通SOLO相同,由于输出空间大大减少,因此在训练和测试期间,Decoupled SOLO需要的GPU内存要少得多。

    6. 错误分析

    表8,对于每个预测的二进制掩码,我们用标注计算IoU,然后用最重叠的标注替换。

    • SOLO AP:37.1
    • Ground Truth AP:68.1

    7. SOLO for 实例轮廓检测

    • 改变掩码预测分支的优化目标
    • 使用OpenCV的findContours函数将COCO中的标注转换为实例轮廓,然后使用该轮廓优化掩码分支。
      使用Focal Loss来优化轮廓检测,其他设置与实例分割基线相同。

    8. 结论

    • 与Mask R-CNN相比,具有竞争优势。
    • 端到端可训练,以恒定推理时间将输入图像直接映射到所需的实例掩码。
    • 首次引入“实例类别”这一新概念,将实例分割变为为简单的分类任务,从而比所有当前方法都更加简单。

    作者:@臭咸鱼

    转载请注明出处:https://www.cnblogs.com/chouxianyu/

    欢迎讨论和交流!


  • 相关阅读:
    Android客户端消息推送原理简介
    优秀程序员的十个习惯
    能让你成为更优秀程序员的10个C语言资源
    成大事必备9种能力、9种手段、9种心态
    33个优秀的HTML5应用演示 (转)
    Maven学习:Eclipse使用maven构建web项目(转)
    使用fiddler模拟http get
    TLS握手
    风暴英雄 http 302重定向 正在等待游戏模式下载完成
    page template in kentico
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/13513462.html
Copyright © 2011-2022 走看看