条件控制扩散模型

参考:https://www.zhangzhenhu.com/aigc/Guidance.html

无论是 DDPM 还是 DDIM,这些扩散模型在生成图片时,都是输入一个随机高斯噪声数据, 然后逐步的产出一张有意的真实图片。这个过程中每一步都是一个随机过程,所以每次执行产出的图片都不一样, 生成的图像多样性非常好。 但这也是一个缺点:生成的图像不可控,无法控制这个生成过程并令其生成我们想要的图像内容

鉴于此,很多研究中在如何控制图像生成过程方面提出了很多有效的方案。 直觉的讲,我们可以在扩散过程中引入额外的信息来指导或者说控制整个扩散模型, 假设这个额外的信息为 y,它可以是一段文本、一张图片或者图像的类别标签。 引入 y 之后的模型就变成了一个以 y 为条件的条件概率分布。

自然而然地,接下来就需要探讨,引入y 之后对前向扩散过程和逆向采用过程分别有什么影响,需要做出什么调整。 首先看下对前向扩散过程的影响,先说结论:引入 y 之后,对前向扩散过程没有任何影响。 其实,从直觉上讲,前向扩散过程是对原始图片加噪声,直至变成纯噪声,这个过程显然与 y没有任何关系。 但做研究要严谨,还是需要给出数学证明的。 证明过程在论文 1 中已经给出。

条件扩散模型的前向过程与非条件扩散模型的前向过程完全一样

1、classifier guidance

OpenAI 的团队在 2021 年发表一篇论文 1 : A. Diffusion models beat gans on image synthesis ,在这篇论文中,提出一种利用图片类别标签指导图像生成的方案,称为 classifier guidance, 通过这种改进使扩散模型生成图像的质量大幅提升,并在 IS 和 FID 评分上超过了 GAN 模型, 所以你看论文的名字,简单直接。

论文的源码在: https://github.com/openai/guided-diffusion 。

实际上这篇论文做了很多改进,比如对UNET也做了改进。但这里我们只关注 guidance 部分。 原论文的推导过程比较繁杂,这里我们采用另一篇文章 2 的推导方案, 直接从 score function 的角度去理解。

虽然引入 classifier guidance 效果很明显,但缺点也很明显:

  1. 需要额外一个分类器模型,极大增加了成本,包括训练成本和采样成本。
  2. 分类器的类别毕竟是有限集,不能涵盖全部情况,对于没有覆盖的标签类别会很不友好

后来《More Control for Free! Image Synthesis with Semantic Diffusion Guidance》推广了“Classifier”的概念,使得它也可以按图、按文来生成。Classifier-Guidance方案的训练成本比较低(熟悉NLP的读者可能还会想起与之很相似的PPLM模型),但是推断成本会高些,而且控制细节上通常没那么到位。

2、Classifier-free guidance

引导函数的方法存在一些问题:1)额外的计算量比较多;2)引导函数和扩散模型分别进行训练,不利于进一步扩增模型规模,不能够通过联合训练获得更好的效果。

  • 提出了一个等价的结构替换了外部的classifier,从而可以直接使用一个扩散模型来做条件生成任务。

实际做法只是改变了模型输入的内容,有conditional(随机高斯噪声+引导信息的embedding)和unconditional两种采样输入。两种输入都会被送到同一个diffusion model,从而让其能够具有无条件和有条件生成的能力。

3、CLIP Guidance

Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., Sastry, G., Askell, A., Mishkin, P., Clark, J., Krueger, G., and Sutskever, I. Learning transferable visual models from natural language supervision. arXiv:2103.00020, 2021

Prafulla Dhariwal and Alex Nichol. Diffusion models beat gans on image synthesis. 2021. arXiv:2105.05233.[2](1,2)

Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970.[3]

Jonathan Ho and Tim Salimans. Classifier-free diffusion guidance. 2022. arXiv:2207.12598.[4]

Alex Nichol, Prafulla Dhariwal, Aditya Ramesh, Pranav Shyam, Pamela Mishkin, Bob McGrew, Ilya Sutskever, and Mark Chen. Glide: towards photorealistic image generation and editing with text-guided diffusion models. 2022. arXiv:2112.10741.[5]

Aditya Ramesh, Prafulla Dhariwal, Alex Nichol, Casey Chu, and Mark Chen. Hierarchical text-conditional image generation with clip latents. 2022. arXiv:2204.06125.[6]

Chitwan Saharia, William Chan, Saurabh Saxena, Lala Li, Jay Whang, Emily Denton, Seyed Kamyar Seyed Ghasemipour, Burcu Karagol Ayan, S. Sara Mahdavi, Rapha Gontijo Lopes, Tim Salimans, Jonathan Ho, David J Fleet, and Mohammad Norouzi. Photorealistic text-to-image diffusion models with deep language understanding. 2022. arXiv:2205.11487.

去噪扩散隐式模型(Denoising Diffusion Implicit Models,DDIM)

Paper: https://arxiv.org/abs/2010.02502

Code: https://github.com/ermongroup/ddim

摘自:扩散模型之DDIM

在 DDPM 中,生成过程被定义为马尔可夫扩散过程的反向过程,在逆向采样过程的每一步,模型预测噪声

DDIM 的作者发现,扩散过程并不是必须遵循马尔科夫链, 在之后的基于分数的扩散模型以及基于随机微分等式的理论都有相同的结论。 基于此,DDIM 的作者重新定义了扩散过程和逆过程,并提出了一种新的采样技巧, 可以大幅减少采样的步骤,极大的提高了图像生成的效率,代价是牺牲了一定的多样性, 图像质量略微下降,但在可接受的范围内。

对于扩散模型来说,一个最大的缺点是需要设置较长的扩散步数才能得到好的效果,这导致了生成样本的速度较慢,比如扩散步数为1000的话,那么生成一个样本就要模型推理1000次。这篇文章我们将介绍另外一种扩散模型DDIMDenoising Diffusion Implicit Models),DDIM和DDPM有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程(中间没有加入随机噪音)。

前提条件:1.马尔可夫过程。2.微小噪声变化。

步骤一:在DDPM中我们基于初始图像状态以及最终高斯噪声状态,通过贝叶斯公式以及多元高斯分布的散度公式,可以计算出每一步骤的逆向分布。之后继续重复上述对逆向分布的求解步骤,最终实现从纯高斯噪声,恢复到原始图片的步骤。

步骤二:模型优化部分通过最小化分布的交叉熵,预测出模型逆向分布的均值和方差,将其带入步骤一中的推理过程即可。

文章中存在的一个核心问题是:由于1.每个步骤都是马尔可夫链。2.每次加特征的均值和方差都需要控制在很小的范围下。因此我们不得不每一步都进行逆向的推理和运算,导致模型整体耗时很长。本文核心针对耗时问题进行优化,一句话总结:在满足DDPM中逆向推理的条件下,找到一种用 xt  x0 表达 xt−1 且能能大幅减少计算量的推理方式。

代码实现:

DDIM和DDPM的训练过程一样,所以可以直接在DDPM的基础上加一个新的生成方法(这里主要参考了DDIM官方代码以及diffusers库),具体代码如下所示:

