CLIPSeg:一个使用文本和图像prompt能同时作三个分割任务的模型

Image Segmentation Using Text and Image Prompts (CVPR 2022).

论文地址:https://arxiv.org/abs/2112.10003

代码地址:https://github.com/timojl/clipseg

图像分割通常是通过为一组固定的对象类训练模型来解决的。之后合并其他类或更复杂的查询是昂贵的,因为它需要在包含这些表达式的数据集上重新训练模型。在本文中,作者提出了一个可以在测试时根据任意prompt生成图像分割的系统。prompt可以是文本或图像。这种方法使模型能够为三个常见的分割任务创建一个统一的模型(只训练一次),这些任务具有不同的挑战:引用表达式分割、zero-shot分割和one-shot分割。本文以 CLIP 模型为骨干,使用基于Transformer的解码器进行扩展,以实现密集预测。在对 PhraseCut 数据集的扩展版本进行训练后,本文的系统会根据自由文本prompt或表达查询的附加图像为图像生成二进制分割图。这种新颖的混合输入不仅可以动态适应上述三个分割任务,还可以适应任何可以制定文本或图像查询的二进制分割任务。最后,作者发现本文的系统能够很好地适应通用查询。

图像分割需要一个模型来输出每个像素的预测。与图像分类相比,分割不仅需要预测可以看到的内容,还需要预测可以找到的位置。经典语义分割模型仅限于分割训练集中的类别。目前,已经出现了不同的方法来扩展这种相当受限的设置:

1)在广义的zero-shot分割中,需要通过将未见类别与已见类别相关联来分割已见和未见类别。

2)在one-shot分割中,除了要分割的查询图像之外,还以图像的形式提供所需的类。

3)在引用表达式分割(RES)中,模型在复杂的文本查询上进行训练,但在训练期间可以看到所有类(即没有对未见过的类进行泛化)。

在这项工作中,作者引入了 CLIPSeg 模型(如上图),该模型能够基于任意文本查询或图像进行分割。 CLIPSeg 可以解决上述所有三个任务。这种多模态输入格式超越了现有的多任务基准,例如 Visual Decathlon,其中输入始终以图像的形式提供。为了实现这个系统,作者使用预训练的 CLIP 模型作为主干,并在顶部训练一个轻量的条件分割层(解码器)。作者使用CLIP 的联合文本-视觉嵌入空间来调节本文的模型,这使模型能够处理文本形式的prompt以及图像。本文的想法是教解码器将 CLIP 内的激活与输出分割相关联,同时允许尽可能少的数据集偏差并保持 CLIP 的出色和广泛的预测能力。

本文采用通用的二进制预测设置,其中与prompt匹配的前景必须与背景区分开来。这种二进制设置可以适应Pascal zero-shot分割所需的多标签预测。虽然本文工作的重点是建设一个通用模型,作者发现 CLIPSeg 在三个low-shot分割任务中实现了竞争性能。此外,它能够泛化到它从未见过分割的类和表达式。

本文的主要技术贡献是 CLIPSeg 模型,它通过提出一种基于Transformer的轻量级解码器,扩展了著名的 CLIP Transformer用于zero-shot和one-shot分割任务。该模型的一个关键新颖之处在于分割目标可以通过不同的方式指定:通过文本或图像。这使模型能够为多个基准训练一个统一的模型。对于基于文本的查询,与在 PhraseCut 上训练的网络不同,本文的模型能够泛化到涉及看不见的单词的新查询。对于基于图像的查询,作者探索了各种形式的视觉prompt 工程——类似于语言建模中的文本prompt 工程。

方法

作者使用基于视觉Transformer的 (ViT-B/16) CLIP模型作为主干,并使用小型、参数高效的Transformer解码器对其进行扩展。解码器在自定义数据集上进行训练以执行分割,而 CLIP 编码器保持冻结状态。一个关键的挑战是避免在分割训练期间对预测施加强烈的bias并保持 CLIP 的多功能性。

考虑到这些需求,作者提出了 CLIPSeg:一个简单的、纯基于Transformer的解码器。当查询图像通过 CLIP 视觉Transformer时,某些层 S 的激活被读取并投影到解码器的token嵌入大小 D。然后,这些提取的激活(包括 CLS  token)在每个Transformer之前添加到解码器的内部激活中。

解码器具有与提取的 CLIP 激活一样多的Transformer块。解码器通过在其Transformer(最后一层) 的token上应用线性投影来生成二进制分割,其中 P 是 CLIP 的patch大小。为了告知解码器分割目标,作者使用 FiLM通过条件向量调制解码器的输入激活。

这个条件向量可以通过两种方式获得:(1) 使用文本查询的 CLIP 文本Transformer嵌入和 (2) 在特征工程prompt图像上使用 CLIP 视觉Transformer。CLIP 本身没有经过训练,仅用作冻结特征提取器。由于紧凑的解码器,对于 D = 64,CLIPSeg 只有 1,122,305 个可训练参数。

由于学习到的位置嵌入,原始 CLIP 被限制为固定的图像大小。本文通过插入位置嵌入来启用不同的图像大小(包括更大的图像)。为了验证这种方法的可行性,作者比较了不同图像尺寸的预测质量,发现对于大于 350 像素的图像,ViT-B/16 的性能只会降低。

在本文的实验中,作者使用 CLIP ViT-B/16,patch大小 P 为 16,如果没有另外说明,则使用 D = 64 的投影尺寸。作者在 S = [3 , 7 , 9] 层提取 CLIP 激活,因此本文的解码器只有三层。

模型通过条件向量接收有关分割目标的信息(“要分割什么?”),这可以通过文本或图像(通过视觉prompt工程)提供。由于 CLIP 为图像和文本标题使用共享嵌入空间,可以在嵌入空间和插值向量上的条件之间进行插值。形式上,设是支持图像的嵌入,是样本 i 的文本嵌入,作者通过线性插值获得条件向量 ,其中 a 是从[0 , 1]均匀采样 。作者在训练期间使用这种随机插值作为数据增强策略。

1 PhraseCut + Visual prompts (PC+)

本文使用 PhraseCut 数据集,其中包含超过 340,000 个具有相应图像分割的短语。最初,该数据集不包含视觉支持,而仅包含短语,并且每个短语都存在相应的对象。作者以两种方式扩展这个数据集:视觉支持样本和负样本。为了为prompt p 添加视觉支持图像,作者从共享prompt p 的所有样本的集合Sp中随机抽取。

此外,作者将负样本引入数据集,即没有对象与prompt匹配的样本。为此,样本的短语被替换为概率为qneg的不同短语。短语使用一组固定前缀随机扩充。在考虑到对象位置的情况下,作者在图像上应用随机裁剪,确保对象至少部分可见。在本文的其余部分,将此扩展数据集称为 PhraseCut+(缩写为 PC+)。与仅使用文本来指定目标的原始 PhraseCut 数据集相比,PC+ 支持使用图像-文本插值进行训练。这样,本文可以训练一个对文本和视觉输入进行操作的联合模型。

2 Visual Prompt Engineering

在传统的基于 CNN 的one-shot语义分割中,masked pooling 已成为计算用于条件的原型向量的标准技术。提供的支持mask被下采样并与来自 CNN 沿空间维度的后期特征图相乘,然后沿空间维度汇集。这样,只有与支持对象有关的特征才被考虑在原型向量中。

这种方法不能直接应用于基于Transformer的架构,因为语义信息也在整个层次结构中的 CLS  token中积累,而不仅仅是在特征图中。绕过 CLS  token并直接从特征图的masked pooling中导出条件向量也是不可能的,因为它会破坏文本嵌入和 CLIP 视觉嵌入之间的兼容性。

