轻量化模型
Mobile系列(V1~V3)
MobileNetV1
MobileNetV1之所以轻量,与深度可分离卷积的关系密不可分
深度可分离卷积 主要是两种卷积变体组合使用,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。
逐通道卷积的一个卷积核只有一个通道,输入信息的一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样
逐通道卷积虽然减少了计算量,但是这种每个通道独立的卷积运算失去了通道维度上的信息交互。因此需要Pointwise Convolution来将这些Feature maps进行组合生成新的Feature maps
逐点卷积的运算与常规卷积运算非常相似,其实就是1X1的卷积,将上一步的feature maps在通道方向上进行加权组合,生成新的feature map
深度可分离卷积的参数个数是常规卷积的约1/3,计算量也是常规卷积的约1/3
MBConv:深度可分离卷积的基本结构
MobileNetV2
V2 中主要用到了 Inverted Residuals 和 Linear Bottlnecks
ResNet 在模型中引入旁路并取得了很好的效果,因此到了 V2 的时候,作者也想引入进来
要把 ResNet BottleNeck Block 运用到 MobileNet 中来的话,如果我们还是采用相同的策略显然是有问题的,因为 MobileNet 中由于逐通道卷积,本来 feature 的维度就不多,如果还要先压缩的话,会使模型太小了,所以作者提出了 Inverted Residuals,即先扩展(6倍)后压缩,这样就不会使模型被压缩的太厉害
Linear Bottlnecks就是把 Inverted Residuals block 中的 bottleneck 处的 ReLU 去掉
那为什么要去掉呢?而且为什么是去掉最后一个1X1卷积后面的 ReLU 呢?因为在训练 MobileNet V1 的时候发现最后 Depthwise 部分的 kernel 训练容易失去作用,最终再经过ReLU出现输出为0的情况
1X1卷积降维操作本来就会丢失一部分信息,而加上 ReLU 之后那是雪上加霜,所以去掉 ReLU 缓一缓
MobileNetV3
在V2上的调整是基于NAS技术的:设计一个网络模型结构的集合,通过不同网络层的排列组合可以组合出许多许多的模型,再通过NAS搜索技术搜索出最佳的网络结构
原始的结构用 1x1 的卷积来调整 feature 的维度,从而提高预测的精度,但是这一部分也会造成一定的延时,为了减少延时,作者把 average pooling 提前,这样的话,这样就提前把 feature 的 size 减下来了(pooling 之后 feature size 从 7x7 降到了 1x1)。这样一来延时减小了,但是试验证明精度却几乎没有降低
换了个激活函数 h-swish:
ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),如果对ReLU的激活范围不加限制,当激活值非常大,分布在一个很大的范围内时,低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失
增加了 SE 结构,并且将含有 SE 结构部分的 expand layer 的 channel 数减少为原来的 1/4 以减少延迟
RepViT
轻量级 ViTs 优于轻量级 CNNs 的原因通常归结于多头注意力模块,该模块使模型能够学习全局表征。然而,轻量级 ViTs 和轻量级 CNNs 在块结构、宏观和微观架构设计方面存在值得注意的差异,但这些差异尚未得到充分研究。这自然引出了一个问题:轻量级 ViTs 的架构选择能否提高轻量级 CNN 的性能?
首先将训练条件与轻量级 ViTs 对齐,接着我们对 MobileNetV3-L 的块结构进行优化。进一步,我们在宏观尺度上进行设计,包括主干、降采样层、分类器和各阶段块数目比例。最后,我们在微观尺度上调整网络,包括卷积核大小选择和 SE [8] 层位置,下图展示了我们在每个步骤的中获得的延迟和精度结果
轻量级 ViTs 的块结构具有一个重要的设计特征,即 MetaFormer [12] 结构:分离的 token mixer 和 channel mixer。因此我们对 MobileNetV3-L 的块结构进行改造,使其 token mixer 和 channel mixer 进行分离。如下图中(a)所示,原始的 MobileNetV3 块由 1*1 扩展卷积组成、然后是深度卷积和 1*1 投影层。1*1 扩展卷积层和1*1 投影层可实现通道之间的互动,深度卷积则有助于融合空间信息。前者和后者分别对应于 channel mixer 和 token mixer。如图(b)所示,我们将深度卷积上移以分离两者。同时,我们采用结构重参数化 [5] ,在训练时为深度卷积引入多分支拓扑结构,以提高性能。在推理过程中,如图(c)所示,在推理过程中,深度卷积多分枝结构可合并为单分支结构,消除多分支带来的额外计算和内存成本。我们将这样的块结构命名为 RepViT 块
此外,轻量级 ViTs 在 channel mixer 中把扩展比例统一设置为2(MobileV3-Ls为6),并增加整体宽度,对四个阶段分别采用48,96,192,384的通道数
轻量级 ViTs 通常采用 early convolutions :连续堆叠的3*3卷积,作为输入stem,相比 ViT 原始的 Patch 操作可以达到更好的精度和延迟。而MobileNetV3-L设置初始卷积通道数为16,这限制了主干的表达能力。因此,将原始 stem 替换为 early convolutions,并把初始卷积通道数增大为24
轻量级 ViTs 通常采用分离的降采样层,同时进行加深以尽量避免降采样带来的信息损失。作为对比,如下图(a),MobileNetV3-L使用同样的块结构进行降采样,将块中间的深度卷积步长改为2以降低特征图的分辨率。如图(b),在使用RepViT的块结构后,分辨率变动由上面的深度卷积完成,通道数变动由下面的1*1卷积完成。我们首先在深度卷积后增加单独的1*1卷积变更通道数,如图(c),以使降采样层与块结构解耦。在此基础上,降采样层由前面的RepViT块及后面的FFN进一步加深
MobileNetV3-L 使用了较为复杂的分类头,如图(a)。由于 MobileNetV3-L 原始输出特征图通道数较少,因此其分类头通过使用额外的1*1卷积和全连接层将特征图映射到更高的维度上,以获得更强的拟合能力。然而,这也形成了延迟瓶颈。此外,在块结构设计中,网络的整体宽度已经加宽,所以我们将分类头更改为轻量级 ViTs 中常用的简单分类头,即池化层加全连接层,如图(b)
多头注意力机制相比卷积的一大优势是数据驱动性质,能根据输入调整权重。SE 层通过引入通道注意力可以很好的弥补卷积网络在这方面的不足。MobileNetV3-L 中的SE层不均匀分布,且集中到后面的阶段。而 TResNet [16] 表明由于后面的阶段处理的特征图分辨率更低,SE 层依赖对特征图进行全局池化,因此加入 SE 层的收益更低。此外,考虑到加入SE层会引入额外的延迟,我们设计了交叉使用SE层的策略,来对所有阶段引入 SE
最终,我们获得了 RepViT 网络,结构如下图
图像识别
MAGE
识别和生成是人工智能领域中的两大核心任务,如果能将二者合并到一个统一的系统中,这两个任务应该能实现互补:图像生成的输入是低维度的特征或噪声,而输出是高维度的原始图像;与之相反,图像识别的输入是高维度的原始图像,而输出是低维度的特征
与MIM直接作用于图像的掩码方法不同,MAGE 提出了基于图像语义符的 masked image token modeling 方法
MAGE 首先使用 VQGAN [3] 编码器将原始图像转换为离散的语义符。之后,MAGE 对其进行随机掩码,并使用基于 transformer 的 encoder-decoder 结构对掩码进行重构,重构后的语义符可以通过 VQGAN 解码器生成原始图像。通过在训练中使用不同的掩码率,MAGE 可以同时进行生成模型(接近 100% 掩码率)和表征学习(50%-80% 掩码率)的训练
RAM
涵盖了大部分常用标签,数量适中,为 6449 个。其余的开放词汇标签可通过开放集识别来识别
Tag2Text采用轻量级识别解码器与原始图像编码器相结合,通过图像标记和标题的集成,展示了卓越的图像标记能力。然而,Tag2Text 的有效性仅限于识别固定和预定义的类别。相比之下,RAM 通过将语义信息合并到标签查询中,实现了对以前看不到的类别的泛化
Image Encoder: 为 Swin-Transformer,用来提取图像的特征
Image-Tag Recognition Decoder: 为 Bert 模型,接收图像特征和 Label 特征,输出图像 Tags
Image-Tag-Text Encoder-Decoder: 为 Bert 模型,接受图像特征和 Tag,输出图像描述 Caption, Text
训练阶段,Image-Tag Recognition Decoder 用于预测 tags
推理阶段,Image-Tag Recognition Decoder 生成的 tags 用于指导 generation
这里的 Recognition decoder 输入的每个query 在结果和图像特征的交叉注意力之后,会经过线性层 + sigmoid得到0~1的值,进行二分类,因为queries 是使用 文本的embedding,也就是说每个queries在初始化时就确定了语义。因此想实现开集,只需要在初始化时使用新类别的embedding进行初始化即可
图像分割
SAM
首先将提示的概念从 NLP 转化为分割,提示可以是一组前景/背景点、一个粗略的方框或mask、自由形式的文本,或者,一般来说,指示图像中要分割的内容的任何信息。因此,可提示分割任务就是在给出任何提示的情况下,返回一个有效的分割掩码
Image encoder:使用 MAE预训练的视觉转换器(ViT),并对其进行了最小化调整,以处理高分辨率输入
Prompt encoder:我们考虑了两组提示:稀疏(点、方框、文本)和密集(mask)。我们使用位置编码表示点和方框,并与每种提示类型的学习嵌入相加;使用 CLIP的现成文本编码器表示自由格式文本。密集提示(即masks)则使用卷积法嵌入,并与图像嵌入相加
Mask decoder:解码器块使用提示自注意和双向交叉注意(提示到图像嵌入,反之亦然)来更新所有嵌入。运行两个区块后,我们对图像嵌入进行上采样,然后用 MLP 将输出标记映射到动态线性分类器,再计算每个图像位置的掩码前景概率
OMG-seg
先前的模型通常使用共享的视觉骨干,有几个特定任务的分支,但OMG-Seg采用了共享的编码器-解码器架构
将所有任务的输出统一为一个统一的查询表示。一个查询可以表示一个掩模标签/图像或掩模/唯一的ID/视觉提示。然后,采用一个共享的解码器处理所有类型的查询及其特征
通过在合并的图像和视频数据集上进行共同训练,OMG-Seg能够处理多达十种不同的分割任务,涵盖不同的数据集
OMG-Seg遵循Mask2Former的架构设计。如图所示,它包含一个骨干网络、一个像素解码器和一个掩码解码器
使用VLM编码器作为冻结骨干 为了实现开放词汇的识别,在骨干部分,本文采用冻结的CLIP视觉模型作为特征提取器
像素解码器作为特征适配器 像素解码器与Mask2Former相同,包含多阶段的可变形注意力层。它将冻结特征转换为具有相同通道维度的融合特征
合并的目标查询 对于图像,目标查询侧重于目标级别的定位和识别。对于视频,目标查询可能涉及时间一致性,例如同一目标跨越不同帧。对于交互式分割,目标查询被迫定位特定区域。对于图像和视频输入,本文采用目标查询来表示图像掩码或被跟踪的tube掩码。对于交互模式,按照SAM 的做法,本文采用提示编码器将各种视觉提示编码成与目标查询相同形状的查询。可以共享Transformer解码器的相同接口。
共享的多任务解码器 其主要操作是交叉注意力,接收合并的目标查询和图像/视频特征 ,并输出精炼的目标查询。最终的掩码是通过精炼查询和高分辨率特征的点积获得的。
对于图像语义级别的任务,使用多尺度特征进行掩码交叉注意力。 然后,对精炼的查询应用多头自注意力层
对于视频任务,本文采用相同的交叉注意力设计。唯一的区别是金字塔特征沿着时间维度与3D位置嵌入连接。合并的视频特征和精炼的查询用于预测tube掩码
对于交互式分割,本文执行相同的交叉注意力设计。然而,本文跳过自注意力,以避免在多头自注意力层中的掩模查询之间发生交互,因为交互式分割只关心输入视觉提示区域。在获取精炼的目标查询后,它经过一个预测FFN,通常包括一个带有ReLU激活层和线性投影层的3层感知器
解码过程以级联的方式进行,每个特征金字塔有三个阶段
目标识别
Yolo系列(v1~v8)
把目标检测转变成一个回归问题,利用整张图作为网络的输入,仅仅经过一个神经网络,得到bounding box(边界框) 的位置及其所属的类别
Yolov1
基于GoogLeNet的自定义网络
网络输出:7×7×30的预测结果
YOLOv1将一张图片平均分成7×7个网格,每个网格分别负责预测中心点落在该网格内的目标。在Faster R-CNN中,是通过一个RPN来获得目标的感兴趣区域,这种方法精度高,但是需要额外再训练一个RPN网络。在YOLOv1中,通过划分得到了7×7个网格,这49个网格就相当于是目标的感兴趣区域
每个网格要预测 B 个bounding box,每个 bounding box 要预测 (x, y, w, h) 和 confidence 共5个值。
每个网格还要预测一个类别信息,记为 C 个类。
总的来说,S×S 个网格,每个网格要预测 B个bounding box ,还要预测 C 个类。网络输出就是一个 S × S × (5×B+C) 的张量
在实际过程中,YOLOv1把一张图片划分为了7×7个网格,并且每个网格预测2个Box(Box1和Box2),20个类别。所以实际上,S=7,B=2,C=20。那么网络输出的shape也就是:7×7×30
使用的是差方和误差。需要注意的是,w和h在进行误差计算的时候取的是它们的平方根,原因是对不同大小的bounding box预测中,相比于大bounding box预测偏一点,小box预测偏一点更不能忍受。而差方和误差函数中对同样的偏移loss是一样(2-1=3-2)。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将bounding box的w和h取平方根代替原本的w和h(√2-√1≠√3-√2)
定位误差比分类误差更大,所以增加对定位误差的惩罚,使 λ coord = 5
在每个图像中,许多网格单元不包含任何目标。训练时就会把这些网格里的框的“置信度”分数推到零,这往往超过了包含目标的框的梯度。从而可能导致模型不稳定,训练早期发散。因此要减少了不包含目标的框的置信度预测的损失,使 λ noobj = 0.5
YOLOv2
采用 Darknet-19 作为特征提取网络
相比于YOLOv1是利用全连接层直接预测Bounding Box的坐标,YOLOv2借鉴了Faster R-CNN的思想,引入Anchor机制。利用K-means聚类的方法在训练集中聚类计算出更好的Anchor模板,大大提高了算法的召回率。同时结合图像细粒度特征,将浅层特征与深层特征相连,有助于对小尺寸目标的检测
在YOLOv1中,作者设计了端对端的网路,直接对边界框的位置(x, y, w, h)进行预测。这样做虽然简单,但是由于没有类似R-CNN系列的推荐区域,所以网络在前期训练时非常困难,很难收敛。于是,自YOLOv2开始,引入了 Anchors box 机制,希望通过提前筛选得到的具有代表性先验框Anchors,使得网络在训练时更容易收敛。
在 Faster R-CNN 算法中,是通过预测 bounding box 与 ground truth 的位置偏移值 t x , t y 间接得到bounding box的位置。其公式如下:
这个公式是无约束的,预测的边界框很容易向任何方向偏移。因此,每个位置预测的边界框可以落在图片任何位置,这会导致模型的不稳定性。
因此 YOLOv2 在此方法上进行了一点改变:预测边界框中心点相对于该网格左上角坐标(Cx, Cy)的相对偏移量,同时为了将bounding box的中心点约束在当前网格中,使用 sigmoid 函数将 tx , ty 归一化处理,将值约束在0-1
其中蓝色的是要预测的bounding box,黑色虚线框是Anchor box
YOLOv2 在最后一个卷积层输出 13×13 的 feature map,意味着一张图片被分成了13×13个网格。每个网格有5个anchor box来预测5个bounding box,每个bounding box预测得到5个值:tx 、 ty 、 tw 、 th 和 to (类似YOLOv1的confidence)
YOLOv1 有一个致命的缺陷就是:一张图片被分成7×7的网格,一个网格只能预测一个类,当一个网格中同时出现多个类时,就无法检测出所有类。针对这个问题,YOLOv2做出了相应的改进:
用416×416大小的输入代替原来的448×448,使得网络输出的特征图有奇数大小的宽和高,进而使得每个特征图在划分单元格的时候只有一个中心单元格(Center Cell)
采用Faster R-CNN中的方式,每个Cell可预测出9个Anchor Box,共13×13×9=1521个(YOLOv2确定Anchor Boxes的方法见是维度聚类,每个Cell选择5个Anchor Box)。比YOLOv1预测的98个bounding box 要多很多,因此在定位精度方面有较好的改善
YOLOv2通过添加一个Passthrough Layer:先获取前层的26×26的特征图,将其同最后输出的13×13的特征图进行连接,而后输入检测器进行检测
Passthrough层与ResNet网络的shortcut类似,抽取前面层的每个2×2的局部区域,然后将其转化为channel维度,对于26×26×512的特征图,经Passthrough层处理之后就变成了13×13×2048的新特征图,这样就可以与后面的13×13×1024特征图连接在一起形成13×13×3072的特征图
YOLOv3
特征提取部分采用darknet-53网络结构代替原来的darknet-19,利用特征金字塔网络结构实现了多尺度检测,分类方法使用逻辑回归代替了softmax
为了能够预测多尺度的目标,YOLOv3 选择了三种不同shape的Anchors,同时每种Anchors具有三种不同的尺度,一共9种不同大小的Anchors
借鉴特征金字塔网的思想,YOLOv3设计了3种不同尺度的网络输出Y1、Y2、Y3,目的是预测不同尺度的目标。由于在每一个尺度网格都负责预测3个边界框,且COCO数据集有80个类。所以网络输出的张量应该是:N ×N ×[3∗(4 + 1 + 80)]。由下采样次数不同,得到的N不同,最终Y1、Y2、Y3的shape分别为:[13, 13, 255]、[26, 26, 255]、[52, 52, 255]
在YOLOv2中,用softmax进行分类,softmax会假设这个目标只属于一个类别。然而在一些复杂的场景中,单一目标可能从属于多个类别。为实现多标签分类就需要用逻辑分类器来对每个类别都进行二分类
YOLOv4
YOLOv4 = CSPDarknet53(主干) + SPP附加模块(颈) + PANet路径聚合(颈) + YOLOv3(头部)
YOLOv4对深度学习中一些常用Tricks进行了大量的测试,最终选择了这些有用的Tricks:WRC、CSP、CmBN、SAT、 Mish activation、Mosaic data augmentation、CmBN、DropBlock regularization 和 CIoU loss
更适合在单GPU上训练,训练快
CSPNet的主要目的是能够实现更丰富的梯度组合,同时减少计算量。这个目标是通过将基本层的特征图分成两部分,然后通过一个跨阶段的层次结构合并它们来实现的
引入SPP,显著地增加了感受野,分离出了最重要的上下文特征
在YOLOv4中,具体的做法就是:分别利用四个不同尺度的最大池化对上层输出的feature map进行处理
PAN:主要包含FPN、Bottom-up path augmentation、Adaptive feature pooling、Fully-connected fusion四个部分
FPN发表于CVPR2017,主要是通过融合高低层特征提升目标检测的效果,尤其可以提高小尺寸目标的检测效果。
Bottom-up Path Augmentation的引入主要是考虑网络浅层特征信息对于实例分割非常重要,因为浅层特征一般是边缘形状等特征。
Adaptive Feature Pooling用来特征融合。也就是用每个ROI提取不同层的特征来做融合,这对于提升模型效果显然是有利无害。
Fully-connected Fusion是针对原有的分割支路(FCN)引入一个前背景二分类的全连接支路,通过融合这两条支路的输出得到更加精确的分割结果。
YOLOv5
将 Focus 结构引入了YOLOv5,用于直接处理输入的图片,通过降维和压缩输入特征图,从而减少计算量和提高感受野,同时提高目标检测的精度和模型的表达能力
以YOLOv5s的结构为例,原始608x608x3的图像输入Focus结构,采用切片操作,先变成304x304x12的特征图,再经过一次32个卷积核的卷积操作,最终变成304x304x32的特征图
在YOLOv3、YOLOv4中,是通过K-Means方法来获取数据集的最佳anchors,这部分操作需要在网络训练之前单独进行。为了省去这部分"额外"的操作,Yolov5的作者将此功能嵌入到整体代码中,每次训练时,自适应的计算不同训练集中的最佳锚框值
YOLOv6
YOLOv6的Backbone不再使用Cspdarknet,而是转为比Rep更高效的EfficientRep。每一个3×3的卷积添加平行了一个1x1的卷积分支和恒等映射的分支
它的Neck也是基于Rep和PAN搭建了Rep-PAN;而Head则和YOLOX一样,进行了解耦,并且加入了更为高效的结构。
值得一提的是,YOLOv6也是沿用anchor-free的方式,抛弃了以前基于anchor的方法。
除了模型的结构之外,它的数据增强和YOLOv5的保持一致;而标签分配上则是和YOLOX一样,采用了simOTA;并且引入了新的边框回归损失:SIOU。
YOLOv7
通过控制最短最长的梯度路径,更深的网络可以有效地学习和收敛。 在本文中,提出了基于 ELAN 的扩展 ELAN(E-ELAN)
E-ELAN 使用了 expand、shuffle、merge cardinality来实现对 ELAN 网络的增强
- 首先,使用组卷积来增大通道和计算块的基数 (所有计算块使用的组参数及通道乘数都相同)
- 接着,将计算块得到的特征图 shuffle 到 g 个组,然后 concat,这样一来每个组中的特征图通道数和初始结构的通道数是相同的
- 最后,将 g 个组的特征都相加
对于基于级联的模型,我们不能单独分析不同的缩放因素,而必须一起考虑。当我们缩放一个计算块的深度因子时,我们还必须计算该块的输出通道的变化。然后只缩放计算块的深度,转换层的其余部分只进行宽度的缩放
YOLOv8
YOLOv5中的C3模块被替换成了C2f模块,进一步的轻量化。C2f模块就是参考了C3模块以及ELAN(来自YOLOv7)的思想进行的设计,通过并行更多的梯度流分支,获得更丰富的梯度信息,进而或者更高的精度和更合理的延迟
用了解耦的输出头部,分别进行类别和边界框的回归学习
抛弃了以往的Anchor-Base,使用了Anchor-Free的思想
模块
SE模块
为了提高网络的表示能力,许多现有的工作已经显示出增强空间编码的好处。而作者专注于通道,希望能够提出了一种新的架构单元,通过显式地建模出卷积特征通道之间的相互依赖性来提高网络的表示能力
输入特征图X的每一层都经过一个2D空间核的卷积最终得到C个输出的feature map,组成特征图U
为了解决利用通道依赖性的问题,选择将全局空间信息压缩到一个信道描述符中,即使用通道的全局平均池化,将包含全局信息的W×H×C 的特征图直接压缩成一个1×1×C的特征向量Z,C个feature map的通道特征都被压缩成了一个数值,这样使得生成的通道级统计数据Z就包含了上下文信息,缓解了通道依赖性的问题
为了利用压缩操作中汇聚的信息,采用了两层全连接构成的门机制,第一个全连接层把C个通道压缩成了C/r个通道来降低计算量,再通过一个RELU非线性激活层,第二个全连接层将通道数恢复回为C个通道,再通过Sigmoid激活得到权重s,最后得到的这个s的维度是1×1×C
为什么这里要有两个FC,并且通道先缩小,再放大?因为一个全连接层无法同时应用relu和sigmoid两个非线性函数,但是两者又缺一不可。为了减少参数,所以设置了r比率
将前面得到的注意力权重加权到每个通道的特征上,特征图U中的每个feature map乘以对应的权重,得到SE模块的最终输出
P-Conv
用于带mask或缺失的生成、修复领域
部分卷积的核心思想在于,它不是对输入的所有数据进行统一的卷积操作,而是根据数据的有效性(即数据是否缺失)动态调整卷积核的作用区域。具体来说,对于每一个卷积窗口,PConv仅对那些有效的、非缺失的数据点应用卷积核,并忽略那些缺失的数据点
实现PConv的一个关键步骤是定义一个二进制掩码来区分数据点的有效性。具体来说,对于每个数据点,如果它是有效的,则在对应的掩码位置标记为1;如果数据点缺失,则标记为0。在进行卷积操作时,同时对原始数据和掩码进行卷积,卷积核只会应用于掩码值为1的位置
生成模型
VQGAN
VQGAN使用了两阶段的图像生成方法:
- 训练时,先训练一个图像压缩模型(包括编码器和解码器两个子模型),再训练一个生成压缩图像的模型。
- 生成时,先用第二个模型生成出一个压缩图像,再用第一个模型复原成真实图像
VQVAE是VQGAN的前作,它有着和VQGAN一模一样两阶段图像生成方法。不同的是,VQVAE没有使用GAN结构,且其配套的压缩图像生成模型是基于CNN的。为提升VQVAE的生成效果,作者提出了两项改进策略:1) 把图像压缩模型换成GAN;2) 基于CNN的图像生成模型用Transformer代替
VQVAE的学习目标是用一个编码器把图像压缩成离散编码,再用一个解码器把图像尽可能地还原回原图像
但小图像的离散取值之间没有关联,而真实图像的像素值其实是一个连续颜色的离散采样。由于神经网络不能很好地处理这种离散量,在实际实现中,编码并不是以整数表示的,而是以类似于NLP中的嵌入向量的形式表示的。VAE使用了嵌入空间(又称codebook)来完成整数序号到向量的转换
VQVAE采取了一种离散化策略:把每个输出向量ze(x)替换成嵌入空间中最近的那个向量zq(x)。ze(x)的离散编码就是zq(x)在嵌入空间的下标
再训练另一个VQGAN,把约束图像压缩成另一套压缩图片。这一套压缩图片和生成图像的压缩图片有着不同的codebook,把这个0~9的约束信息添加到Transformer的输入s<i之前,以实现由类别约束的图像生成
LVM
数据:为这些数据定义了一种通用的格式, 即视觉句子, 而不需要任何超越像素层面的知识
- 单张图片 (Single images). {图像, EOS}
- 图像序列 (Image sequences). 从现有的视频数据集中获取视频数据, 并采用三种不同的步幅 (10, 20, 30) 随机下采样视频, 形成16帧的视觉句子;利用来自 Objaverse 数据集合成的3D对象, 生成一对象为中心的多视角序列, 涵盖各种对象;使用来自 ImageNet 的类别, 将相同类别的图像组合在一起, 形成一个16帧的视觉句子.
- 带标注的图像 (Images with annotations). 将相同注释类型的 8 个图像对连接在一起形成 16 个图像对视觉句子;对于包含相同图像对 k 个不同注释的数据集, 对每组 1 + k 个图像 (输入+ k 个输出), 随机选择 m 个元素, m ≤ n + 1 ≤ 16 ,n 是被选择的输出数, 将这些 m 元组连接起来形成视觉序列.
- 带标注的图像序列 (Image sequences with annotations). {frame1, annot1, frame2, annot2, …}或{frame1, frame2, annot1, annot2, …}
训练分为两个阶段:
- 训练一个大型的视觉标记器 (visual tokenizer), 它操作于单个图像上, 将图像转换成一系列视觉词元 (token).
- 训练一个自回归的 Transformer 模型, 每个视觉句子都表示为一系列的的词元 (token).
使用 VQGAN 生成 tokens而非patch操作,因为模型离散类别的输出自然地形成了一个概率分布, 这可以更方便的在视觉句子中条件生成新图像时采样
VQGAN tokenizer 独立地在各个图像上操作, 而不是在整个视觉句子上操作. 这种独立性使 tokenizer 的训练与下游的 Transformer 模型分开, 使得 tokenizer 可以在单个图像的数据集上进行训练, 而不必考虑视觉句子的分布
采用了 LLaMA 的 Transformer 架构, 使用4096个 tokens 的上下文长度, 即可以容纳16幅图像组成的视觉句子. 在每个视觉句子的开头添加一个开始 token ([BOS]), 结束添加一个句子结束 token ([EOS])