class GaussianDiffusion:
    def __init__(self, timesteps=1000, beta_schedule='linear'):
     pass

    # ...
        
 # use ddim to sample
    @torch.no_grad()
    def ddim_sample(
        self,
        model,
        image_size,
        batch_size=8,
        channels=3,
        ddim_timesteps=50,
        ddim_discr_method="uniform",
        ddim_eta=0.0,
        clip_denoised=True):
        # make ddim timestep sequence
        if ddim_discr_method == 'uniform':
            c = self.timesteps // ddim_timesteps
            ddim_timestep_seq = np.asarray(list(range(0, self.timesteps, c)))
        elif ddim_discr_method == 'quad':
            ddim_timestep_seq = (
                (np.linspace(0, np.sqrt(self.timesteps * .8), ddim_timesteps)) ** 2
            ).astype(int)
        else:
            raise NotImplementedError(f'There is no ddim discretization method called "{ddim_discr_method}"')
        # add one to get the final alpha values right (the ones from first scale to data during sampling)
        ddim_timestep_seq = ddim_timestep_seq + 1
        # previous sequence
        ddim_timestep_prev_seq = np.append(np.array([0]), ddim_timestep_seq[:-1])
        
        device = next(model.parameters()).device
        # start from pure noise (for each example in the batch)
        sample_img = torch.randn((batch_size, channels, image_size, image_size), device=device)
        for i in tqdm(reversed(range(0, ddim_timesteps)), desc='sampling loop time step', total=ddim_timesteps):
            t = torch.full((batch_size,), ddim_timestep_seq[i], device=device, dtype=torch.long)
            prev_t = torch.full((batch_size,), ddim_timestep_prev_seq[i], device=device, dtype=torch.long)
            
            # 1. get current and previous alpha_cumprod
            alpha_cumprod_t = self._extract(self.alphas_cumprod, t, sample_img.shape)
            alpha_cumprod_t_prev = self._extract(self.alphas_cumprod, prev_t, sample_img.shape)
    
            # 2. predict noise using model
            pred_noise = model(sample_img, t)
            
            # 3. get the predicted x_0
            pred_x0 = (sample_img - torch.sqrt((1. - alpha_cumprod_t)) * pred_noise) / torch.sqrt(alpha_cumprod_t)
            if clip_denoised:
                pred_x0 = torch.clamp(pred_x0, min=-1., max=1.)
            
            # 4. compute variance: "sigma_t(η)" -> see formula (16)
            # σ_t = sqrt((1 − α_t−1)/(1 − α_t)) * sqrt(1 − α_t/α_t−1)
            sigmas_t = ddim_eta * torch.sqrt(
                (1 - alpha_cumprod_t_prev) / (1 - alpha_cumprod_t) * (1 - alpha_cumprod_t / alpha_cumprod_t_prev))
            
            # 5. compute "direction pointing to x_t" of formula (12)
            pred_dir_xt = torch.sqrt(1 - alpha_cumprod_t_prev - sigmas_t**2) * pred_noise
            
            # 6. compute x_{t-1} of formula (12)
            x_prev = torch.sqrt(alpha_cumprod_t_prev) * pred_x0 + pred_dir_xt + sigmas_t * torch.randn_like(sample_img)

            sample_img = x_prev
            
        return sample_img.cpu().numpy()

这里以MNIST数据集为例,训练的扩散步数为500,直接采用DDPM(即推理500次)生成的样本如下所示:

同样的模型,我们采用DDIM来加速生成过程,这里DDIM的采样步数为50,其生成的样本质量和500步的DDPM相当:

完整的代码示例见https://github.com/xiaohu2015/nngen

其它:重建和插值

如果从直观上看,DDIM的加速方式非常简单,直接采样一个子序列,其实论文DDPM+也采用了类似的方式来加速。另外DDIM和其它扩散模型的一个较大的区别是其生成过程是确定性的。

Stable-diffusion

Stable Diffusion

Stable Diffusion was made possible thanks to a collaboration with Stability AI and Runway and builds upon our previous work:

High-Resolution Image Synthesis with Latent Diffusion Models
Robin Rombach*, Andreas Blattmann*, Dominik LorenzPatrick EsserBjörn Ommer
CVPR ’22 Oral | GitHub | arXiv | Project page

参考: https://zhuanlan.zhihu.com/p/573984443

参考: https://zhuanlan.zhihu.com/p/599160988

扩散模型汇总 :https://github.com/heejkoo/Awesome-Diffusion-Models

DDPM 模型在生成图像质量上效果已经非常好,但它也有个缺点, 那就是xt 的尺寸是和图片一致的,xt的元素和图片的像素是一一对应的, 所以称 DDPM 是像素(pixel)空间的生成模型。 我们知道一张图片的尺寸是 3×H×W ,如果想生成一张高尺寸的图像, Xt的张量大小是非常大的,这就需要极大的显卡(硬件)资源,包括计算资源和显存资源。 同样的,它的训练成本也是高昂的。高昂的成本极大的限制了它在民用领用的发展。

1. 潜在扩散模型(Latent diffusion model,LDM)

2021年德国慕尼黑路德维希-马克西米利安大学计算机视觉和学习研究小组(原海德堡大学计算机视觉小组), 简称 CompVis 小组,发布了论文 High-Resolution Image Synthesis with Latent Diffusion Models,针对这个问题做了一些改进, 主要的改进点有:

  • 引入一个自编码器,先对原始对象进行压缩编码,编码后的向量再应用到扩散模型。
  • 通过在 UNET 中加入 Attention 机制,处理条件变量 y。

潜在空间

针对 DDPM 消耗资源的问题,解决方法也简单。 引入一个自编码器,比如上一章介绍的变分编码器(VAE),先对原始图像进行压缩编码,得到图像的低维表示 z0 ,然后 x0 作为 DDPM 的输入,执行 DDPM 的算法过程,DDPM 生成的结果再经过解码器还原成图像。 由于 z0 是压缩过的,其尺寸远远小于原始的图像,这样就能极大的减少 DDPM 资源的消耗。 压缩后 z0 所在的数据空间称为潜在空间(latent space), z0 可以称为潜在数据

这个自编码器(VAE)可以是提前预训练好的模型,在训练扩散模型时,自编码器的参数是冻住的, 如 图 7.1.2 所示

  • 通过使用预训练的编码器 E,我们可以将全尺寸图像编码为低维潜在空间数据(压缩数据)。
  • 通过使用预训练的解码器 D,我们可以将潜在空间数据解码回图像。

这样在 DDPM 外层增加一个 VAE 后,DDPM 的扩散过程和降噪过程都是在潜空间(Latent Space)进行, 潜空间的尺寸远远小于像素空间,极大了降低了硬件资源的需求,同时也能加速整个过程。

正向扩散过程→给潜在数据增加噪声,逆向扩散过程→从潜在数据中消除噪声。 整个 DDPM 的过程都是在潜在空间执行的, 所以这个算法被称为潜在扩散模型(Latent diffusion model,LDM)。增加一个自编码器并没有改变 DDPM 的算法过程,所以并不需要对 DDPM 算法代码做任何改动。

条件处理

在 DDPM 的过程中,可以增加额外的指导信息,使其生成我们的想要的图像, 比如文本生成图像、图像生成图像等等。

关于注意力机制的实现细节,可以直接参考论文代码, LDM模型论文的代码和预训练的模型已经在 Github 开源,地址为: https://github.com/CompVis/latent-diffusion 。

训练过程

相比于 DDPM ,条件化的 LDM 目标函数稍微变化了一点,具体变化内容可以参考:

生成(采样)过程:

图 7.1.6 是 LDM 采样过程的图形化表示, 过程并不复杂,经过 DDPM 采样生成的 Z0 需要用解码器 D 还原成图像。

 2、稳定扩散模型(Stable diffusion,SD)

LDM 本身是由 CompVis 提出并联合 Runway ML进行开发实现,后来 Stability AI 也参与进来并提供了一些资源, 联合搞了一个预训练的 LDM 模型,称为 Stable diffusion。 所以,Stable diffusion 是 LDM 的一个开源预训练模型,由于它的开源迅速火爆起来。 目前 Stable diffusion 已经占据了图像生成开源领域的主导地位。

由于 Stable diffusion 只是LDM的一个开源预训练模型,没有额外的复杂数学公式需要讨论, 这里我们就直接上代码吧。 我们不用 Stable diffusion 的官方代码库 stablediffusion ,而是 huggingface 开源库 diffusers 中的实现, 它的易读性更好一些。