为了更多地了解如何将目标信息整合到 CLIP 中,作者在一个没有分割的简单实验中比较了几个变体及其混杂效应。作者考虑视觉和基于文本的嵌入之间的余弦距离(对齐),并使用原始 CLIP 权重而无需任何额外的训练。


具体来说,作者使用 CLIP 来计算对应于图像中对象名称的文本嵌入ti。然后,将它们与原始图像的视觉嵌入s0和使用修改后的 RGB 图像或注意力mask突出显示目标对象的视觉嵌入sh进行比较。通过对对齐向量[sht0,sht1,…]进行softmax,获得了如上图所示的分布。

对于定量分数,作者只考虑目标对象名称嵌入t0,希望它与突出显示的图像嵌入sh比与原始图像嵌入s0具有更强的对齐。这意味着,如果突出显示技术改进了对齐方式,则对象概率的增加应该很大。作者基于LVIS 数据集进行分析,因为它的图像包含多个对象和一组丰富的类别。

CLIP-Based Masking


直接等效于视觉Transformer中的masked pooling是将mask应用于token。通常,视觉Transformer由一组固定的token组成,这些token可以通过多头注意力在每一层进行交互:用于读取的 CLS  token和最初从图像patch中获得的与图像区域相关的token。

现在,可以通过将一个或多个Transformer层的交互约束到mask内patch token以及仅 CLS  token来合并mask。上表(左)表明这种引入mask的形式效果不佳。通过限制与 CLS token的交互(上表 左,顶部两行),仅实现了小的改进,而限制所有交互会显着降低性能。由此得出结论,在内部结合图像和mask需要更复杂的策略。

Visual Prompt Engineering

除了在模型中应用mask,还可以将mask和图像组合成一个新图像,然后由视觉Transformer处理。类似于 NLP 中的prompt工程(例如在 GPT-3 中),作者将此过程称为视觉prompt工程。由于这种形式的prompt设计是新颖的,并且在这种情况下表现最好的策略是未知的,作者对设计视觉prompt的不同变体进行了广泛的评估。

发现mask和图像如何组合的确切形式非常重要。作者确定了三种图像操作来改善对象文本prompt和图像之间的对齐:降低背景亮度、模糊背景(使用高斯滤波器)和裁剪到对象。所有三者的组合表现最好。因此在其余部分,将使用这个变体。

实验


上表展示了在原始 PhraseCut 数据集上评估referring expression segmentation(RES)的性能对比。

在广义zero-shot分割中,测试图像除了包含已知类别外,还包含以前从未见过的类别。作者使用 Pascal-VOC 基准评估模型的zero-shot分割性能,性能如上表。

在 Pascal-5i 上,本文的通用模型 CLIPSeg (PC+) 在最先进的方法中实现了具有竞争力的性能,只有最近的 HSNet 表现更好。COCO-20i 上的结果表明 CLIPSeg 在除 PhraseCut(+) 之外的其他数据集上训练时也能很好地工作。

上图展示了CLIPSeg(PC+)对各种prompt的定性预测,深色表示预测强度。

从上表中,可以发现在 PC+ 上训练的 CLIPSeg 版本的性能优于 CLIP-Deconv baseline和在 L VIS 上训练的版本,后者仅包含对象标签而不是复杂的短语。这一结果表明,数据集的可变性和模型的复杂性都是泛化所必需的。

为了确定 CLIPSeg 性能的关键因素,作者对 PhraseCut 进行了消融研究。,如上表所示,作者分别评估基于文本和基于视觉prompt的性能以获得完整的图片。当使用随机权重而不是 CLIP 权重时(“无 CLIP 预训练”),基于文本的性能和视觉性能都会下降。当参数数量减少到 16 个(“D = 16”)时,性能大幅下降,这表明解码器中信息处理的重要性。使用不利的视觉prompt技术会降低视觉输入的性能。

SegFix: Model-Agnostic Boundary Refinement for Segmentation

paper:https://arxiv.org/abs/2007.04269

code:https://github.com/openseg-group/openseg.pytorch

本文提出了一种模型无关的后处理方案,即用内部像素的预测代替原来不可靠的边界像素预测,以提高由任何现有分割模型生成的分割结果的边界质量。该方法仅对输入图像进行两步处理:(i)定位边界像素;(ii)识别每个边界像素对应的内部像素(通过学习从边界像素到内部像素的方向来建立对应关系)。

该方法不需要先验信息的分割模型,达到接近实时的速度。实验验证,SegFix减少了cityspace数据集中各种先进模型(ADE20K和GTA5)所生成的分割结果的边界误差。

动机:现有的分割模型大多不能很好地处理边界上的误差预测。作者对比了三个模型的直方图误差,如图1(错误像素数到物体边缘的距离的统计)可以看到,距离边界越远的像素越有可能被很好地分类,并且有很多误差分布在沿边界约为5像素的范围内。

图1

提出了一种新方法来学习边界像素和内部像素的对应关系,即提出了一种新的模型无关的后处理方法来减少边缘误差,即用对应的内部像素的标签代替边缘像素的标签。使用边界映射和方向映射隐式编码边界像素的相对距离信息,偏移映射可以直接应用于各种方法,而不需要进行任何再训练。

主要包括2步:第一步是定位边界像素,第二步是找出每一个边界像素所关联的内部像素。我们采用一个向量去表示每个边界像素跟其对应内部像素的对应关系,这个向量从边界像素出发,指向一个内部像素。

1)首先要先确定物体边界:用卷积来预测一个binary mask来表示边界。1表示边界,0表示other
2)学习一个从边界pixel到内(外)部pixel的方向
3)让边界pixel沿着这个方向移动特定的距离即可确定该边界pixel。

训练阶段,我们首先将图像输入到主干网络中来预测特征图,然后应用边界分支预测二值边界图和应用方向分支预测方向图,我们将边界损失和方向损失分别应用到预测的边界图和方向图上。在测试阶段,我们首先将模型执行到图像上,以生成偏移量映射,然后根据偏移量图对现有方法的分割结果进行细化。

 边缘预测分支

边界分支实现为1×1conv→BN→ReLU,输出通道256个。然后我们应用线性分类器和上采样预测,生成最终的边界图B;训练时由真值boundary map监督约束,使用二值交叉熵损失作为边界损失,学习良好的边缘检测。

 方向预测分支

边界分支实现为1×1conv→BN→ReLU,输出通道256个。然后我们应用线性分类器和上采样预测,生成最终的方向图D;预测所有位置的像素与之最近的同类像素的方向,这里的方向不是连续的,而是对[0,2π)量化成m个值后的结果;

训练时使用真值direction map监督该分支生成的离散方向,使用多分类交叉熵损失(standard category-wise cross-entropy loss)来作为方向预测损失。

offset branch

用来转换预测得到的D(已经乘过了B )到坐标偏移图offset_map:不同的方向会被映射到不同的坐标偏移值。重新对现有方法在边界区域的预测结果进行调整。

最终通过坐标映射(the grid-sample scheme [Spatial transformer networks]),重新对现有方法在边界区域的预测结果进行调整。基于偏移映射对粗略标记图进行细化。用不同的箭头表示不同的偏移向量。在粗略标签图中红色标记错误位置,在精确标签图中箭头方向标记相应的修正位置。

  真值生成和分析

先从ground-truth分割图生成distance map,再在此基础上生成boundary map和direction map,过程如图3(b)。

(1)    distance map

对于每个像素而言,distance map上都记录了它相距属于其他类别像素的最小欧式距离。这实际上也表示了像素到边界的距离。