diffusers 把模型的核心逻辑都封装在各种 DiffusionPipeline 中, StableDiffusionPipeline 核心代码在 diffusers.StableDiffusionPipeline 先看初始化代码,可明显看到整个 StableDiffusionPipeline 包含几个关键组件:vae,text_encoder/tokenizer,unet,scheduler。 这几个组件和 LDM 中是对应的。

  • vae: VAE 自编码器,负责前后的编解码(压缩、解压缩)工作。
  • text_encoder/tokenizer: 文本编码器,负责对文本Prompt进行编码处理。
  • unet: 噪声预测模型,也是DDPM的核心。
  • scheduler: 负责降噪过程(逆过程)的计算,也就是实现 xt−>xt−1 ,对应着 DDPM、DDIM、ODE等不同的降采样实现。
  • safety_checker: 做生成图像安全性检查的,可选,暂时可以不关注它。
  • feature_extractor: 如果输入条件中存在 img,也就是以图生图(img2img),可以用它对条件图片进行特征抽取,也就是图像编码器(img encoder),可选。

【深度估计 Transformer】Vision Transformers for Dense Prediction

作者单位:Intel Labs

https://arxiv.org/abs/2103.13413

https://github.com/isl-org/DPT

Hugging Face

密集预测视觉Transformer(DPT),其在单目深度估计、语义分割等任务上表现SOTA!

我们介绍了密集视觉Transformer,该架构利用视觉Transformer代替卷积网络作为密集预测任务的骨干。我们将视觉Transformer各个阶段的token组装成各种分辨率的图像表示形式,并使用卷积解码器将它们逐步组合为全分辨率预测。

Transformer主干以恒定且相对较高的分辨率处理表示,并且在每个阶段都具有全局感受野。与全卷积网络相比,这些特性使密集视觉Transformer可以提供更细粒度和更全局一致的预测。

实验表明,这种架构密集的预测任务上产生了实质性的改进,特别是当有大量的训练数据可用时。对于单眼深度估计,与最先进的完全卷积网络(FCN,fully-convolutional networks.)相比,其相对性能提高了高达28%。应用于语义分割时,Dense vision transformer在ADE20K上是49.02%的mIoU。同时进一步表明,当处于新技术设置,该架构可以在较小的数据集上进行微调,如NYUv2、KITTIPascal Context

Introduction

密集预测架构主要基于卷积网络,其设计通常遵循一种从逻辑上将网络分为编码器解码器的模式编码器通常基于一个图像分类网络(主干),在像ImageNet这样的大型语料库上进行预训练。解码器聚合来自编码器的特征,并将其转换为最终的密集预测。密集预测的体系结构研究往往集中在解码器及其聚合策略上。主干架构对整个模型有很大的影响,因为编码器中丢失的任何信息都不可能在解码器中恢复。

卷积主干逐步对输入图像进行向下采样以提取多个尺度上的特征。下采样使接受域的逐渐增加,低级特征分组为抽象的高级特征,同时确保网络的内存和计算需求保持易于处理。然而,下采样有明显的缺点,这在密集的预测任务中特别突出:特征分辨率和粒度在模型的更深层次的阶段丢失,因此很难在解码器中恢复。虽然特征分辨率和粒度可能对某些任务并不重要,如图像分类,但它们对于密集预测至关重要,在理想情况下,体系结构应该能够在或接近输入图像的分辨率时分辨特征。

现提出的减轻特征粒度损失的各种技术。这些包括训练在更高的输入分辨率(如果计算预算允许),扩大卷积,迅速增加接受域没有下采样,适当放置从编码器的多个阶段跳过连接到解码器,或者最近的通过在整个网络并行连接多分辨率表示。虽然这些技术可以显着提高预测质量,但网络仍然受到其基本构建块—卷积的瓶颈。卷积和非线性一起构成了图像分析网络的基本计算单元。根据定义,卷积是具有有限接受域的线性算子。有限的接受域和单个卷积的有限表达性需要顺序堆叠成非常深的结构,以获得非常广泛的背景和足够高的表征能力。 然而,这需要产生许多需要大量的间接表示。降采样中间表示是必要的,以保持内存消耗在现有计算机架构中可行的水平。

在本工作中,介绍了密集的预测变压器(DPT)。DPT是一种密集的预测体系结构,它基于编码器-解码器的设计,利用transformer作为编码器的基本计算构建块。具体来说,使用最近提出的Vision Transformer(ViT)作为主干架构ViT提供的bag-of-words表示重新组装为不同分辨率的类图像特征表示,使用卷积解码器逐步将特征表示组合到最终的密集预测中。与完全卷积网络不同,ViT主干在计算初始图像嵌入后放弃显式下采样操作,并在所有处理阶段保持恒定维度的表示。此外,在每个阶段都有一个全局性的接受域,实验表明,这些特性对于密集的预测任务特别有利,因为它们会导致细粒度和全局相一致的预测。

单眼深度估计和语义分割的实验。对于通用单眼深度估计的任务,其中有大规模的训练数据可用,与该任务中性能最好的全卷积网络相比,DPT提供的性能提高了超过28%。该架构还可以微调到小的单眼深度预测数据集,如NYUv2和KITTI,当它也设置了新的技术状态。实验利用语义分割实验进一步提供了DPT的强性能的证据。对于这个任务,DPT在具有挑战性的ADE20K和Pascal Context数据集上设置了一个新的最新技术状态。定性结果表明,与卷积网络相比,这些改进可以归因于更细粒度和更全局一致的预测。

Transformer encoder 

在一个高水平上,Vision Transformer在图像的bag-of-words表示上进行操作。单独嵌入到特征空间中的图像补丁,或者从图像中提取的深度特征,扮演“words”的角色。在本工作的其余部分中,将嵌入的“word”称为tokens 。Transformer使用multi-headed self-attention(MHSA)的顺序块对tokens进行转换,该块将tokens相互联系起来来转换表示。

image–extracted–image patch–word–token(变化):特征空间中的图像patch

image patch:图像补丁是较大形式的像素容器例如,假设有一张 100 像素 x 100 像素的图像。如果您将这些图像划分为 10×10 块,那么将拥有一个包含 100 个块的图像(即每个块为 100 像素)。如果开发了一种算法,可以在 10px x 10px 上运行,那么 10px x 10px 就是补丁大小。例如,CNN 的池化层采用更大的块并将它们变成一个像素,可以将其视为信号处理中的窗口。在图像处理补丁窗口大多数情况下是可以互换的,但是当您的算法主要关注一堆像素共享相似属性的事实时,通常会在上下文中使用补丁。例如,补丁用于稀疏表示或图像压缩的上下文,而窗口用于边缘检测或图像增强。

Multi-headed self-attention(MHSA) Net:一种新的人物再识别模型,称为多头自我注意网络(MHSA-Net),用于从人物图像中剔除不重要的信息捕捉关键的局部信息。MHSA-Net包含两个主要的新颖组件:多头自我注意分支(MHSAB)和注意力竞争机制(ACM)。MHSAM自适应地捕获关键的局域人信息,然后产生有效的图像多样性嵌入,用于人的匹配。ACM进一步帮助过滤剔除注意力、噪音和非关键信息。通过广泛的消融研究,验证了结构化的自我注意分支和注意竞争机制都有助于MHSA-Net的性能提高。MHSA-Net在有遮挡的图像上作用深远。

对于应用程序来说,重要的是,transformer在所有计算过程中保持token数量。由于token与image patches有一对一的对应关系,这意味着ViT编码器在所有transformer阶段保持初始嵌入的空间分辨率。此外,MHSA是一个全局操作,因为每个token都可以关注并影响其他token。因此,transformer在初始嵌入后的每个阶段都有一个全局的接受域。这与卷积网络形成了鲜明的对比,卷积网络随着特征通过连续的卷积和下采样层时,逐渐增加了它们的接受域。 

具体而言,ViT通过处理所有不重叠的正方形斑块从图像中提取嵌入的补丁从图像中获得p^{2}像素的大小。这些补丁被扁平(flattened into)到向量中,并使用线性投影单独嵌入。另一种,更具样本效率的ViT变体通过对图像应用ResNet50来提取嵌入,并使用生成的特征映射的像素特征作为标记。由于transformer是set-to-set functions,因此它们本质上并不保留单个token的空间位置信息。因此,图像嵌入与可学习的位置嵌入连接,以将这些信息添加到表示中。在NLP中的工作之后,ViT还添加了一个与输入图像不相关的special token(readout token),并作为最终用于分类的全局图像表示。在此将这个特殊的标记称为读出标记。

Convolutional decoder

解码器将tokens组合成不同分辨率的类图像特征表示。特征表示逐渐融合到最终的密集预测中。文章提出了一个简单的三阶段重组操作,以从transformer encoder任意层输出的token中恢复类图像的表示形式

不管具体的transformer主干如何,都在四个不同的阶段和四个不同的分辨率上重新组装特征。以更低分辨率组装transformer深层的特征,而早期层的特征以更高分辨率组装。当使用ViT-Large时,从 l ={5,12,18,24}层重新组装tokens,而使用ViT-Base,使用 l ={3,6,9,12}层。当使用ViT-Hybrid时,使用了来自嵌入网络的第一和第二个ResNet块和阶段 l ={9,12}的特性。默认体系结构使用投影作为读出操作,并使用\hat{D}=256维度生成特性映射,将这些架构分别称为DPT-Base、DPT-Large和DPTHybrid。

最后,使用基于RefineNet的特征融合块结合从连续阶段提取的特征图,并在每个融合阶段对表示向上采样两次。最终的表示大小的分辨率是输入图像的一半,在此,附加一个特定于任务的输出头来产生最终的预测。完整架构的示意图概述如上图所示。

鲁棒性的单目深度估计: Mixing Datasets for Zero-shot Cross-dataset Transfer

Towards Robust Monocular Depth Estimation: Mixing Datasets for Zero-shot Cross-dataset Transfer, TPAMI 2022

MiDaS v3.1https://github.com/isl-org/MiDaS(最近也在更新)

Hugging Face

这篇文章提出了一种监督的深度估计方法,其中使用一些很有价值的策略使得最后深度估计的结果具有较大提升。具体来讲文章的策略可以归纳为:
1)数据集 : 现有的深度数据集的场景不够丰富, 不能训练出一个在任意场景下都健壮的模型. 因此作者选择结合这些数据集。使用多个深度数据集(各自拥有不同的scale和shift属性)加入进行训练,增大数据量与实现场景的互补

但是组合这些数据集有三个挑战:

  • 深度表达不同, 有的是0表示最近, 有的是0表示最远
  • 部分数据集没有提供缩放信息
  • 部分数据集提供了单张图像的相对深度(disparity), 但是跨数据集的相对深度无法直接转换


2)提出了一种scale-shift invariable的loss(具有深度和偏移不变性的损失函数)用于去监督深度的回归过程,从而使得可以更加有效使用现有数据;
3)采用从3D电影中进行采样的方式扩充数据集,从而进一步增加数据量;
4)使用带有原则属性的多目标训练方法,从而得到一种更加行之有效的优化方法;
结合上述的优化策略与方法,文章的最后得到的模型具有较强的泛化能力,从而摆脱了之前一些公开数据集场景依赖严重的问题。

优势:

  1. 问题的转化
    为了解决数据本身存在深度不一致的问题, 转化成设计一个对深度不敏感的loss
  2. 预训练模型
    可以直接得到任意单张图像的深度信息, 用于下游任务的训练, 

效果:

Single-View View Synthesis :图片-网络-深度图-网络-新视点

Single-View View Synthesis in the Wild with Learned Adaptive
Multiplane Images SIGGRAPH 2022.

现有方法已经显示出利用单眼深度估计和具有分层深度表示的颜色修复的有希望的结果。 然而,这些方法处理复杂3D 几何场景的能力仍然有限。 我们提出了一种基于多平面的新方法图像 (MPI) 表示。适应野外场景布局多样化,解决高维MPI内容生成难的问题,我们设计了一个网络结构,由两部分组成,一个用于平面深度调整,另一个用于深度感知颜色预测。前者使用 RGBD 上下文特征和注意机制调整初始平面位置。 给定调整后的深度值,后者通过特征屏蔽策略实现适当的平面间交互,分别预测每个平面的颜色和密度。

为了训练我们的方法,我们通过简单而有效的 warp-back 策略仅使用不受约束的单视图图像集合来构建大规模立体训练数据。 在合成数据集和真实数据集上进行的实验表明,我们训练的模型效果非常好,并取得了最先进的结果

Code:https://github.com/yxuhan/AdaMPI

网络结构:

训练过程:

结果:

MPViT : Multi-Path Vision Transformer for Dense Prediction

https://arxiv.org/abs/2112.11010(CVPR2022)

https://github.com/youngwanLEE/MPViT

Introduction

  • 在这项工作中,作者以不同于现有Transformer的视角,探索多尺度path embedding与multi-path结构,提出了Multi-path Vision Transformer(MPViT)
  • 通过使用 overlapping convolutional patch embedding,MPViT同时嵌入相同大小的patch特征。然后,将不同尺度的Token通过多条路径独立地输入Transformer encoders,并对生成的特征进行聚合,从而在同一特征级别上实现精细和粗糙的特征表示。
  • 在特征聚合步骤中,引入了一个global-to-local feature interaction(GLI)过程,该过程将卷积局部特征与Transformer的全局特征连接起来,同时利用了卷积的局部连通性和Transformer的全局上下文。

Vision Transformers for dense predictions.

  • 密集的计算机视觉任务,如目标检测和分割,需要有效的多尺度特征表示,以检测或分类不同大小的物体或区域。Vision Transformer(ViT)构建了一个简单的多阶段结构(即精细到粗糙),用于使用单尺度patch的多尺度表示。然而ViT的变体专注于降低自注意的二次复杂度,较少关注构建有效的多尺度表示。
  • CoaT通过使用一种co-scale机制,同时表示精细和粗糙的特征,允许并行地跨层注意,从而提高了检测性能。然而,co-scale机制需要大量的计算和内存开销,因为它为基础模型增加了额外的跨层关注(例如,CoaT-Lite)。因此,对于ViT体系结构的多尺度特征表示仍有改进的空间。

Comparison to Concurrent work.

  • CrossViT利用了不同的patch大小和单级结构中的双路径,如ViT和XCiT。然而,CrossViT的分支之间的相互作用只通过[CLS]token发生,而MPViT允许所有不同规模的patch相互作用。此外,与CrossViT(仅限分类)不同的是,MPViT更普遍地探索更大的路径维度(例如,超过两个维度),并采用多阶段结构进行密集预测。

Method

Conv-stem

输入图像大小为:H×W×3,两层卷积:采用两个3×3的卷积,通道分别为C2/2,C2,stride为2,生成特征的大小为H/4×W/4×C2,其中C2为stage 2的通道大小。

  • 说明:每个卷积之后都是Batch Normalization 和一个Hardswish激活函数。
  • In LeViT , a convolutional stem block shows better low-level representation (i.e., without losing salient information) than non-overlapping patch embedding.

从stage 2到stage 5,作者在每个阶段对所提出的Multi-scale Patch Embedding(MS-PatchEmbed)和Multi-path Transformer(MP-Transformer)块进行堆叠

Multi-Scale Patch Embedding

通过改变stride和padding来调整token的序列长度。也就是说,可以输出具有不同patch大小的相同大小(即分辨率)的特征。因此,作者并行地形成了几个具有不同卷积核大小的卷积patch embedding层。例如,如图1所示,可以生成相同序列长度的不同大小的vision token,patch大小分别为3×3,5×5,7×7。

由于具有相同通道和滤波器大小的连续卷积操作扩大了接受域,并且需要更少的参数,在实践中选择了连续的3×3卷积层。为了减少参数量,在实践中选择了两个连续的3×3卷积层代替5×5卷积。对于triple-path结构,使用三个连续的3×3卷积,通道大小为C’,padding为1,步幅为s,其中s在降低空间分辨率时为2,否则为1。

  • 说明:为了减少模型参数和计算开销,采用3×3深度可分离卷积,包括3×3深度卷积和1×1点卷积。
  • 每个卷积之后都是Batch Normalization 和一个Hardswish激活函数。

接着,不同大小的token embedding features 分别输入到transformer encoder中。

Multi-path Transformer