首先将真值mask分解成K个binary map (0 or 1),每个map关联着不同的类别(语义类别、实例类别),K表示图像中包含的类别数量。之后在每个binary map上独立计算distance map,这里使用了scipy的函数scipy.ndimage.morphology.distance_transform_edt() 。这个函数用于距离转换,计算图像中非零点到最近背景点(即0)的距离。它被用在每个类别独立的binary mask上,正好计算的就是相距于其他类别(每个binary mask上的0表示的就是“其他类别”)的最小欧氏距离。

计算完各个mask后,再计算一个融合的distance map来实现对于所有的K个distance map的集成。

(2)    boundary map

使用融合后的distance map,对其使用一个预设的阈值进行划分,小于阈值的作为边界区域的像素,大于阈值的认为在特定目标区域内部。因为距离值越小,说明越接近边界。

(3)    direction map

这里在未合并的K层distance map上,分别使用9×9的Sobel滤波器。基于Sobel滤波器的方向是在[0°,360°)内,并且每个像素位置的方向都指向邻域内部距离目标边界最远的像素。整个方向范围被均匀划分成m=8类,然后每个像素的方向被赋值成对应的方向类别

  实验结果

backboneHRNet、DeepLab V3等。

数据集:Cityscapes and GTA5

参数设置:初始学习率为0.04,权值衰减为0.0005,裁剪大小为512×512,批量大小为16,并训练80K次迭代。0.9的“poly”学习率策略。

数据增强:随机水平翻转、随机裁剪和随机亮度抖动。

评价指标:mask F-score and top-1 direction accuracy 对预测的二值边界图进行mask F-score,对预测的方向图进行方向精度评定。

定量评价:用mIoU分类度量区域分割的整体性能边界;F-score用于测量距离上有小松弛的预测掩模的边界质量。

语义分割任务
实例分割任务

计算机图形学——网格

网格有多种,三角形,四边形或者其他的多边形。但是目前使用最多的,也是本文着重介绍的是三角网格。三角网格是计算机中表示三维模型最重要的方法。这篇文章主要介绍一下网格的相关概念以及技术算法。

定义

网格就是使用多边形来表示物体的表面。一个网格模型的描述之前也说到过,它包含一系列的面片和顶点。

面片F=(f1,…,fn)F=(f1,…,fn),对于三角网格,每个面片都是三角形。

顶点V=(v1,…,vm)V=(v1,…,vm)。其中,每个面片又是由3个顶点构成的三角形,因此:fi=(vi1,vi2,vi3);vi1,vi2,vi3∈V.fi=(vi1,vi2,vi3);vi1,vi2,vi3∈V.

网格的由来

计算机生成的三维模型和实际获取的数据表示模式是不同的。计算机生成的模型可能是平滑曲线曲面,而实际获取的数据,如激光扫描得到的,一般都是以点云的形式存在。图形学中需要一个统一的表示方式,同时要求视觉精度和处理速度都在可以接受的范围内。于是就选择了网格,用多边形来近似曲面,三角网格最为简单高效,再加上图形硬件的快速发展,三角网格和光栅化已经可以嵌入到硬件中去渲染。

三维数据的来源

一般来说,获取三维模型数据的方法有多种。我们可以直接在几何文件中输入,也可以通过程序创建,比较高级的建模软件有3Ds/max,maya等。第二种就是通过激光扫描,结构光技术等等获取深度,得到点云模型。也有一些别的方法,如SFM,从多视图(多张照片)中构建三维模型。

三维模型又可以分为实体模型和表面模型。

  • 实体模型,多用于CAD领域,通常强调对应实际工业生产中的加工过程,如切割,钻孔等。它是实心的而非空心,在显示过程中需要考虑很多的东西,占用内存较大,因此不利于显示。
  • 表面模型,我们平时见到的模型多是表面模型,只考虑物体的表面细节并直接进行处理,这种模型易于显示。

网格化

网格化是指将模型(点云,多边形等等)分割称为更容易处理的图元,如凸多边形,三角形或者四边形。如果分割成三角形,被称为三角化。我们先看看2D网格化,而3D空间中的网格化也和2D中类似。

如上图,最左侧的多边形不能被称作网格化,第二个是凸多边形网格化,第三个是三角化,最右侧是被均匀分割。

这里介绍两个三角网格化的非常简单的算法。

  • 基本的网格化算法

给定多边形,检验其任意两个顶点之间的线段是否与该多边形的边相交或者部分重叠。如果是,则不能用于分割三角形,否则,用该线段来将多边形分成两个多边形,对每个部分继续上述算法。

  • 割耳(ear clipping)算法

首先找到多边形的ear:查看所有具有顶点序列i,i+1,i+2(modn)i,i+1,i+2(modn)的三角形,称这个三角形为顶点为i+1i+1的三角形,检查线段i,i2i,i2是不是没有与任何边相交。如果是,则这个三角形构成一个ear,去掉该ear,检查顶点ii和i+2i+2处的三角形是不是构成ear。重复上述过程。这个算法每次都会分出一个新的三角形。

上述两种算法对凹多边形进行三角化,会使得其变成凸多边形的样子。原本不是面的部分由于三角化而多了面片。

除此之外,我们还需要注意一种特殊的情况叫T型顶点:

它最常出现在网格细分或者网格简化过程中,使得一个顶点出现在了某个面片的边上。理论上这个点是完全在边上,但是实际渲染中顶点的位置可能不会那么精确。当一个模型中有T顶点存在,一些算法可能会失败。

网格简化

网格的简化有很多好处。比如当前我做的项目中,就需要网格简化来节省内存。同时,网格简化还有很多好处。

  • 减少几何冗余:如果一个具有很多共面小三角形的平坦区域,可以将这些小三角形合并成大的多边形来降低模型复杂度。
  • 减小模型大小
  • 提高运行性能

而且有时候,对于网格的简化,并不会引起多大的感官差异,例如我们可以对较远的场景进行网格简https://www.baidu.com/baidu?wd=163&tn=ubuntuu_cb&ie=utf-8的东西看不清,复杂的网格和简化之后的网格差别不大。这也是当前很多游戏能实时运行的一个重要的技术,叫做生成场景中物体的层次细分。

拓扑结构

拓扑结构指的是多边形网格的连接结构。有一些专业术语需要了解一下,对于网格简化,细分等会用到。

  • 亏格(genus)
    亏格指的是网格表面孔洞的数目。如下:
  • 面片,边或顶点的拓扑结构,指相邻元素的局部连接关系。如下图:

临界边只接一个三角形, 普通边接两个三角形, 奇异边接三个三角形。对于没有临界边的网格称为closed mesh。

  • 二维流形(2-manifold)

二维流行网格定义如下:

  1. 一条网格边为一个或两个网格三角面片共享;
  2. 一个网格顶点的一环邻域三角片构成一个闭合或者开放的扇面。

看上去不好理解,看图片就比较好明白。

非流形网格:

流形网格:

很显然,流形网格只包含临界边和普通边。

网格简化的方法有很多,但是不外乎是下面四种的改进或者组合。

  • 采样(sample)。很好理解,简单的选取模型表面上的点进行几何采样,编程较为复杂。这种方法对高频特征难以精确采样,通常在没有尖角的光滑表面上能取得最好的效果。
  • 自适应细分(adaptive subdivision)通过寻找一个可以递归细分逼近最初模型的基网格,该算法在基模型容易获取的情况下能取到很好的效果,但是它会保持表面拓扑细节,因此对模型进行大规模简化的能力不足。
  • 去除(decimation)。去除方法迭代地去除网格上的顶点或者面片,并三角化每次去除后的空洞。这类方法比较简单,易于编程实现而且运行效率也较高,且通常保持原有的亏格,尤其适用于处理像共面多边形这种冗余的几何。
  • 顶点合并(vertex merging)。顶点合并一般将多个顶点合并成一个顶点,该算法也比较好实现,但是需要采用多种技术来确定哪些点被合并以及合并次序。
    有一个例子是边坍塌算法,将共边的两个顶点合并为一个点,该算法通常保持局部拓扑,但也允许修改拓扑。

细分

网格的细分和简化相反。对于一个给定的原始网格,通过网格细分产生更光滑的效果。细分广泛应用于电影行业,实际上算法提出者之一Catmull还是皮克斯和迪士尼的总裁。

下面是几个细分的例子:

一维细分,原本是4个点的线段,通过向中间插入点得到下一张图,不断迭代得到圆滑曲线。

三维网格细分,根据特定细分规则,每次细分每一个三角形被细分成4个小的三角形。

细分可以看做是一个两阶段过程,最初的网格被称为控制网格。

  1. 细化阶段,创建新的顶点并与先前顶点相连,产生新的更小的三角形
  2. 平滑阶段,计算新顶点的位置

这两步的细节决定了不同的细分方案,在第一步中一个三角形可以以不同的形式进行分割,第二部新顶点的位置可以以不同的方式插值产生。

Loop细分

Loop细分是第一个基于三角网格的细分方案。它更新每个已有的顶点,并对每条边创建一个新的顶点,这样每个三角形被分割成4个新的三角形。经过n步细分,一个三角形被分割成4n4n个三角形。

下图为一个loop细分的例子,新的顶点以黑色显示。

为了更好说明Loop细分的步骤

下图中左侧给出了第二个公式的相关点,右侧给出了第一个公式的相关点:

β是n的函数

√3细分

另外有一种细分方法,被称为3–√3细分。和Loop细分不同的地方在于,Loop把每个三角形划分成4个三角形,而3–√3细分把每个三角形细分成3个三角形。这意味着新增加的顶点在原三角形内部。不过,很明显内部点直接与各个点连线构成的三角形很奇怪,如下图中的第二张。而3–√3在连线之后,会做一个边翻转,把原来的边删掉,而连接新的顶点的作为边,像是把原来的边进行了一个翻转,如下图中最后一张:

DenseCLIP:CVPR2022 用文本指导图像分割

代码链接:https://github.com/raoyongming/DenseCLIP

论文链接:https://arxiv.org/abs/2112.01518

最近的研究表明,使用对比图像文本对进行大规模的预训练可能是从自然语言监督中学习高质量视觉表示的有前途的方法。得益于更广泛的监督来源,这一新范式在下游分类任务和可迁移性方面展现出了不错的结果。

然而,将从图像-文本对中学习到的知识转移到更复杂的密集预测任务的问题几乎没有被研究在这项工作中,作者通过隐式和显式地利用CLIP的预训练的知识,提出了一个新的密集预测框架。

具体而言,作者将CLIP中的原始图像-文本匹配问题 转换为像素-文本匹配问题 ,并使用像素-文本得分图来指导密集预测模型的学习。通过进一步使用来自图像的上下文信息来提示语言模型,能够促进模型更好地利用预训练的知识。

本文的方法与模型无关,可以应用于任意密集预测模型和各种预训练的视觉主干,包括CLIP模型和ImageNet预训练的模型。广泛的实验证明了本文的方法在语义分割,目标检测和实例分割任务上的卓越性能。

在本文中,作者研究了如何将预训练的CLIP模型迁移到密集的预测任务 。与传统的ImageNet预训练模型相比,一个明显的挑战是上游对比预训练任务和下游像素预测任务之间的差距,前者涉及图像和文本的实例级表示,而后者仅基于像素级别的视觉信息。

为了解决这个问题,作者提出了一个新的语言指导的密集预测框架,名为DenseCLIP

如上图所示,它是通过隐式和显式地利用来自CLIP模型的预训练的知识而为各种密集预测任务而设计的。利用预训练的知识的一种隐式方法是直接微调下游数据集上的模型。结果表明,通过对超参数进行一些修改,CLIP模型可以优于传统的ImageNet预训练模型(如下图所示)。

但是直接的方法不能充分利用CLIP模型的潜力。受CLIP中的原始对比学习框架的启发,作者提出将CLIP中的原始图像-文本匹配问题转换为像素-文本匹配问题,并使用像素-文本得分图来明确地指导密集预测模型的学习

通过进一步使用图像中的上下文信息,使用Transformer模块来提示语言模型,能够通过优化文本嵌入,使模型更好地利用预训练的知识。

Preliminaries: Overview of CLIP

CLIP由两个编码器组成,包括一个图像编码器 (ResNet或ViT) 和一个文本编码器 (Transformer)。CLIP的目标是通过对比目标在预训练期间对齐视觉和语言的嵌入空间。

为了学习更多可迁移的预训练知识,CLIP收集4亿图像-文本对进行模型训练。迁移CLIP的知识,对于下游分类任务,一种简单但有效的方法是基于模板(如“a photo of a [CLS]”)构建一组文本提示,其中[CLS]可以替换为实际的类名。

然后给定一个图像,可以使用CLIP来计算图像和嵌入空间中的文本提示之间的相似性,并且得分最高的类被视为最终预测。最近,一些作品已经表明CLIP可以通过很少的样本获得强大的分类性能。因此,这就出现了一个有趣的问题: CLIP强大的能力是否可以迁移到像密集预测这样更复杂的视觉任务中?

但是,这种扩展是不容易的。首先,如何在密集预测任务中利用视觉语言预训练模型是一个几乎没有被研究的问题。尽管一种简单的解决方案是仅像预训练的2D主干一样使用图像编码器,但作者认为文本编码器中包含的语言先验也非常重要

其次,由于上游对比预训练任务与下游每像素预测任务之间存在巨大差距,因此将知识从CLIP转移到密集预测更加困难 ,前者考虑图像和文本的实例级表示,后者仅基于视觉信息,但需要像素级输出。

Language-Guided Dense Prediction

为了解决上述问题,作者提出了本文的语言指导的密集预测框架,该框架可以更好地利用CLIP预训练模型中的语言先验。本文的模型结构如上图所示。作者发现,除了全局图像特征之外,还可以从CLIP图像编码器的最后一层中提取语言兼容的特征图。

为了说明这一点,下面首先详细描述CLIP图像编码器的结构。以ResNet 编码器为例,总共有4个阶段,将特征图表示为。与原始的ResNet不同,CLIP添加了一个注意力池化层。

具体而言,CLIP首先对执行全局平均池化,以获得全局特征 ,其中是从主干网络第4阶段开始的特征图的高度,宽度和通道数。然后将concat的特征输入到多头自注意层(MHSA) 中:

在CLIP的标准训练过程中,全局特征用作图像编码器的输出,而其他输出通常被忽略。然而,作者发现z有两个有趣的特性:

1)z仍然保留了足够的空间信息,因此可以用作特征图

2)因为MHSA对每个输入元素都是对称的,所以z可能和 相似 。根据以上观察结果,作者可以将z用作语言兼容的特征图。

为了获得文本特征,可以从模板“a photo of a [CLS].”中构造文本提示使用K类名称,并使用CLIP文本编码器将特征提取。然后,使用语言兼容的特征图z和文本特征t通过以下方式计算像素文本得分图

其中和是沿通道维度的z和t的l2归一化版本。得分图表示了像素文本匹配的结果,这是本文框架中最关键的要素之一。首先,可以将分数图视为具有较低分辨率的分割结果,因此可以使用它们来计算辅助分割损失。