原因:Transformer中的self-attention可以捕获长期依赖关系(即全局上下文),但它很可能会忽略每个patch中的结构性信息和局部关系。相反,cnn可以利用平移不变性中的局部连通性,使得CNN在对视觉对象进行分类时,对纹理有更强的依赖性,而不是形状。

因此,MPViT以一种互补的方式将CNN与Transformer结合起来。

  • 为了表示局部特征 
  • 采用了一个 depthwise residual bottleneck block,包括1×1卷积、3×3深度卷积和1×1卷积和残差连接。
  • 为了减轻多路径结构的计算负担,使用了CoaT中提出的有效的因素分解自注意:

Global-to-Local Feature Interaction

将局部特征和全局特征聚合起来:

为了保持可比性的参数和FLOPs,增加路径的数量需要减少通道C或层数L(即,transformer encoder的数量)。作者通过减少C而不是L,从单路径(即CoaT-Lite baseline)扩展到triple-path。在消融研究中,验证了减少C比减少L获得更好的性能(见表5)。由于stage2的特征分辨率较高,导致计算成本较高,作者在stage2中将triple-path模型的路径数设置为2。从stage3开始,三路径模型有3条路径。

作者还发现,虽然 triple-path和双路径在ImageNet分类中产生相似的精度,但 triple-path模型在密集预测任务中表现出更好的性能。因此,建立了基于 triple-path结构的MPViT模型。MPViT的详细情况见表1。

Experiments

Ablation study

对MPViT-XS的每个组件进行消融研究,以研究提出的多路径结构对图像分类和使用Mask R-CNN检测的有效性。

Exploring path dimension.

基于深度学习的单目深度估计综述

Monocular Depth Estimation

Monocular Depth Estimation is the task of estimating the depth value (distance relative to the camera) of each pixel given a single (monocular) RGB image. This challenging task is a key prerequisite for determining scene understanding for applications such as 3D scene reconstruction, autonomous driving, and AR. State-of-the-art methods usually fall into one of two categories: designing a complex network that is powerful enough to directly regress the depth map, or splitting the input into bins or windows to reduce computational complexity. The most popular benchmarks are the KITTI and NYUv2 datasets. Models are typically evaluated using RMSE or absolute relative error. 这项具有挑战性的任务是确定 3D 场景重建、自动驾驶和 AR 等应用场景理解的关键先决条件。

任务介绍

深度估计是计算机视觉领域的一个基础性问题,其可以应用在机器人导航、增强现实、三维重建、自动驾驶等领域。而目前大部分深度估计都是基于二维RGB图像到RBG-D图像的转化估计,主要包括从图像明暗、不同视角、光度、纹理信息等获取场景深度形状的Shape from X方法,还有结合SFM(Structure from motion)和SLAM(Simultaneous Localization And Mapping)等方式预测相机位姿的算法。其中虽然有很多设备可以直接获取深度,但是设备造价昂贵。也可以利用双目进行深度估计,但是由于双目图像需要利用立体匹配进行像素点对应和视差计算,所以计算复杂度也较高,尤其是对于低纹理场景的匹配效果不好。而单目深度估计则相对成本更低,更容易普及。

那么对于单目深度估计,顾名思义,就是利用一张或者唯一视角下的RGB图像,估计图像中每个像素相对拍摄源的距离。对于人眼来说,由于存在大量的先验知识,所以可以从一只眼睛所获取的图像信息中提取出大量深度信息。那么单目深度估计不仅需要从二维图像中学会客观的深度信息,而且需要提取一些经验信息,后者则对于数据集中相机和场景会比较敏感。

通过阅读文献,可以将基于深度学习的单目深度估计算法大致分为以下几类:

  • 监督算法

顾名思义,直接以2维图像作为输入,以深度图为输出进行训练::监督方法的监督信号基于深度图的地面真值,因此单目深度估计可以看作是一个回归问题。从单个深度图像设计神经网络来预测深度。利用预测深度图和实际深度图之间的差异来监督网络的训练 L2损失

上面给的例子是KITTI数据集中的一组例子,不过深度图可能看的不是很明显,我重新将深度图涂色之后:

深度网络通过近似真值的方法来学习场景的深度。基于不同结构和损失函数的方法:据我们所知,Eigen等人首先用CNNs解决单目深度估计问题。该体系结构由两个组成部分组成(全局粗尺度网络和局部精细尺度网络),在文献中用于从单个图像进行端到端的深度图预测。

基于条件随机场的方法:Li等人提出了一种基于多层的条件随机场(CRFs)的细化方法,该方法也被广泛应用于语义分割。在深度的估计中,考虑到深度的连续特征,可以广泛地使用CRF的深度信息,因此可以广泛地应用于深度的估计中。

基于对抗性学习的方法:由于提出的对抗性学习在数据生成方面的突出表现,近年来成为一个研究热点。各种算法、理论和应用已得到广泛发展。对抗式学习深度估计的框架如图所示。

file
  • 无监督算法

首先,所谓的“无监督”虽然不需要输入真实深度信息,但需要输入双目摄像头获取到的同一时刻不同角度的图像或者前后帧图像,只是这样就叫做无监督在我看来略显牵强。

有监督学习方法要求每幅RGB图像都有其对应的深度标签,而深度标签采集通常需要深度相机或激光雷达,前者范围受限后者成本昂贵。再者,采集的原始深度标签通常是一些稀疏的点,不能与原图很好的匹配。因此不用深度标签的无监督估计方法是近年的研究趋势,其基本思路是利用左右视图,结合对极几何与自动编码机的思想求解深度。 

由于深度数据的获取难度较高,所以目前有大量算法都是基于无监督模型的。即仅仅使用两个摄像机采集的双目图像数据进行联合训练。其中双目数据可彼此预测对方,从而获得相应的视差数据,再根据视差与深度的关系进行演化。亦或是将双目图像中各个像素点的对应问题看作是立体匹配问题进行训练。左视图-右视图示例:

视差,以我们人眼为例,两只眼睛看到的图像分别位于不同的坐标系。将手指从较远地方慢慢移动到眼前,会发现,手指在左眼的坐标系中越来越靠右,而在右眼坐标系中越来越靠左,这种差异性就是视差。与此同时,可以说明,视差与深度成反比。除此之外,由于摄像机参数也比较容易获取,所以也可以以相机位姿作为标签进行训练。

同时同一水平线上的两个照相机拍摄到的照片是服从以下物理规律的:

在图中, Z 为场景所距离我们的深度, X为三维场景映射到的二维图像平面,也就是最终我们得到的二维图像所在的平面。 f为相机的焦距。 b为两个相机之间的距离,Xl和 Xr 分别为相同物体在左右两个不同相机中成像的坐标。根据以上信息,和简单的三角形相似规律我们可以得到:

这种思路最先应用于使用单张图片生成新视角问题:DeepStereo 和 Deep3d之中, 在传统的视角生成问题之中,首先会利用两张图(或多张)求取图片之间的视差d,其次通过得到的视差(相当于三维场景)来生成新视角。

基于可解释性掩模的方法:基于投影函数的视图重建算法依赖于静态场景假设,即动态目标在相邻帧上的位置不满足投影函数,从而影响测光度误差和训练过程。

基于传统视觉里程计的方法:用传统的直接视觉里程计回归的位姿来辅助深度估计,而不是使用位姿网络估计的位姿。直接视觉里程计利用深度网络生成的深度图和一个三帧图像,通过最小化光度误差来估计帧间的姿态,然后将计算出的姿态发送回训练框架。因此,由于深度网络由更精确的姿态来监督,因此深度估计的精度显着提高。

基于多任务框架的方法:最近的方法在基本框架中引入了额外的多任务网络,如光流、物体运动和相机内参矩阵,作为一个附加的训练框架,加强了整个训练任务之间的关系

基于对抗学习的方法:将对抗学习框架引入到无监督的单目深度估计中。由于在无监督训练中没有真正的深度图。因此,将视图重建算法合成的图像和真实图像作为鉴别器的输入,而不是使用鉴别器来区分真实深度图和预测深度图。

  • Structure from motion/基于视频的深度估计(无监督学习)

这一部分中既包含了单帧视频的单目深度估计,也包含了多帧间视频帧的像素的立体匹配,从而近似获取多视角图像,对相机位姿进行估计。

评估指标:

在单目深度估计问题中,常用的精度评估指标有相对误差(REL)、均方根误差(RMS)、对数误差(LG)及阈值误差(% correct)

深度估计相关数据集 

在深度估计的研究中,由于室内外场景类型与深度范围具有较大的差异,对应不同的场景分别会构造不同的数据集

  • 真实场景数据集
    • NYU depth v2(来自纽约大学)是常用的室内数据集之一,
      • 选取了464个不同的场景,
      • 利用RGB相机和微软的Kinect深度相机同时采集室内场景的RGB信息深度信息,收集了407 024帧RGBD图像对构建数据集。
      • 由于红外相机和摄像机之间的位置偏差,深度相机采集的原始深度图存在缺失部分或是噪点,
      • 作者从中选取了1 449幅图像,利用着色算法对深度图进行填充得到稠密深度图,同时人工标注语义信息
    • Make3D(斯坦福大学)是常用的室外场景数据集之一,
      • 使用激光扫描仪采集室外场景的深度信息,
      • 选取的场景类型为白天的城市和自然风光,深度范围是5~81 m,大于该范围统一映射为81 m。
      • 数据集共包含534幅RGBD图像对,其中400幅用于训练,134幅用于测试。
    • KITTI(德国卡尔斯鲁厄理工学院和美国丰田技术研究院)自动驾驶领域常用的数据集之一,链接:http://www.cvlibs.net/datasets/kit
      • 包含深度数据标签
      • 通过一辆装配有2台高分辨率彩色摄像机、2台灰度摄像机、激光扫描仪和GPS定位系统的汽车采集数据,其中激光扫描仪的最大测量距离为120 m。
      • 图像场景包括卡尔斯鲁厄市、野外地区以及高速公路。
      • 数据集共包含93 000个RGBD训练样本。
    • Depth in the Wild(DIW)(密歇根大学)以相对深度作为标签的数据集
      • 从词典中随机选取单词作为搜索关键字,然后从互联网中收集得到原始的RGB图像。
      • 标注工作外包给专门的工作人员,为了更加高效,每一幅图像选取了两个高亮的点,工作人员只需判定两个点的远近关系即可。
      • 对于采样点对之间的位置关系,采用50%随机采样,另外50%对称采样的方法以使构建的数据集尽可能平衡。最终获得的有效标注图像约5×E11张。
    • Cityscapes. Cityscapes的数据取自德国的50多个城市的户外场景,其中数据包含有左右视角图像、视差深度图、相机校准、车辆测距、行人标定、目标分割等,同时也包含有类似于vKITTI的虚拟渲染场景图像。其中简单的左视角图像、相机标定、目标分割等数据需要利用学生账号注册获取,其他数据需要联系管理员获取。链接:https://www.cityscapes-dataset.com/
  • 虚拟场景数据集
    • SceneNet RGB-D数据集
    • SYNTHIA数据集
    • 由于是通过虚拟场景生成,数据集中包括更多天气、环境及光照,场景类型多样。各数据集有各自的优缺点,在实际研究中,应根据具体研究问题来选择合适的数据集。

 综上,可以看到基于深度学习的单目深度估计是本领域的发展方向。目前,该领域的发展主要集中在数据集和深度学习模型两方面。首先,数据集的质量在很大程度上决定了模型的鲁棒性与泛化能力,深度学习要求训练数据必须有更多的数量、更多的场景类型,如何构建满足深度学习的数据集成为一个重要的研究方向。目前,基于虚拟场景生成深度数据具有不需要昂贵的深度采集设备、场景类型多样、节省人力成本等优势,结合真实场景和虚拟场景的数据共同训练也是未来深度学习方法的趋势。其次,为了提高深度学习估计单幅图像深度的精度,要求更新的更复杂的深度框架。除了神经网络模型本身结构的优化,更新颖的算法设计也能有效地提升预测精度。研究工作大多采用有监督回归模型对连续的绝对深度值进行回归拟合。考虑到场景由远及近的特性,也有用分类模型进行绝对深度估计的方法。由深度信息和其他信息之间的互补性,部分工作结合表面法线等信息提升深度预测的精度。深度学习发展迅速,新的模型层出不穷,如何将这些模型应用于单幅图像深度估计问题中需要更加深入地研究。另外,探索神经网络在单目深度估计问题中学到的是何种特征也是一个重要的研究方向。

对于单目深度估计模型,目前主要分为基于回归/分类的监督模型,基于双目训练/视频序列的无监督模型,以及基于生成学习的图像风格迁移模型。大概从2017年起,即CVPR2018开始,单目深度估计的效果就已经达到了双目深度估计的效果,主要是监督模型。但是由于现有的数据集主要为KITTI、Cityscapes、NYU DepthV2等,其场景和相机都是固定的,从而导致监督学习下的模型无法适用于其他场景,尤其是多目标跟踪这类细节丰富的场景,可以从论文中看到,基本上每个数据集都会有一个单独的预训练模型。

对于GAN,其对于图像风格的迁移本身是一个很好的泛化点,既可以用于将场景变为晴天、雾天等情况,也可以用于图像分割场景。但是深度估计问题中,像素点存在相对大小,因此必定涉及到回归,因此其必定是监督学习模型,所以泛化性能也不好。对于无监督的算法,可能场景适应性会更好,但依旧不适用于对行人深度的估计。

参考文献

[1] Long J, Shelhamer E, Darrell T. Fully convolutional networks for semantic segmentation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 3431-3440.

[2] Ronneberger O, Fischer P, Brox T. U-net: Convolutional networks for biomedical image segmentation[C]//International Conference on Medical image computing and computer-assisted intervention. Springer, Cham, 2015: 234-241.

[3] Laina I, Rupprecht C, Belagiannis V, et al. Deeper depth prediction with fully convolutional residual networks[C]//2016 Fourth international conference on 3D vision (3DV). IEEE, 2016: 239-248.