其次,将分数映射concat到最后一个特征映射,以显式地合并语言先验,即。本文的框架是与模型无关的,因为修改的特征图可以像往常一样直接用于分割或检测。

Context-Aware Prompting

先前的研究已经证明,减少视觉或语言领域的差距可以显着提高CLIP模型在下游任务中的性能。因此,作者寻求其他方法来改进文本特征t,而不是使用人类预先定义的模板。

Language-domain prompting

与原始CLIP不同,原始CLIP使用人工设计的模板,如“a photo of a [CLS]”。CoOp引入了可学习的文本上下文,通过使用反向传播直接优化上下文,在下游任务中实现更好的可迁移性。受CoOp的启发,作者还在框架中使用可学习的文本上下文作为baseline,其中仅包括语言域提示。文本编码器的输入变为:

其中是可学习的文本上下文,而是第k类名称的嵌入。

Vision-to-language prompting

包括视觉上下文的描述可以使文本更加准确。例如,“a photo of a cat in the grass.”比“a photo of a cat.”更准确。因此,作者研究了如何使用视觉上下文来重新提取文本特征。通常可以使用Transformer decoder中的交叉注意机制来建模视觉和语言之间的相互作用。

作者提出了两种不同的上下文感知提示策略,如上图所示。作者考虑的第一个策略是pre-model prompting 。将特征传递给Transformer解码器以编码视觉上下文

其中是一组可学习的查询,而是提取的视觉上下文。

另一种选择是在文本编码器之后重新定义文本特征,即post-model prompting 。在此变体中,作者使用CoOp生成文本特征,并直接将其用作Transformer解码器的查询

尽管这两个变体的目标是相同的,但作者认为post-model prompting更好 ,主要有两个原因:

1)模型后提示是高效的。由于文本编码器的输入依赖于图像,因此在推理过程中,预模型提示需要额外的文本编码器前向传递。在后模型提示的情况下,可以存储训练后提取的文本特征,从而减少文本编码器在推理过程中带来的开销。

2) 实验结果表明,模型后提示可以比模型前提示获得更好的性能。

Improved DDPM

作者:Alex Nichol*, Prafulla Dhariwal*

关键词:diffusion model, fast sampling

论文:Improved Denoising Diffusion Probabilistic Models

知乎:https://zhuanlan.zhihu.com/p/557971459

摘要

去噪扩散概率模型(DDPM)是一类生成模型,最近已被证明能产生良好的样本。我们表明,通过一些简单的修改,DDPM也可以在保持高样本质量的同时实现具有竞争力的对数似然。此外,我们发现,反向扩散过程的学习方差允许以数量级更少的正向传递进行采样,样本质量差异可以忽略,这对于这些模型的实际部署非常重要。我们还使用精度和重新调用来比较DDPM和GANs覆盖目标分布的程度。最后,我们表明,这些模型的样本质量和似然性随模型容量和训练计算而平滑扩展,使其易于扩展。

贡献

  • 噪声机制更新,使用cosine
  • 引入了方差项的学习

方差学习

faster sampling

DDPM是一步一步的往上采样,这里有一个strided sampling schedule,也就是每次网上采样100步,参数都没变化。

Paper List

  1. (DDPM) Denoising Diffusion Probabilistic Models. NIPS 20. (Diffusion and deep-learning-based 图像生成开山之作)
  2. More Control for Free! Image Synthesis with Semantic Diffusion Guidance. arXiv 21. (对DDIM进行了推广,引入了一般形式的判别器引导)
  3. Denoising Diffusion Implicit Models. ICLR 21. (提出了一种新的sampling的方法,可以通过改变eta来skip一些step,进而达到加速sampling的目的)
  4. Improved denoising diffusion probabilistic models. ICML 21.
  5. Classifier-Free Diffusion Guidance. NIPSW 21. (引入了等价结构替代了分类器引导)
  6. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models. ICML 22.
  7. Hierarchical Text-Conditional Image Generation with CLIP Latents. NIPS 22 在投. (DALL-E 2)
  8. Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding. NIPS 22 在投. (Imagen, SOTA)
  9. High-Resolution Image Synthesis with Latent Diffusion Models. CVPR 22. (隐空间LDM)

基于扩散模型的语义分割

论文标题:LABEL-EFFICIENT SEMANTIC SEGMENTATION WITH DIFFUSION MODELS

论文地址:https://arxiv.org/pdf/2112.03126.pdf

论文代码:https://github.com/yandex-research/ddpm-segmentation

摘要

  1. 背景介绍: 去噪扩散概率模型DDPM最近受到了很多研究关注,因为它们优于其他方法,如GAN,并且目前提供了最先进的生成性能。差分融合模型的优异性能使其在修复、超分辨率和语义编辑等应用中成为一个很有吸引力的工具。
  2. 研究方法: 作者为了证明扩散模型也可以作为语义分割的工具,特别是在标记数据稀缺的情况下。对于几个预先训练的扩散模型,作者研究了网络中执行逆扩散过程马尔可夫步骤的中间激活。结果表明这些激活有效地从输入图像中捕获语义信息,并且似乎是分割问题的出色像素级表示。基于这些观察结果,作者描述了一种简单的分割方法,即使只提供了少量的训练图像也可以使用。
  3. 实验结果: 提出的算法在多个数据集上显着优于现有的替代方法。

K-L散度(相对熵)

Kullback-Leibler Divergence,即K-L散度,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵。在概率学和统计学上,我们经常会使用一种更简单的、近似的分布来替代观察数据太复杂的分布。K-L散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息量。

数据的熵

K-L散度源于信息论。信息论主要研究如何量化数据中的信息。最重要的信息度量单位是Entropy,一般用H表示。分布的熵的公式如下:

上面对数没有确定底数,可以是2e10,等等。如果我们使用以2为底的对数计算H值的话,可以把这个值看作是编码信息所需要的最少二进制位个数bits。上面空间蠕虫的例子中,信息指的是根据观察所得的经验分布给出的蠕虫牙齿数量。计算可以得到原始数据概率分布的熵值为3.12 bits。这个值只是告诉我们编码蠕虫牙齿数量概率的信息需要的二进制位bit的位数。

可是熵值并没有给出压缩数据到最小熵值的方法,即如何编码数据才能达到最优(存储空间最优)。优化信息编码是一个非常有意思的主题,但并不是理解K-L散度所必须的。熵的主要作用是告诉我们最优编码信息方案的理论下界(存储空间),以及度量数据的信息量的一种方式。理解了熵,我们就知道有多少信息蕴含在数据之中,现在我们就可以计算当我们用一个带参数的概率分布来近似替代原始数据分布的时候,到底损失了多少信息。

K-L散度度量信息损失

只需要稍加修改熵H的计算公式就能得到K-L散度的计算公式。设p为观察得到的概率分布,q为另一分布来近似p,则pqK-L散度为:

entropy-p-q

显然,根据上面的公式,K-L散度其实是数据的原始分布p和近似分布q之间的对数差值的期望。如果继续用2为底的对数计算,则K-L散度值表示信息损失的二进制位数。下面公式以期望表达K-L散度:

一般,K-L散度以下面的书写方式更常见:

注:log a - log b = log (a/b)

OK,现在我们知道当用一个分布来近似另一个分布时如何计算信息损失量了

散度并非距离

很自然地,一些同学把K-L散度看作是不同分布之间距离的度量。这是不对的,因为从K-L散度的计算公式就可以看出它不符合对称性(距离度量应该满足对称性)。也就是说,用p近似q和用q近似p,二者所损失的信息并不是一样的。