[4] Fu H, Gong M, Wang C, et al. Deep ordinal regression network for monocular depth estimation[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2002-2011.

[5] Godard C, Mac Aodha O, Brostow G J. Unsupervised monocular depth estimation with left-right consistency[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017: 270-279.

[6] Dosovitskiy A, Fischer P, Ilg E, et al. Flownet: Learning optical flow with convolutional networks[C]//Proceedings of the IEEE international conference on computer vision. 2015: 2758-2766.

[7] Ilg E, Mayer N, Saikia T, et al. Flownet 2.0: Evolution of optical flow estimation with deep networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 2462-2470.

[8] Mayer N, Ilg E, Hausser P, et al. A large dataset to train convolutional networks for disparity, optical flow, and scene flow estimation[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 4040-4048.

[9] Xie J, Girshick R, Farhadi A. Deep3d: Fully automatic 2d-to-3d video conversion with deep convolutional neural networks[C]//European Conference on Computer Vision. Springer, Cham, 2016: 842-857.

[10] Luo Y, Ren J, Lin M, et al. Single View Stereo Matching[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.

[11] Zhou T, Brown M, Snavely N, et al. Unsupervised learning of depth and ego-motion from video[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017: 1851-1858.

[12] Yin Z, Shi J. Geonet: Unsupervised learning of dense depth, optical flow and camera pose[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 1983-1992.

[13] Zhan H, Garg R, Saroj Weerasekera C, et al. Unsupervised learning of monocular depth estimation and visual odometry with deep feature reconstruction[C]// Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 340-349.

[14] Goodfellow I, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[C]//Advances in neural information processing systems. 2014: 2672-2680.

[15] Radford A , Metz L , Chintala S . Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks[J]. Computer Science, 2015.

[16] Arjovsky M, Chintala S, Bottou L. Wasserstein gan[J]. arXiv preprint arXiv:1701.07875, 2017.

[17] Gulrajani I, Ahmed F, Arjovsky M, et al. Improved training of wasserstein gans[C]//Advances in Neural Information Processing Systems. 2017: 5767-5777.

[18] Mao X, Li Q, Xie H, et al. Least squares generative adversarial networks[C]//Proceedings of the IEEE International Conference on Computer Vision. 2017: 2794-2802.

[19] Mirza M, Osindero S. Conditional generative adversarial nets[J]. arXiv preprint arXiv:1411.1784, 2014.

[20] Isola P, Zhu J Y, Zhou T, et al. Image-to-image translation with conditional adversarial networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 1125-1134.

[21] Wang T C, Liu M Y, Zhu J Y, et al. High-resolution image synthesis and semantic manipulation with conditional gans[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 8798-8807.

[22] Zhu J Y, Park T, Isola P, et al. Unpaired image-to-image translation using cycle-consistent adversarial networks[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2223-2232.

[23] Wang T C , Liu M Y , Zhu J Y , et al. Video-to-Video Synthesis[J]. arXiv preprint arXiv:1808.06601,2018.

[24] Zheng C, Cham T J, Cai J. T2net: Synthetic-to-realistic translation for solving single-image depth estimation tasks[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 767-783.

[25] Atapour-Abarghouei A, Breckon T P. Real-time monocular depth estimation using synthetic data with domain adaptation via image style transfer[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2800-2810.

[26] Nekrasov V , Dharmasiri T , Spek A , et al. Real-Time Joint Semantic Segmentation and Depth Estimation Using Asymmetric Annotations[J]. arXiv preprint arXiv:1809.04766,2018.

[27] Nekrasov V , Shen C , Reid I . Light-Weight RefineNet for Real-Time Semantic Segmentation[J]. arXiv preprint arXiv:1810.03272, 2018.

[28] Lin G , Milan A , Shen C , et al. RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition.,2017:1925-1934

[29] Zou Y , Luo Z , Huang J B . DF-Net: Unsupervised Joint Learning of Depth and Flow using Cross-Task Consistency[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018:36-53.

[30] Ranjan A, Jampani V, Balles L, et al. Competitive collaboration: Joint unsupervised learning of depth, camera motion, optical flow and motion segmentation[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 12240-12249.

多模态|BLIP 、CoCa and BeiTv

BLIP

BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation

代码: https://github.com/salesforce/BLIP

本文是 ALBEF 原班人马做的,基本可以看做吸收了 VLMo 思想的 ALBEF。训练的 loss 和技巧都与 ALBEF 一致,属于 ALBEF 的后续工作。

本文motivation主要有两个:一是之前多模态预训练模型结构要么是基于编码器,不能直接用于生成任务,要么是基于编码解码器,在检索类任务上不方便,本文设计的结构包含单模态编码器、视觉指导文本编码器、视觉指导文本解码器,可以方便地用对比学习、ITM(Image-Text Matching ( ITM ): 图文匹配任务,针对的是图文交互流,即判断当前pair是不是匹配(就是个分类任务))、LM(生成式任务)三个预训练任务训练不同的模块,也容易迁移到各种下游任务中;二是之前的很多工作通过扩充了网上搜集的图文对的预训练数据(GCC、SBU、CC12M),提高了模型效果,但忽略了其中有很多不对齐的噪声情况,本文用一个boostrapping的方法,用captioner为网络图片生成描述,用filter过滤掉不配对的数据,从而降低噪声,更高效地利用网络上的数据。

关键的改进:

1. 模型结构上整合了 ALBEF 和和 VLMo。VLMo 参数共享,但是不存在单独编码器;ALBEF 存在单独编码器但是部分参数不共享。这篇论文存在单独的 vision encoder 和 text encoder。多模态的参数是以 cross-attention 模块插入到文本编码器实现的,cross-attention 模块享受文本编码器的参数(可以看 col 2 和 col3)

2. 增加了解码器(参考 col 4),为了做生成任务。解码器拿到视觉特征和未掩码的语言特征,过一个 casual self-attention 层,做 GPT 用的那种 lm 任务。这里区别于 MLM 的那种 mask 机制,是通过 causal self-attention 来实现因果推理的,我此时还不熟悉这个过程。

3. 除了上面的主要部分,还有一个重要的部分是利用训练好的模型生成伪标签。将训练好的模型里的不同的部分拿出来在 COCO 上稍微微调一下,decoder 部分可以生成文本,算 ITM loss 的那个模块可以做 image-text pair 的过滤,通过输出打分、置信度的方式。在实验中,BLIP 的解码能力似乎很强,用这种范式生成的文本不仅人看着觉得不错,用于自训练后也可以涨点 2-3,非常显着。

   一个例子是 stable diffusion 的官方博文里提到了,他们在做微调时,会遇到数据集只有图片没有 caption 的情况,比如 pokeman 数据。他们用 BLIP 来做caption生成,然后微调 stable diffusion 发现效果很好。

   另一个例子是知名的开源多模态数据集 LAION,他们也用了 BLIP 来辅助制作数据集。他们的过程在官网公布了,可以参考。

总结:个人感觉模型部分的改进可能有用可能没有用,但是解码器输出的 caption 确实是不错。以至于很多下游任务都拿 BLIP 来生成 caption。

CoCa

Contrastive Captioners are Image-Text Foundation Models

代码: https://github.com/lucidrains/CoCa-pytorch

它也是 ALBEF 的后续工作,模型非常像。区别在于:

1. 图像用了 attentional pooling,这在本文的实验中有效

2. 去掉了 ITM loss,目的是加快训练,原本文本需要 forward 2-3 次,去掉 ITM loss 之后只需要 forward 一次就可以了。在 ALBEF 中,ITM 需要完整的 text,而 MLM 需要掩码,所以是两次输入。在 BLIP 中,ITC 一次,ITM 因为在文本模型中插入了新的模块,所以得单独做前向。而 LM 因为用了既多了新的模块又得用 causal self-attention 所以又得单独做一次。在 CoCa 中,为了完成 captioning loss 和 ITC loss,只需要做一次前向即可。GPT 中把 cls-token 放在最后面就可以得到全局表征来做 ITC loss 了。

简单快速的方法可以有效地 scale,而我们知道复杂的模型设计、loss 设计经常不如简单地放大模型、增加数据有效。参考凯明的 FLYP。

这种画图的方式很不错,很直观。可以参考,以后也画成这样。

总结:

简单有效的结构设计,我对 CoCa 的印象是简单有效。它的峰值性能我没有感觉很炸裂,可能是模型、数据 scale 之后自然的结果。但是它的 zero-shot 性能让我印象很深刻,在 imagenet 上微调不微调的差距很小,这一点非常非常关键。

读到 coca,我对多模态的疑问还有两点:

1. mixture of experts 的结构没有在本文中得到应用,但我感觉是个相当有前途的结构

2. 双向的生成 loss 还是没人做,谁说只能图像辅助文本?

BeiTv

(BEiT-3) Image as a Foreign Language: BEiT Pretraining for All Vision and Vision-Language Tasks

论文的卖点是大一统。在 introduction 章节详细介绍了大一统指的是统一模型、loss 和数据。我觉得可以简单地概括为:用统一的 multi-way transformer (mixture of experts ) 架构和单个 masked modeling loss,将任意模态看做是同一个模态来建模。

具体而言,它指的是在将任意模态输入网络后,都表现为 list of tokens,直接将它们看做是相同的模态来做 masked modeling 就好了。如果想要拿过去做下游任务的话,直接将需要的那部分模型拿出来即可。比如做视觉任务就拿视觉模型,做语言任务就拿语言模型。如果是做多模态任务,可以灵活地模拟不同的需求,比如:1. 做生成任务可以拿多模态部分的参数出来 2. 做图文检索可以单独取出视觉部分和语言部分来模拟 CLIP。不仅仅是能做任意任务,还继承了前作的优点,比如 CLIP 这种弱跨模态交互带来的计算效率的优势。

总结:

Neural Corpus Indexer—文档检索

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

神经语料库索引for文档检索

最近一篇Neural Corpus Indexer基于transformer的文档检索引发了争论。【知乎】所指论文为NeurIPS2022 Outstanding Paper A Neural Corpus Indexer for Document Retrieval。 根据OpenReview上的Revisions记录,Rebuttal阶段的最后修改应该是https://openreview.net/references/pdf?id=y45TgWUfyF,此时Table 1内容为:

但Camera Ready版本是https://openreview.net/references/pdf?id=-bt0HSi9__,此时Table 1的内容为:

特别值得注意的是,在Rebuttal阶段,作者的General Response指出他们的工作即使去掉query generation进行公平比较,也远胜于基线:

但是根据Camera Ready版本的Table 1(见上)和Table 3

NCI(Base) w/ QG是65.86 NCI(Large) w/ QG是66.23 NCI(Base) w/o QG是46.41。如果NCI(Large) w/o QG像w/ QG的设置一样只比Base高0.37,那么它将低于Table 1中的SEAL(Large),而根据General Response,作者认可SEAL是w/o QG的设置。

反思:其实在机器学习里面,如果你的实验有了好的结果,尤其是特别好的结果,那么90%的情况都是有bug造成的。所以在效果比较好的情况时候一定要去仔细检查,看看是否有数据泄漏的情况。这个错误是比较常见的。

文本检索:在一堆的文本里面,将那些跟Query相关的文档找出来。是信息检索里最大的分支。相关信息检索的会议有:SigIR、WSDN、KDD、 NeurIPS (这个 NeurIPS 上文本检索的文章比较少,是一个偏算法的会议)

摘要:

当前最主流的的文档检索解决方案主要是基于索引检索方法,索引就是指对文档做一下哈希值或者embedding,但是索引很难直接针对最终检索目标结果进行优化。 因为哈希是一个固定的算法,或者词嵌入也不一定是根据用户最终的目标来做训练的。在这篇论文中,我们的目标是展示一个端到端的深度神经网络网络统一训练和检索阶段,可以显着提高召回率。在检索方面,召回率相比于准确率更加重要,因为需要把相关的文档全部都找出来,不希望遗漏。在这个文章中,作者提出了一个基于equence-to-sequence network(NCI),针对特定的query来说直接生成相关文档的id。为了提升NCI性能,提出了一个解码器(refix-aware weight-adaptive decoder),还使用了一些其他技术:query的生成、带语义的文档的ID和一致性的正则表达项。

摘要的写法比较常见:该领域之前的方法是怎样的,我们使用一个神经网络做一个端到端的学习,从原始的数据直接生成你要的一个结果。

导言:

文档检索和排序是标准网络搜索引擎的两个关键阶段。 第一,文档检索阶段就是给定一个query,来查询相关的候选文档,然后进行排名阶段为每个文档提供更精确的排名分数。 排名阶段通常由深度神经网络,将每对查询和文档作为输入并预测它们的相关性分数。 然而,一个精确的排名模型是非常昂贵的(对每一个查询对都要去预测分数),所以通常只有一百或一千个检索的候选结果。 因此,召回性能文档检索阶段对网络搜索引擎的有效性至关重要。(检索的这几百个候选结果应该要把所有相关的都包含进来才好)。

其实除了检索的召回率很重要,对于一个检索系统来说,性能是十分重要的,作者在这没有提到,对于一个搜索引擎来说,文档数量在千百亿以上,这个也是这篇文章的一个硬伤,就是太贵了。

现有的文档检索方法可以分为两类,即term-based和基于语义的方法。基于 term 术语的检索方法一般会构建一个倒排索引对整个网络语料库(可以认为就是一个字典,字典里的每个key就是查询,key的值就是对应这个文档id(key出现在该文档中))这个方法非常高效,但它们几乎无法捕获文档语义并且无法检索到类似的不同措辞的文件(比如我输入“文件”,找到的结果只是含有该“文件“的文档,对于文件的相似表达”file“,无法检索到)。 因此,提出了基于语义的方法 来减轻这种差异。基于语义的方法就是把query和文档分别映射成向量(使用twin-tower architecture架构)。然后使用近似K紧邻搜索感兴趣的的K个文档。这种方法的缺点:对于精确匹配exact match,(苹果13和苹果12)表现不好。另外就是ANN近邻算法某些情况(query和文档之间的关系复杂)下也不太好。

端到端的相关工作:一个是DSI,Differentiable Search Index,文本到文本的生成,一个纯transformer,DSI 中的解码器没有充分利用文档标识符的层次结构。第二个SEAL 通过利用段落中的所有 n-gram 作为其标识符id。

twin-tower architecture

Neural Corpus Indexer

神经语料库索引器 (NCI) 是一种序列到序列的神经网络模型。 该模型将查询作为输入并输出最相关的文档标识符 (docid),它可以通过大量<query, docid>对进行训练。

下图就是这个模型的示意图。每次用户输入的是查询query,模型输出的是docID。那文本检索中的文档在哪?文档不可能作为输入送进模型,因为文档数量太大了,开销比较大。这个模型预测的时候不会看到文档的信息,但是做检索肯定需要模型知道各个文档的信息,所以就需要把这些文档全部放入这个模型。所以这部分数据分为两部分,一部分就是<query,docID>查询对。另一部分就是大量的被检索的文档<doc,docID>,因为模型预测的是query到docid的映射,所以需要让模型记住文档和docid的关系,常见做法就是用<doc,docid>无标号的数据去让模型记住全部的文档,当然这里可以把一个<doc,docID>对拆分成多个<query,docid>对,就是把doc里的句子给拆分成query会比较好做一些。模型的设计里有一些比较重要的点:(1)如何设计一个docID,而并非简单的数字,最好docID能够表示doc之间的语义信息。(2)如何将文档分出比较好的query,使得文档自己的语义和它的ID之间做好映射。同时分出的query能够跟预测时候的用户查询query有一定的相似性。(3)模型如何设计?编解码器和loss

NCI示意图

上图就是对应的三个关键点。

  • 如何生成语义的ID:层次Kmeans算法

首先,上图中所有的灰点都代表不同的文档,首先对所有的文档做一个K-means聚类(k=3),不同的类给与不同的id(1,2,3),作为文档id的前缀,如果某个类里面的文档数量多于某个阈值C,他就会对这个类进一步做K-means,继续分出K个子类和对应的id。因此如果两个文档的前缀相近,表示俩个文档的距离比较近。这种层次化标号的好处是如果面对10000中类别标号,直接用一个softmax来对其分类是不好的,有了层次化的标号,就可以分层次预测类别。

  • 从文本生成query

1、DocT5Query:sequence to sequence的模型,将Doc 翻译成 Query的模型。如何使用:将用于检索的文档输入到该模型,来获得多个query的输出(随机采样方法)。

2、Document as Query,像DSI一样,先把每个文档最先的64个term词作为一个query。然后随机在文档的随机位置选择10组,每组64个词作为query。(共11个query)

Prefix-aware weight-adaptive decoder:

r0,r1,r2就是不同层次的类别的id。相比传统的解码器,作者更加考虑到了r0,r1,r2之间的相对位置关系,因此解码器的输入不再是r0,r1,而是包含位置的(1,r0),(2,r1)。实验表明包含位置的解码器输入对于模型提升很大!!!!

另外作者认为在解码器的最后的softmax的全值W对于不同的ri是一样的,这样是不好的,因此希望不同的r对应不同权重。

因此新的Wi如下所示:不仅包含Wi,也包含前面的r0到ri-1的这些信息。

损失函数:

1、增加一个对比学习损失函数,希望同一个query生成的id之间相似度更加接近一些。

2、标准的 cross entropy损失函数

实验

数据集(问答数据集文档来自wiki):

评价指标:

1、Recall@N:表示在获得的N个结果中有没有自己想要的文档

2、MRR: 表示返回结果的排序情况,我们想要的文档在所有结果中的排序情况

结果:

消融实验

性能:在32G的v100上面,时延在100ms还是可以的,但是吞吐量只有50多个query对于搜索引擎来说是不能忍受的。工业部署上还是有一定的距离。

缺点:1、大数据集:目前只是在32万的文档上训练结果,但要是真的用于web搜索,数以亿计的文档需要的模型会很大。2、推理的时延和吞吐量 3、面对新的文档,如何去更新模型?