如果你熟悉神经网络,你肯能已经猜到我们接下来要学习的内容。除去神经网络结构的细节信息不谈,整个神经网络模型其实是在构造一个参数数量巨大的函数(百万级,甚至更多),不妨记为f(x),通过设定目标函数,可以训练神经网络逼近非常复杂的真实函数g(x)。训练的关键是要设定目标函数,反馈给神经网络当前的表现如何。训练过程就是不断减小目标函数值的过程。

Occupancy Networks: Learning 3D Reconstruction in Function Space

https://arxiv.org/abs/1812.03828

CVPR2019

code: https://github.com/autonomousvision/occupancy_networks

体素表示的缺点:内存随分辨率呈立方增加,故需要限制在32*32*32或64*64*64。使用例如八叉树的数据自适应表示来降低内存,实现起来又会复杂,现有数据自适应算法依旧局限于相对较小的256*256*256分辨率。

点云表示的缺点:由于缺少底层网格的连接结构,需要额外的后处理来从模型中提取三维几何图形。

网格表示的缺点:现有的网格表示通常基于对一个模板网格的变形,因此不允许任意拓扑。

点云和网格都限制了使用标准前馈网络能可靠预测的点/顶点的数量。

本文贡献:提出了基于对连续三维占据函数进行直接学习的三维重建新方法。利用神经网络gif.latex?f_%7B%5Ctheta%20%7D实现对任意分辨率的占据函数的预测。训练时大大降低了内存,推理时利用简单的多分辨率等值面提取算法从学习的模型中提取网格。

1、介绍了一种基于学习连续三维映射的对三维几何图形的新表示

2、展示了该表示如何用于从多种输入类型中重建三维几何形状

3、实验证明此方法能生成高质量网格且超越目前最优方法

本文提出了一种3D图形的表示方法,并给出了得到他的网络架构和训练方法。用decision boundary (判定边界)来表示物体的表面。这个方法贼好,放在2D类比,就像像素图和矢量图,矢量图是精度是无限的,但又不会耗费额外的内存。

随着深度神经网络的到来,基于学习的三维重建方法逐渐变得流行。但是和图像不同的是,在3D中没有规范的表示,既能高效地进行计算,又能有效地存储,同时还能表示任意拓扑的高分辨率几何图形。很多先进的基于学习的三维重建方法只能表示粗糙的三维几何,或者限制于一个特定的领域。在这篇论文中,作者提出了占用网格,一种新的基于学习的三维重建方法。占位网络隐式地将三维曲面表示为深度神经网络分类器的连续决策边界。与现有方法相比,该表示方式编码了高分辨率的3D输出,并且没有过多的内存占用。同时该方法能够高效地编码三维结构,并且能够从不同种类的输入推断出模型。实验证明,无论是在质量上还是在数量上,对于从单个图像、有噪声的点云和粗糙的离散体素网格进行三维重建,该方法都获得了具有竞争力的结果。

和传统多视图立体几何算法相比,学习模型的方法能够编码3D形状空间中的丰富先验信息,这有助于解决输入的模糊性。生成模型的方法在高分辨率的图像上已经取得了很好的效果,但是还没有复制到3D领域。与2D领域相比,暂时还没有就3D输出表示达成一致,这种表示既能提高内存效率,又能从数据中有效推断。现存的表示方法能够大概分成三类:体素、网格、点云,如下图所示:

体素表示是直接将像素一般化的情况,随着分辨率的提高,这种方法的内存占用将会呈指数增长,因此限制了分辨率。使用适当的损失函数,点云和网格被引入作为深度学习的代替表示。但是点云缺少底层网格的连接结构,从模型中提取3D几何需要额外的过程。现存网格的表示方法大多数是基于一个模板变形,因此不允许任意的拓扑结构。在这篇文章中,作者提出了一种基于直接学习连续三维占用函数的三维重建方法,如上图D所示。和其他方法不同的是,作者用神经网络预测了完全占用函数,它可以在任意分辨率下评估。这篇文章的主要贡献可以分为以下三点:1:介绍了一种基于学习连续三维映射的三维几何表示方法;2:使用此表示法重建各种输入类型的3D几何图形;3:此表示方法能够生成高质量的网格,并且达到先进技术水平。

相关工作

现有的基于学习的三维重建工作可以根据输出表示的不同分为基于体素的、基于点的和基于网格的三种。基于体素:由于其简单性,体素是鉴别和生成3D任务最常用的表示。早期的工作主要集中于使用3D卷积神经网络从一张图像重建三维几何,由于内存限制,分辨率不是很高,如果要达到相对较高的分辨率,需要牺牲网络架构或者减少每次输入的图片数量。其他的工作用体素表示来学习三维形状的生成模型,大多数的模型都是基于变分自动编码器或者生成对抗网络。为了提高分辨率,实现亚体素精度,一些研究人员提出预测截断符号距离字段(TSDF),其中3D网格中的每个点储存截断符号距离到最近的3D表面。然而,与占用表示相比,这种表示通常更难学习,因为网络必须推断出3D空间中的距离函数,而不是仅仅将体素分类为已占用或未占用。而且,这种表示方法的分辨率仍然受到内存的限制。基于点云:三维点云被广泛应用于机器人技术和计算机图形学领域,是一种非常引人注目的三维几何替代表示方法。Fan【1】引入点云作为三维重建的输出表示。然而,与其他表示不同的是,这种方法需要额外的后处理步骤来生成最终的3D网格。基于网格:网格首先被考虑用于区分三维分类或分割任务,在网格的顶点和边跨越的图上应用卷积,最近网格也被应用于三维重建的表示方法。不幸的是,大部分方法倾向于产生自交叉的网格,并且只能产生简单的拓扑结构。与上述方法相比,本文的方法产生了没有自相交的高分辨率封闭表面,并且不需要来自相同对象类的模板网格作为输入。并且使用深度学习来获得更有表现力的表示,可以自然地集成到端到端学习中。

具体一点,一个物体用一个occupancy function 来表示:

在这里插入图片描述

注意,是实数空间,不是离散的按一定分辨率取样的。
然后用一个神经网络来逼近这个函数,给每个实空间的3D点一个0-1之间的占用概率(因此和二分类模型等价)。神经网络 f 输入是一个点和一个几何体的表示(X),输出是一个0-1之间的实数,表示这个点在这个几何体里的概率。
而我们关注的是对象表面的决策边界。根据对物体的观察(如图像、点云等),当使用这样的网络对物体进行三维重建时,必须以输入作为条件。作者使用了下面的简单的功能对等:一个函数,它接受一个观察 x 作为输入,输出一个从点p到R的函数,这可以通过一个函数等价描述:一对(p, x)作为输入和输出一个实数。后一种表示可以用一个神经网络参数化,该神经网络以一对(p,x)作为输入,输出一个表示占用概率的实数:

对不同输入类型的数据,用不同encoder来输入。
单个图像:ResNet
体素:3D CNN
点云:PointNet等

在这里插入图片描述

这就是占用网络。2训练:为了学习神经网络的参数,考虑在对象的三维边界体中随机采样点,对于第i个样本,采样K个点,然后评估这些位置的小批量损失Lb如下所示:

其中xi是B批次的第i个观测值,Oij是点云的真实位置,L是交叉熵损失。该方法的性能取决于用于绘制用于训练的pij位置的采样方案,将在后面详细讨论。这个三维表示方法也可以用于学习概率潜在变量模型,定义损失函数如下:

3推论:为了提取一个新的观测值对应的等值面,作者引入了多分辨率等值面提取算法(MISE),如下图所示。

多分辨率等值面提取(MISE):①以初始分辨率离散化体积空间,给网格中的所有p用网络来评估占据。将大于或等于某阈值的所有网格点p标记为占据(红色圆形),非占据(青色菱形)。阈值是超参数,决定提取的三维表面的厚度。确定所有既含占据又含非占据顶角的体素并标记为动态(红色),如果在当前分辨率应用MC算法,这些是会使网格自相交的体素,将每个动态体素细分成8个子体素;②评估所有由这样细分而引入到占据网格的新的网格点(空心圈)。重复①②直到达到最终目标分辨率。在最终分辨率,利用MC算法提取网格,利用一阶和二阶梯度信息简化和细化输出网格。

首先在给定的分辨率上标记所有已经被评估为被占据(红色圆圈)或未被占据(青色方块)的点。然后确定所有的体素已经占领和未占领的角落,并标记(淡红色),细分为4个亚体素。接下来,评估所有由细分引入的新网格点(空圆)。重复前两个步骤,直到达到所需的输出分辨率。最后使用marching cubes算法【2】提取网格,利用一阶和二阶梯度信息对输出网格进行简化和细化。如果初始分辨率的占用网格包含网格内外各连通部分的点,则算法收敛于正确的网格。因此,采取足够高的初始分辨率来满足这一条件是很重要的。实际上,作者发现在几乎所有情况下,初始分辨率为32的三次方就足够了。通过marching cubes算法提取的初始网格可以进一步细化。在第一步中,使用Fast-Quadric-Mesh-Simplification算法【3】来简化网格。最后,使用一阶和二阶(即梯度)的信息。为了达到这个目标,作者从输出网格的每个面抽取随机点pk进行采样,并将损失最小化:

其中n(pk)为网格在pk处的法向量。4相关细节:作者使用具有5个ResNet块的全连接神经网络实现了占用网络,并使用条件批处理归一化对输入进行条件设置。根据输入的类型使用不同的编码器架构。对于单视图3D重建,使用ResNet18架构。对于点云,使用PointNet编码器。对于体素化输入,使用3D卷积神经网络。对于无条件网格生成,使用PointNet作为编码器网络。更多细节见原文。注:在我看来,这是一个端到端的网络,可以理解成一个GAN网络。前面的全连接神经网络编码输入的图像,预测每一个点被占用的概率,即该3D点是处于模型内部还是在模型的外面。通过采样多个点,我们就可以得到一个决策边界,这个边界就可以近似的理解成模型的外壳,然后通过后面的算法获得更高分辨率的模型。

结果展示:

连续表示(右)和不同分辨率下的体素化(左)的定性比较
上图显示了连续表示(纯橙色线)和网格体素化(蓝线)的IoU,以及两个表示(虚线)所需的每个模型的参数数量。
单幅图像三维重建,输入图像显示在第一列中,其他列显示与不同baselines相比该方法的结果。
真实数据的重建结果

基于点云的三维重建结果比较:

特斯拉 – occupancy network占据网络

视频: https://www.zhihu.com/zvideo/1566362268736200704?playTime=194.2

讲解: https://zhuanlan.zhihu.com/p/572057070

今年Tesla FSD部分,感知网络从去年的Bev感知(Hydranet)的基础上,更近一步,提出了occupancy network.

1. 为什么是occupancy network?

在基于 LiDAR 的系统中,可以根据检测到的反射强度来确定对象的存在,但在相机系统中,必须首先使用神经网络检测对象。如果看到不属于数据集的对象怎么办?比如侧翻的大卡车。仅此一项,就引发了很多事故。

可行驶区域的一些问题

rv、bev (Birds Eye View) 空间下可行驶区域会有一定问题:

  • 地平线的深度不一致,只有2个左右的像素决定了一个大区域的深度。
  • 无法看穿遮挡物,也无法行驶。
  • 提供的结构是 2D的,但世界是 3D 的。
  • 高度方向可能只有一个障碍物(悬垂的检测不到),目前是每类对象设置固定的矩形。
  • 存在未知物体,例如,如果看到不属于数据集的对象。

所以希望有种通用的方式来解决该问题,首先能想到的是bev下的可行驶区域,但相对来说在高度维会比较受限,索性一步到位变成3d空间预测、重建。

2. Occupancy Network

2022 CVPR中,tesla FSD新负责人 Ashok Elluswamy 推出了Occupancy Network。借鉴了机器人领域常用的思想,基于occupancy grid mapping,是一种简单形式的在线3d重建。将世界划分为一系列网格单元,然后定义哪个单元被占用,哪个单元是空闲的。通过预测3d空间中的占据概率来获得一种简单的3维空间表示。关键词是3D、使用占据概率而非检测、多视角。

Occupancy Network

这里输出的并非是对象的确切形状,而是一个近似值,可以理解为因为算力和内存有限,导致轮廓不够sharp,但也够用。另外还可以在静态和动态对象之间进行预测,以超过 100 FPS 的速度运行(或者是相机可以产生的 3 倍以上)。

2020 AI day中的Hydranet算法中有三个核心词汇:鸟瞰图(BEV)空间、固定矩形、物体检测。而occupancy network针对这三点有哪些优化,可以看:

第一是鸟瞰图。在 2020 年特斯拉 AI 日上,Andrej Karpathy 介绍了特斯拉的鸟瞰网络。该网络展示了如何将检测到的物体、可驾驶空间和其他物体放入 2D 鸟瞰视图中。occupancy则是计算占据空间的概率。

BEV vs Volume Occupancy

最主要的区别就是,前者是 2D表示,而后者是3D表示。

第二是固定矩形,在设计感知系统时,经常会将检测与固定输出尺寸联系起来,矩形无法表示一些异形的车辆或者障碍物。如果您看到一辆卡车,将在featuremap上放置一个 7×3 的矩形,如果看到一个行人,则使用一个 1×1 的矩形。问题是,这样无法预测悬垂的障碍物。如果汽车顶部有梯子,卡车有侧拖车或手臂;那么这种固定的矩形可能无法检测到目标。而使用Occupancy Network的话,看到下图中,是可以精细的预测到这些情况的。

固定矩形 vs Volume Occupancy

后者的工作方式如下:

  1. 将世界划分为微小(或超微小)的立方体或体素
  2. 预测每个体素是空闲还是被占用
体素空间中的被占用体素

这里意味着两种方法的思维方式完全不一样,前者是为一个对象分配一个固定大小的矩形,而后者是简单地说“这个小立方体中有一个对象吗? ”。

第三点,物体检测。

目前有很多新提出来的物体检测算法,但大多面向的是固定的数据集,只检测属于数据集的部分或全部对象,一旦有没有标注的物体出现,比如侧翻的白色大卡车,垃圾桶出现的路中,这是没法检测到的。而当思考和训练一个模型来预测“这个空间是空闲的还是被占用的,不管对象的类别是什么?”,正可以避免这种问题。

对象检测 vs Occupancy Network

基于视觉的系统有 5 个主要缺陷:地平线深度不一致物体形状固定静态和移动物体遮挡本体裂缝。特斯拉旨在创建一种算法来解决这些问题。

新的占用网络通过实施 3 个核心思想解决了这些问题:体积鸟瞰图、占用检测体素分类。这些网络可以以超过 100 FPS 的速度运行,可以理解移动对象和静态对象,并且具有超强的内存效率。

模型结构:

cvpr 时的网络结构

  • 输入为不同视角的图像(总共 8 个:正面、侧面、背面等……)。
  • 图像由RegnetBiFPN等网络提取特征
  • 接着transformer模块,使用注意力模块,采用位置图像编码加上QKV获得特征,以此来产生占用Occupancy。
  • 这会产生一个Occupancy feature,然后将其与之前的体积(t-1、t-2 等)融合,以获得4D Occupancy feature
  • 最后,我们使用反卷积来检索原始大小并获得两个输出:Occupancy volume和Occupancy flow。

AI day时的网络结构

相比cvpr时,AI day上的分享更加详细,主要有三点更新:

  1. 最左侧是基于photon count的传感器图像作为模型输入(虽然鼓吹的很高大上,其实就是ISP处理前的raw数据),这里的好处是可以在低光照、可见度低等情况下,感知的动态范围更好。
  2. temporal alignment利用里程计信息,对前面时刻的occupancy features进行时序上的加权融合,不同的时间的特征有着不同的权重,然后时序信息似乎实在Channel维度进行拼接的?组合后的特征进入deconv模块提高分辨率。这样看来时序融合上,更倾向于使用类似transformer或者时间维度作为一个channel的时序cnn进行并行的处理,而非spatial RNN方案。
  3. 相比CVPR的方案,除了输出3D occupancy特征和occupancy flow(速度,加速度)以外,还增加了基于x,y,z坐标的query思路(借鉴了Nerf),可以给occupancy network提供基于query的亚像素、变分辨率的几何和语义输出。

因为nerf只能离线重建,输出的occupancy 猜想可以通过提前训好的的nerf生成GT来监督?

光流估计和Occupancy flow

特斯拉在这里实际上做的是预测光流。在计算机视觉中,光流是像素从一帧到另一帧的移动量。输出通常是flow map 。

在这种情况下,可以有每一个体素的流动,因此每辆车的运动都可以知道;这对于遮挡非常有帮助,但对于预测、规划等其他问题也很有帮助

Occupancy Flow(来源

Occupancy flow实际上显示了每个对象的方向:红色:向前 — 蓝色:向后 — 灰色:静止等……(实际上有一个色轮代表每个可能的方向)

Nerf

特斯拉的 NeRF(来源

神经辐射场,或 Nerf,最近席卷了3D 重建;特斯拉也是其忠实粉丝。它最初的想法是从多视图图像中重建场景(详见3D 重建课程)。

这与occupancy network 非常相似,但这里的不同之处在于也是从多个位置执行此操作的。在建筑物周围行驶,并重建建筑物。这可以使用一辆汽车或特斯拉车队在城镇周围行驶来完成。

这些 NeRF 是如何使用的?

由于Occupancy network产生 3D volume,可以将这些 3D volume与 3D-reconstruction volume(Nerf离线训练得到)进行比较,从而比较预测的 3D 场景是否与“地图”匹配(NeRF 产生 3D重建)。

在这些重建过程中也可能出现问题是图像模糊、雨、雾等……为了解决这个问题,他们使用车队平均(每次车辆看到场景,它都会更新全局 3D 重建场景)和描述符而不是纯像素。

使用Nerf的descriptor

这就是获得最终输出的方式!特斯拉还宣布了一种名为隐式网络的新型网络,其主要思想是相似的:通过判断视图是否被占用来避免冲突

总结来说:

  1. 当前仅基于视觉的系统的算法存在问题:它们不连续,在遮挡方面做得不好,无法判断物体是移动还是静止,并且它们依赖于物体检测。 因此,特斯拉决定发明“Occupancy network”,它可以判断 3D 空间中的一个单元格是否被占用。
  2. 这些网络改进了 3 个主要方面:鸟瞰图、物体类别和固定大小的矩形。
  3. occupancy network分 4 个步骤工作:特征提取、注意和occupancy检测、多帧对齐和反卷积,从而预测光流估计和占用估计。
  4. 生成 3D 体积后,使用 NeRF(神经辐射场)将输出与经过训练的 3D 重建场景进行比较。
  5. 车队平均采集数据用于解决遮挡、模糊、天气等场景

reference:

Marching Cubes 算法

 Marching Cubes算法是三维离散数据场中提取等值面的经典算法,其主要应用于医学领域的可视化场景,例如CT扫描和MRI扫描的3D重建等。

Marching Cube 首先将空间分成众多的六面体网格,类似将空间分成很多的小块

我们有很多的已知采样点,并且知道这些点在空间中的空间场值,现在我们将空间分为很多个小格子,每个小格子都有8个顶点,我们通过计算8个顶点周围(范围与六面体的大小相关)的采样点,近似计算出8个顶点的空间场值(加权评价等方法)。 

以0等值面为例:如何找到0等值面经过的六面体网格? 

算法主要的思想是在三维离散数据场中通过线性插值来逼近等值面,具体如下:三维离散数据场中每个栅格单元作为一个体素,体素的每个顶点都存在对应的标量值。如果体素顶点上的值大于或等于等值面值,则定义该顶点位于等值面之外,标记为“0”;而如果体素顶点上的值小于等值面值,则定义该顶点位于等值面之内,标记为“1”。由于每个体素单元有8个顶点,那么共存在2^8 = 256种情形,下图是Marching Cubes算法的15种基本情形,其他241种情形可以通过这15种基本情形的旋转、映射等方式实现。

 每个体素单元上顶点和边的索引规则如下图左所示,假如体素下方的顶点3的值小于等值面值,其他顶点上的值都大于等值面值(如下图右所示),那么我们可以生成一个与体素边2,3,11相交的三角面片,而三角面片顶点的具体位置则需要根据等值面值和边顶点3-2,3-0,3-7的值线性插值计算得到。

对于与等值面存在交点的体素边,交点坐标用P表示,P1、P2代表边上两个端点的坐标,V1、V2代表这两个端点上的值,V代表等值面值,那么交点坐标的计算公式如下:

P = P1 + (V – V1)·(P2 – P1)/(V2 – V1)

  算法第一步:通过edgeTable表判断等值面和体素单元哪一条边相交

  体素单元顶点状态的索引号定义规则如下:

cubeindex = 0;
if (V[0] < isolevel) cubeindex |= 1;
if (V[1] < isolevel) cubeindex |= 2;
if (V[2] < isolevel) cubeindex |= 4;
if (V[3] < isolevel) cubeindex |= 8;
if (V[4] < isolevel) cubeindex |= 16;
if (V[5] < isolevel) cubeindex |= 32;
if (V[6] < isolevel) cubeindex |= 64;
if (V[7] < isolevel) cubeindex |= 128;

以上图所示为例,仅顶点3标记为“1”,其他顶点标记为“0”,那么体素单元的顶点状态为0000 1000或者8,通过查找表得到edgeTable[8] = 1000 0000 1100,意味着体素单元的边2,3,11和等值面相交,然后通过线性插值计算各个交点的位置。

算法第二步:通过triTable表生成对应三角面片的组成情况

  还是以上图所示为例,通过查找表得到triTable[8] = {3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},意味着该种顶点状态可以生成三角面片(3, 11, 2),代表三角面片的3个顶点为边3,11,2和等值面相交的交点。

  经过上述步骤之后,我们可以得到等值面的点面信息。为了进一步完善显示效果,需要调整顶点法向。假设顶点(i, j, k)上的值为f(i, j, k),采用中心差分方法可以计算该点处的梯度矢量:

对G进行归一化,得到顶点(i, j, k)上的单位法向量,然后对体素单元上8个顶点的法向量进行线性插值就可得到三角面片各个顶点的显示法向量。

参考:http://graphics.stanford.edu/~mdfisher/MarchingCubes.html

Marching Cube的问题

当然最初的Marching Cube 有很多问题,例如拓扑连接二义性,一种状态可以有多种连接关系

而且Marching Cube的效率不是特别高,需要借助分层结构和并行计算。
而且Marching Cube生成面片的大小与六面体的大小相关,过大则会导致模型模糊,细节消失,过小会导致面片的数目过多。

但是从1987年提出Marching Cube至今,已经对其有了很多的改进和优化算法,在处理时间,减少内存开销,分辨率方面都有很大的优化。