您的位置:首页 > 娱乐 > 明星 > 创意网页设计模板_可以看帖子的网站_磁力兔子_惠州疫情最新消息

创意网页设计模板_可以看帖子的网站_磁力兔子_惠州疫情最新消息

2025/1/9 23:01:20 来源:https://blog.csdn.net/weixin_49587977/article/details/144951161  浏览:    关键词:创意网页设计模板_可以看帖子的网站_磁力兔子_惠州疫情最新消息
创意网页设计模板_可以看帖子的网站_磁力兔子_惠州疫情最新消息

我自己的原文哦~    https://blog.51cto.com/whaosoft/12765587

#FlowVid

文本指导的视频到视频(V2V)合成在各个领域具有广泛的应用,例如短视频创作以及更广泛的电影行业。扩散模型已经改变了图像到图像(I2I)的合成方式,但在视频到视频(V2V)合成方面面临维持视频帧间时间一致性的挑战。在视频上应用 I2I 模型通常会在帧之间产生像素闪烁。

为了解决这个问题,来自得州大学奥斯汀分校、Meta GenAI 的研究者提出了一种新的 V2V 合成框架 ——FlowVid,联合利用了源视频中的空间条件和时间光流线索(clue)。给定输入视频和文本 prompt,FlowVid 就可以合成时间一致的视频。文生视频下一站,Meta已经开始视频生视频了

  • 论文地址:https://huggingface.co/papers/2312.17681
  • 项目地址:https://jeff-liangf.github.io/projects/flowvid/

总的来说,FlowVid 展示了卓越的灵活性,可与现有的 I2I 模型无缝协作,完成各种修改,包括风格化、对象交换和局部编辑。在合成效率上,生成 30 FPS、512×512 分辨率的 4 秒视频仅需 1.5 分钟,分别比 CoDeF、Rerender 和 TokenFlow 快 3.1 倍、7.2 倍和 10.5 倍,并且保证了合成视频的高质量。

先来看下合成效果,例如,将视频中的人物转换成「希腊雕塑」的形态:

将吃竹子的大熊猫转换成「国画」的形式,再把大熊猫换成考拉:

方法简介

一些研究采用流来导出像素对应关系,从而产生两帧之间的像素级映射,这种对应关系随后用于获取遮挡掩码或构建规范图像。然而,如果流估计不准确,这种硬约束可能就会出现问题。

FlowVid 首先使用常见的 I2I 模型编辑第一帧,然后传播这些编辑到连续帧,使得模型能够完成视频合成的任务。

具体来说,FlowVid 执行从第一帧到后续帧的流变形(flow warp)。这些变形的帧将遵循原始帧的结构,但包含一些遮挡区域(标记为灰色),如图 2 (b) 所示。

如果使用流作为硬约束,例如修复遮挡区域,则不准确的估计将持续存在。因此,该研究尝试引入额外的空间条件,例如图 2 (c) 中的深度图,以及时间流条件。联合时空条件将纠正不完美的光流,从而得到图 2 (d) 中一致的结果。

研究者基于 inflated 空间控制 I2I 模型构建了一个视频扩散模型。他们利用空间条件(如深度图)和时间条件(流变形视频)对模型进行训练,以预测输入视频。

在生成过程中,研究者采用编辑 - 传播程序:(1) 用流行的 I2I 模型编辑第一帧。(2) 使用本文模型在整个视频中传播编辑内容。解耦设计允许他们采用自回归机制:当前批次的最后一帧可以是下一批次的第一帧,从而使其能够生成冗长的视频。

实验及结果

细节设置

研究者使用 Shutterstock 的 100k 个视频来训练模型。对于每个训练视频,研究者按顺序采样 16 个间隔为 {2,4,8} 的帧,这些帧代表持续时间为 {1,2,4} 秒的视频(视频的 FPS 为 30)。所有图像的分辨率都通过中心裁剪设置为 512×512。模型的训练是在每个 GPU 上以 1 的批量大小进行的,总共使用 8 个 GPU,总批量大小为 8。实验使用了 AdamW 优化器,学习率为 1e-5,迭代次数为 100k。

在生成过程中,研究者首先使用训练好的模型生成关键帧,然后使用现成的帧插值模型(如 RIFE )生成非关键帧。默认情况下,以 4 的间隔生成 16 个关键帧,相当于 8 FPS 下的 2 秒片段。然后,研究者使用 RIFE 将结果插值到 32 FPS。他们采用比例为 7.5 的无分类器引导,并使用 20 个推理采样步骤。此外,研究者还使用了零信噪比(Zero SNR)噪声调度器 。他们还根据 FateZero ,融合了在对输入视频中的相应关键帧进行 DDIM 反转时获得的自注意力特征。

研究者从公开的 DAVIS 数据集中选取了 25 个以物体为中心的视频,涵盖人类、动物等。针对这些视频,研究者人工设计了 115 个 prompt,范围包括风格化到物体替换。此外,他们还收集了 50 个 Shutterstock 视频,并为这些视频设计了 200 个 prompt。研究者对以上视频进行了定性和定量的比较。

定性结果

在图 5 中,研究者定性地将本文方法与几种代表性的方法进行了比较。当输入视频中的运动量较大时,CoDeF 产生的输出结果会出现明显的模糊,在男子的手和老虎的脸部等区域可以观察到。Rerender 通常无法捕捉到较大的运动,如左侧示例中的桨叶运动。TokenFlow 偶尔会难以按照提示进行操作,例如在左侧示例中将男子变为海盗。相比之下,本文的方法在编辑能力和视频质量方面更具优势。

定量结果

研究者进行了一项人类评估,以将本文的方法与 CoDeF 、Rerender 和 TokenFlow 进行比较。研究者向参与者展示了四段视频,并要求他们在考虑时间一致性和文本对齐的情况下,找出哪段视频的质量最好。详细结果见表。本文方法取得了 45.7% 的偏好,优于其他三种方法。表 1 中还展示了各方法的管道运行时间,对比了它们的运行效率。本文方法(1.5 分钟)快于 CoDeF(4.6 分钟)、Rerender(10.8 分钟)和 TokenFlow(15.8 分钟),分别快 3.1 倍、7.2 倍和 10.5 倍。

消融实验

研究者将图 6(a)中的四种条件进行组合研究,分别是 (I) 空间控制:例如深度图 ;(II) 流变形视频:从第一帧使用光流变形的帧;(III) 流遮挡遮罩指示哪些部分被遮挡(标记为白色);(IV) 第一帧。

图 6(b)中评估了这些条件的组合,通过与包含所有四种条件的完整模型的胜率来评估它们的有效性。由于缺乏时间信息,纯空间条件的胜率仅为 9%。加入流变形视频后,胜率大幅提高至 38%,突出了时间引导的重要性。研究者使用灰色像素表示被遮挡的区域,这可能会与图像中的原始灰色相混淆。为了避免可能出现的混淆,他们进一步加入了二进制流遮挡掩码,更好地帮助模型识别哪部分被遮挡。胜率进一步提高到 42%。最后,研究者增加了第一帧条件,以提供更好的纹理引导,这在遮挡掩码较大而原始像素剩余较少时尤为有用。

研究者在 FlowVid 中研究了两种类型的空间条件:canny 边缘和深度图。在图 7(a)所示的输入帧中,从熊猫的眼睛和嘴巴可以看出,canny 边缘比深度图保留了更多细节。空间控制的强度反过来会影响视频编辑。在评估过程中,研究者发现,当希望尽可能保持输入视频的结构(如风格化)时,canny 边缘效果更好。如果场景变化较大,如物体交换,需要更大的编辑灵活性时,深度图的效果会更好。

如图 8 所示,虽然 ϵ-prediction 通常用于扩散模型的参数化,但研究者发现它可能会出现不自然的跨帧全局色彩偏移。尽管这两种方法都使用了相同的流变形视频,但 ϵ-prediction 带来了不自然的灰暗色彩。这种现象在图像到视频中也有发现。

局限

虽然 FlowVid 取得了显著的性能,但也存在一些局限性。首先,FlowVid 严重依赖于第一帧的生成,而第一帧在结构上应与输入帧保持一致。如图 9(a)所示,编辑后的第一帧将大象的后腿识别为前鼻子。错误的鼻子会传播到下一帧,导致最终预测结果不理想。其次,是当摄像机或物体移动得太快,以至于出现大面积遮挡时。在这种情况下,FlowVid 会猜测缺失的区域,甚至产生幻觉。如图 9 (b) 所示,当芭蕾舞演员转动身体和头部时,整个身体部分都被遮挡住了。FlowVid 成功地处理了衣服,但却将后脑勺变成了前脸,如果在视频中显示,这将十分惊悚。

#StableIdentity

来自大连理工大学的IIAU团队提出StableIdentity,允许用户只需上传一张图片,通过优化学习身份,即可结合包含动作、背景、风格的文本提示实现图像定制生成,并且无需微调即可插入视频/3D生成。

该方法可以直接与ControlNet等基于Stable Diffusion的即插即用的模块配合使用,甚至可以将学习到的身份插入现成的视频/3D生成的模型中,而无需进行微调即可产生出色的效果。单图即可变身超人

project page:https://qinghew.github.io/StableIdentity/

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

github:https://github.com/qinghew/StableIdentity(代码即将开源)

一、引言:

随着扩散模型的发展,定制化生成任务受到广泛关注。这项任务旨在为文本到图像模型注入新的主题(如身份),并在对齐输入文本提示的同时,生成在不同语境下主题一致的图像。例如,用户可以上传自己的照片以获得有趣的图片,如 "穿着超人服装"。定制生成的成功可以促进许多应用,如个性化肖像照片虚拟试穿和艺术设计。

然而,现有的定制方法是通过微调模型的部分/全部参数或学习通用编码器来解决这一问题的。参数微调方法需要花费很长时间来搜索最佳参数,但往往会返回一个不准确的平凡解来表示身份。尤其是在只有单张图像的情况下,这些方法往往会过拟合输入图像,导致可编辑性下降。另外,基于编码器的方法需要大规模的数据集进行训练,很难捕捉到独特的身份和细节。此外,目前的方法所学习到的身份在不同的语境下容易与目标身份不一致。因此,迫切需要提出一种新的框架来解决这一任务所面临的巨大挑战(如身份保持不稳定、可编辑性差等)。

二、方法

在这项工作中,研究者们提出了 StableIdentity,如图所示,给定一张输入人脸图像,它将身份先验和可编辑先验集成到了人的定制生成中,旨在通过优化学习可以表示目标身份的词向量。

具体来说,本文首先引入了一个经过人脸识别任务预训练的编码器来精确地捕捉身份表示。此外,研究者们收集了在Stable Diffusion中可以在不同上下文中生成一致身份的名人姓名,构建了统一维度的嵌入空间,以作为定制生成的先验身份分布。为了激励目标身份在预训练扩散模型中表现得像名人姓名一样,本文进一步将身份表示通过AdaIN落入到这一先验空间。

三、实验结果

1.在实验环节,本文在多个指标上与6个baselines进行了定性和定量的对比。如图1和表4所示,本文的方法取得了最佳的人脸相似性、可编辑性、图像质量。

2.此外,本文进一步在与3D模型的结合上与同类型基于词向量的方法进行了对比,可以看出StableIdentity可以更好地插入到3D生成中。 

本文用TSNE可视化了学到的身份编码与具有可编辑性的名人名字编码的2D分布。可以看出,本文的StableIdentity学到的embedding分布更加紧凑,更接近于真实的名人名字embedding的分布。

3.本文也用单张名人照片作为输入进行了实验,可以看出,学到的身份在图像/视频/3D上都表现不错。更多的结果可以在https://qinghew.github.io/StableIdentity/中查看

四、展望

这一方法可以直接与ControlNet等基于Stable Diffusion的即插即用的模块配合使用,甚至可以将学习到的身份插入现成的视频/3D生成的模型中,而无需进行微调即可产生出色的效果。这项工作被认为是统一图像、视频和3D定制化生成任务的重要一步。未来的工作将进一步探索通过更高效的方式学习泛化性强的身份表示,以更好地适应和解决实际应用中的挑战。

#Fairy

就今天的人工智能发展水平来说,文生图、图生视频、图像/视频风格迁移都已经不算什么难事。Meta的视频合成新框架又给了我们一点小小的震撼。14秒就能重建视频,还能变换角色,让视频合成提速44倍

生成式 AI 天赋异禀,能够毫不费力地创建或修改内容。尤其是图像编辑,在以十亿规模数据集为基础预训练的文本到图像扩散模型的推动下,经历了重大发展。这股浪潮催生了大量图像编辑和内容创建应用。

基于图像的生成模型所取得的成就基础上,下一个挑战的领域必然是为其增加「时间维度」,从而实现轻松而富有创意的视频编辑。

一种直接策略是使用图像模型逐帧处理视频,然而,生成式图像编辑本身就具有高变异性—即使根据相同的文本提示,也存在无数种编辑给定图像的方法。如果每一帧都独立编辑,很难保持时间上的一致性。

在最近的一篇论文中,来自Meta GenAI团队的研究者提出了 Fairy——通过对图像编辑扩散模型进行「简单的改编」,大大增强了AI在视频编辑上的表现。

以下是Fairy的编辑视频效果展示:

Fairy 生成 120 帧 512×384 视频(4 秒时长,30 FPS)的时间仅为 14 秒,比之前的方法至少快 44 倍。一项涉及 1000 个生成样本的全面用户研究证实,该方法生成质量上乘,明显优于现有方法。

怎么做到的?

据论文介绍,Fairy以基于锚点的跨帧注意力概念为核心,这种机制可隐性地跨帧传播扩散特征,确保了时间一致和高保真的合成效果。Fairy 不仅解决了以往模型在内存和处理速度等方面的局限性,还通过独特的数据增强策略提高了时间一致性,这种策略使模型等价于源图像和目标图像的仿射变换。

  • 论文地址:https://arxiv.org/pdf/2312.13834.pdf
  • 项目主页:https://fairy-video2video.github.io/

方法

Fairy在扩散模型特征的背景下对以前的跟踪-传播(tracking-and-propagation)范式进行了重新审视。特别是,该研究用对应估计( correspondence estimation)架起了跨帧注意之间的桥梁,使得模型在扩散模型内可以跟踪和传播中间特征。

跨帧的注意力图可以解释为一种相似性度量,用来评估各个帧中token之间的对应关系,其中一个语义区域的特征会将更高的注意力分配给其他帧中的相似语义区域,如下图3所示 。

因此,当前的特征表示通过注意力帧间相似区域的加权和进行细化和传播,从而有效地最小化帧之间的特征差异。

一系列操作下来产生了基于锚点的模型,这是 Fairy 的核心组件。

为了确保生成视频的时间一致性,该研究采样了K个锚点帧,从而提取扩散特征,并且提取的特征被定义为一组要传播到连续帧的全局特征。当生成每个新帧时,该研究针对锚点帧的缓存特征将自注意力层替换为跨帧注意力。通过跨帧注意力,每个帧中的 token都采用锚点帧中表现出类似语义内容的特征,从而增强一致性。

实验评估

在实验部分,研究者主要基于指令型图像编辑模型来实现Fairy,并使用跨帧注意力替换模型的自注意力。他们将锚帧的数量设置为3。模型可以接受不同长宽比的输入,并将较长尺寸的输入分辨率重新扩展为512,并保持长宽比不变。研究者对输入视频的所有帧进行编辑,而不进行下采样。所有计算在8块A100 GPU上分配完成。

定性评估

研究者首先展示了Fairy的定性结果,如下图5所示,Fairy可以对不同的主题进行编辑。

在下图6中,研究者展示了Fairy可以按照文本指令来进行不同类型的编辑,包括风格化、角色变化、局部编辑、属性编辑等。   

下图9展示了Fairy可以根据指令将源角色转换为不同的目标角色。

定量评估

研究者在下图7中展示了整体质量比较结果,其中Fairy生成的视频更受欢迎。

下图10展示了与基线模型的视觉比较结果。

#ELIC图像压缩算法

讲述ELIC图像压缩算法理论基础及详细解析,除此之外还补充了可以改进的地方。 

信息量

信息熵 

KL 散度

也叫相对熵。用于衡量两个概率分布之间的差异。其值越大, 则两个概率分布的差异越大; 当两个概率分布完全相等时相对熵值为 0 。

交叉嫡

KL 散度可以被用于计算代价,而在特定情况下最小化 KL 散度等价于最小化交叉熵。而交叉熵的运算更简单,所以常用交叉熵来当做代价。

熵编码

摘编码即编码过程中按熵原理不丢失任何信息的编码。熵编码需要知道独立分布的待编码变量及其概率。常见的熵编码有: 香农(Shannon)编码、哈夫曼(Huffman)编码、算术编码 (Arithmetic Coding)、非对称数字系统编码(ANS)等。

自编码器(AE)

输入无标签数据从中提取有效低维特征, 并利用低维特征重构出输入数据。

不难发现,图像压缩和解压的过程本质就是自编码器结构,压缩就是提取图像中的低维重要特征,方便传输和存储,解压则是根据压缩特征恢复原始图像的过程。所以图像压缩算法的架构基于自编码器,而自编码器还应用于数据可视化分析、以图搜图等。

变分自编码器(VAE)

自编码器 (AE) 存在的问题:

自编码器本质上通过训练数据学到的是 “输入图片-特征编码-重构图片” 之间固定的映射关系。

但是如果我们输入一张 “四分之一月” 的图片或者直接在编码空间取位置 1 和 3 之间的位置 2 编码值, 输入解码器是否能重构出输入图片呢? 此时解码器由于缺少对应 “特征编码 -重构图片” 对应的映射关系, 两个相邻编码值之间也不存在任何关联, 模型也无从知道位置 2 编码值的重构结果应该介于位置 1 和 3 编码值之间, 输出结果就会出现模糊或乱码。这也说明了自编码器存在泛化性差且不具备生成能力的缺陷。

图 4 变分自编码器正向传播

超先验变分图像压缩模型

根据 VAE 推导出损失函数定义:

第二项代表重构损失。

第三、四项代表相应交叉嫡, 代表编码长度损失。

ELIC

图8ELIC模型结构(红色箭头代表压缩路线,绿色箭头代表解压路线,紫色箭头代表共用路线)

本文在基于超先验变分图像压缩模型架构的基础上, 提出对编码特征进行空间和通道两个维度融合的上下文结构 SCCTX,与超先验信息融合之后共同预测编码特征之间存在的依赖关系用于摘模型编解码。其中通道维度还进行不均匀分组并按照信息重要程度顺序存储,空间维度采用两阶段棋盘格方法加速。   

改进 1

项目要求满足随机渐进压缩(随机丢包均能解压出图片), 原版 ELIC 虽然也支持渐进压缩, 但是限制只能末端丢包, 不满足要求。为此我们进行第一项改进, 将 ELIC 的通道维度上下文中通道间的联系 “斩断” (图 9 中红色虚线), 这样通道间不存在依赖关系, 当前解压包就不需要前一个解压包信息才能解压。

改进 2

针对输出的压缩包大小不够均匀的问题, 将通道数全部改为 64 , 保证各个包的理论容量相同。在损失函数中对不同压缩包的 bpp 损失计算方差并加入损失函数监督训练, 结果有效保证了各个压缩包的大小均匀。

改进 3

针对 MSE-optimized 模型在 bpp 较小时出现的模糊问题, 在损失函数中引入 LPIPS 损失,该损失更加注重肉眼主观视觉效果, 最终在 bpp 变化不大的情况下解压图片的清晰度有较大提升。根据参考文献 5、6, 还可以引入 GAN-loss 来进一步增强重构图片的真实视觉效果。

#DiffusionEdge

现有的深度边缘检测网络通常基于包含了上下采样模块的编码器 - 解码器架构,以更好的提取多层次的特征,但这也限制了网络输出既准又细的边缘检测结果。

针对这一问题,一篇 AAAI 2024 上的论文给出了新的解决方案。

  • 论文题目:DiffusionEdge: Diffusion Probabilistic Model for Crisp Edge Detection
  • 作者:叶云帆(国防科技大学),徐凯(国防科技大学),黄雨行(国防科技大学),易任娇(国防科技大学),蔡志平(国防科技大学)
  • 论文链接: https://arxiv.org/abs/2401.02032
  • 开源代码: https://github.com/GuHuangAI/DiffusionEdge

国防科技大学 iGRAPE Lab 提出了首个用于二维边缘检测任务的扩散概率模型方法,通过学习迭代的去噪过程获得边缘结果图,去噪过程如图 1 所示。为了在保留最终性能的同时减少计算资源的消耗,该方法在隐空间中训练网络,并引入了不确定性蒸馏模块以更好的优化。同时,本方法还采用解耦架构来加速去噪过程,并提出了相应的自适应傅立叶滤波器来调整特征。基于这些设计,本方法得以用有限的资源进行稳定的训练,用更少的增强策略来预测清晰准确的边缘图。在四个公共基准数据集上的大量实验表明,本文提出的方法在准确度和粗细度上全面超越了其他方法。

图 1 基于扩散概率模型的边缘检测过程与优势示例

本文的创新点包括:

1、提出了领域内第一个针对边缘检测任务的扩散模型 DiffusionEdge,无需任何后处理即可预测出更细更准确的边缘图。

2、针对扩散模型应用时的难点,设计了多种技术以确保方法能在隐空间中稳定学习,同时保留像素级的不确定性先验知识并自适应地过滤傅立叶空间中的隐特征。

3、在四个边缘检测公共基准数据集上开展的大量对比实验展示了 DiffusionEdge 在准确度和细度方面均具有卓越的性能优势。

相关工作

基于深度学习的方法通常采用包含上下采样的编解码结构集成多层特征 [1-2],或是整合多个标注的不确定性信息以提升边缘检测的准确度 [3]。然而,天然受限于这样的结构,其生成的边缘结果图对于下游任务来说太过粗厚而严重依赖后处理的问题仍然亟待解决。尽管许多工作已经在损失函数 [4-5] 和标签修正策略 [6] 方面做出了探索以使网络能输出更细的边缘,但本文认为该领域仍然需要一个可以不借助任何额外模块,就能直接满足准确度和细度的边缘检测器,而无需任何后处理步骤。

扩散模型是一类基于马尔可夫链的生成模型,通过学习去噪过程逐渐恢复目标数据样本。扩散模型在计算机视觉、自然语言处理和音频生成等领域都表现出了卓越的性能。不仅如此,通过将图像或是其他模态的输入作为额外条件时,其在感知任务中也表现出了巨大的潜力,例如图像分割 [7]、目标检测 [8] 和姿态估计 [9] 等。

方法描述

本文所提出的 DiffusionEdge 方法总体框架如图 2 所示。受以往工作的启发,该方法在隐空间中训练具有解耦结构的扩散模型,并将图像作为额外的条件线索输入。该方法引入了自适应傅里叶滤波器来进行频率解析,且为了保留来自多个标注者的像素级不确定性信息并减少对计算资源的要求,还以蒸馏的方式直接使用交叉熵损失优化隐空间。

图 2 DiffusionEdge 的整体结构示意

针对目前的扩散模型受到采样步数太多,推理时间太长等问题的困扰,本方法受 DDM [10] 的启发,同样使用解耦的扩散模型架构来加速采样推理过程。其中,解耦的前向扩散过程由显式的转移概率和标准 Wiener 过程的组合来控制:

如图 2 所示,该方法首先训练了一对自编码器和解码器的网络,该编码器将边缘标注压缩为一个隐变量,而解码器则用于从这个隐变量中恢复出原来的边缘标注。如此一来,在训练基于 U-Net 结构的去噪网络阶段,该方法便固定这一对自编码和解码器网络的权重,并在隐空间中训练去噪过程,这样可以大幅减少网络对计算资源的消耗,同时维持不错的性能。

实验结果

本方法在四个领域内被广泛使用的边缘检测公共标准数据集上进行了实验:BSDS、NYUDv2、Multicue 和 BIPED。由于边缘检测数据标注比较难,标注数据量都比较少,以往的方法通常会使用各种策略来增强数据集。例如说,BSDS 中的图像通过水平翻转 (2×)、缩放 (3×) 和旋转 (16×) 进行增强,能够生成比原始版本扩大了 96 倍的训练集。以往的方法在其他数据集上使用的通用增强策略总结在了表格 1 中,其中 F 代表水平翻转,S 代表缩放,R 代表旋转,C 代表裁剪,G 代表伽马校正。不同的是,本方法仅需要使用随机裁剪的 320320 的图像块来训练所有数据。在 BSDS 数据集中,本方法则仅仅采用随机的翻转和缩放,其定量对比结果展示在了表 2 中。在 NYUDv2、Mu lticue 和 BIPED 数据集中,该方法仅需采用随机翻转训练。在使用更少增强策略的情况下,本方法在各个数据集,各个指标上的表现都优于之前的方法。通过观察图 3-5 的预测结果可以看出,DiffusionEdge 能够学习并预测出跟 gt 分布几乎一样的边缘检测结果图来,预测结果准确而清晰的优势对于有精细化需求的下游任务来说非常重要,也展示了其能直接应用于后续任务的巨大潜力。   

表 1 以往方法在四个边缘检测数据集上使用的增强策略

表 2 不同方法在 BSDS 数据集上的定量对比

图 3 不同方法在 BSDS 数据集上的定性对比

图 4 不同方法在 NYUDv2 数据集上的定性对比

图 5 不同方法在 BIPED 数据集上的定性对比

#MHDNet

发现一种性能更优的目标检测网络,不同的输入分辨率下,目标分布和检测头之间存在不同的匹配关系。基于这些有指导意义的发现,作者提出了一种基于检测头和目标分布之间匹配的轻量化交通目标检测网络,称为MHDNet。该模型在BDD100K数据集和提出的ETFOD-v2数据集上比其他模型具有更强的竞争性能。

多尺度检测在目标检测模型中占有重要地位。然而,研究人员通常对如何在不同输入分辨率下结合多尺度特征合理配置检测头感到空白。作者发现在不同的输入分辨率下,目标分布和检测头之间存在不同的匹配关系。基于这些有指导意义的发现,作者提出了一种基于检测头和目标分布之间匹配的轻量化交通目标检测网络,称为MHDNet

它由三个主要部分组成。第一种是检测头和目标分布匹配策略,它指导检测头的合理配置,以便利用多尺度特征有效地检测不同尺度的目标。第二个是跨尺度检测头配置指南,该指南指示用2个具有丰富特征表示的检测头替换多个检测头,以在检测精度、模型参数、FLOP和检测速度之间实现极好的平衡。第三种是感受野扩大方法,它将扩大的卷积模块与主干的浅特征相结合,以略微增加模型参数为代价,进一步提高检测精度。

该模型在BDD100K数据集和提出的ETFOD-v2数据集上比其他模型具有更强的竞争性能。

作为智能驾驶的重要组成部分,目标检测对于确保驾驶安全至关重要。通常,为了平衡FLOP的检测精度,缩放输入分辨率是一种常见的方法。作者回顾了BDD100K数据集上检测模型的细节,意外地发现不同的检测头可以在不同的输入分辨率下匹配不同尺度的目标。如图1所示,在低输入分辨率下,有大量物体与H1和H2检测头匹配。然而,随着输入分辨率的提高,与H1和H2检测头匹配的目标数量显著减少,而与H4和H5检测头匹配目标的数量显著增加。

这一发现令人兴奋,并促使重新思考现有模型中检测头的配置是否最佳。例如,在输入分辨率较低的情况下,是否可以使用3个与YOLOv5设置的检测头类似的检测头来实现最佳的检测性能,尤其是对于大量的小目标?在高输入分辨率下,5个类似于IDYOLO的检测头是否会导致检测头冗余,并增加模型优化的难度?此外,对于不同的输入分辨率,如何配置合适的检测头,以在非常不同的尺度上实现更好的交通目标检测性能?

另一方面,为了减少模型参数和提高检测速度,使用较少的检测头是一种常见的方法。Yolov3-tiny和YOLOv4-tiny使用H4和H5检测头检测物体。该方法减少了模型参数,提高了检测速度,但牺牲了检测精度。YOLOF采用单H5检测头,减少了模型参数,提高了检测精度,但对小目标的检测不友好。CornerNet和CenterNet使用单个H2检测头取得了具有竞争力的性能,但对大目标的检测性能可能不足。对于计算资源有限、目标尺度不同的交通场景,如何配置合理的检测头,在检测精度、模型参数、FLOP和检测速度之间取得良好的平衡,是一个值得研究的问题。

为了解决上述问题,首先对检测头的配置对BDD100K数据集在不同输入分辨率下的检测性能的影响进行了初步研究。

实验结果表明,3个检测头(H3-5)的检测精度低于4个检测头,低分辨率为416。高分辨率为1504,H3-5检测头的检测精度高于H2-5检测头。

作者认为,这种完全相反的结果主要是由于检测头和目标分布之间的不匹配造成的。由于输入分辨率较低,大量小目标与对应于高分辨率特征图的检测头相匹配。在这种情况下,只有3个检测头无法有效检测大量的小物体。据了解,增加H2检测头有利于小目标检测。随着高输入分辨率,目标规模整体变大,3个检测头几乎可以匹配所有目标。在这种情况下,使用更多的检测头可能会导致检测头冗余,这不利于模型优化。为了缓解不匹配导致的检测性能下降,基于上述发现做出了以下3点贡献:

 提出了一种适用的检测头和目标分布匹配策略。该匹配策略可以指导合理配置检测头,以检测不同尺度的目标。

 提出了一种简单有效的跨尺度检测头配置指南。根据该准则,可以用2个检测头代替多个检测头,这可以显著降低模型参数和FLOP,提高检测速度,同时保持较高的检测精度。

 将扩展卷积模块与骨干网的浅层特征相结合,构建了一个轻量级的交通目标检测网络,称为MHD网。实验结果表明提出的模型在BDD100K数据集和提出的ETFOD-v2数据集上取得了比其他模型更具竞争力的性能。

Multi-scale detection

多尺度检测在目标检测模型中占有重要地位。以VIT-YOLO、FCOS、VFNet和GFL为代表的模型利用5个不同的特征级别融合上下文信息,从而获得了令人印象深刻的检测性能。考虑到小目标的特征在下采样过程中容易丢失,Libra RCNN、OPANAS、ABFPN和GCA RCNN集成了4个不同的特征层次,构建了不同尺度下目标检测的检测模型。YOLOv5、YOLOv7、CSPNet和YOLOv-4-P5只使用了3种尺度的特征来表示不同尺度的对象,并且取得了优异的性能。

与上述多尺度表示不同,YOLOv3 Tiny、YOLOv 4 Tiny和YOEO将两种尺度的特征结合起来进行目标检测,从而实现检测精度、模型参数和检测速度之间的平衡。尽管这些模型取得了令人印象深刻的性能,但它们没有充分考虑不同分辨率下目标分布和检测头之间的匹配关系。在提出的方法中,基于上一节中的指导性发现,可以根据匹配关系简单合理地配置检测头,并且可以充分利用更合适和更具代表性的多尺度信息来检测不同尺度的目标。

Traffic object detection

随着智能驾驶的兴起,交通目标检测受到越来越多的关注。Yang等人提出了一种具有两个检测头的部分感知多尺度全卷积网络,用于检测行人。基于YOLOv5模型和决策树,Aboah等人构建了一个交通监控系统来监控异常交通事件,并取得了预期的效果。为了检测铁路中的目标,建立了具有先验目标检测模块和目标检测模块的DFF网络,并取得了比其他模型更好的性能。Lin等人将注意力图与多尺度特征相结合,提出了一种更加关注小规模行人的模型,并在多个数据集上取得了良好的性能。与检测交通场景中的所有物体不同,秦等人提出了IDYOLO模型来检测驾驶员注意区域内的物体,并获得了具有竞争力的结果。虽然上述多检测头模型利用多尺度特征获得了较好的结果,但没有充分考虑目标分布与检测头之间的匹配关系。根据图1所示的结果,本文充分利用两个跨尺度检测头而不是多个检测头来构建一个轻量级模型,在检测精度、模型参数、FLOP和探测速度之间取得了出色的平衡。

基于以上分析采用YOLOv5-S模型结构,用3×3卷积代替主干网第一下采样层的6×6卷积,构建了一个轻量级交通目标检测网络,称为MHDNet。它由三个主要部分组成:

第一种是检测头和目标分布匹配策略,它指导检测头的合理配置,以有效地检测不同尺度的目标。

第二个是跨尺度检测头配置指南,该指南指示用两个检测头替换多个检测头,以在检测精度、模型参数、FLOP和检测速度之间取得极好的平衡。

第三种是感受野放大方法,它将扩展卷积模块与主干的浅特征相结合,以略微增加模型参数为代价,进一步提高检测精度。MHDNet的示意图如图2所示。

检测头与目标分布匹配策略

虽然多尺度在目标检测中起着重要作用,但固定检测头配置一直是传统的模型构建范式,例如YOLOv5使用的H3-5检测头。作者发现在不同输入分辨率下,目标分布和检测头之间存在不同的匹配关系。这一发现值得重新思考,现有的检测头配置范式是最佳选择吗?此外,对于不同的输入分辨率,应该如何配置合理的检测头来检测不同尺度的交通目标?基于这种思想提出了一种简单有效的检测头与目标分布的匹配策略。首先计算第i个检测头对应的刻度范围(SR),如公式(1)所示:

跨尺度检测头配置指南 

基于检测头和目标分布匹配策略的检测头配置可以实现更好的检测精度。然而,由于采用了多个检测头,模型参数和FLOP将不可避免地增加。具有较少参数和较低FLOP的模型具有较高的检测速度和精度,是交通目标检测的理想模型。YOLOF仅使用单个H5探测头来实现竞争性能,但对小物体的探测效果较差。TTFNET通过使用单个H2探测头实现了类似的性能,但对于大型物体,可能存在探测性能下降的风险。对于不同规模的交通目标检测,一种简单的方法是将H2和H5检测头结合起来,但这种固定配置的组合是最佳选择吗?此外,对于不同输入分辨率的交通对象检测,如何配置检测头,以在检测精度、模型参数、FLOP和检测速度之间实现更好的平衡?

为了解决这个问题,提出了一种基于检测头与由公式(1)和(2)计算的目标分布之间的匹配关系的跨尺度检测头配置准则。

假设输入分辨率为800,我们知道大量目标与H2-H5检测头匹配。为了有效地检测小目标,首先选择H2探头作为检测器结构。考虑到与H3-H5头匹配的目标数量众多,仅使用一个H2头检测所有目标是不够的。因此,采用跨尺度检测头配置,即在H2头的基础上选择H4头共同构建检测器。

基于跨尺度检测头配置准则的双检测头模型不仅可以充分利用浅层和深层特征来探测不同尺度的目标,而且可以显著降低模型参数和FLOP,提高检测速度。此外,基于匹配关系,提出的跨尺度检测头配置指南可以指导利用两个检测头而不是多个检测头,以在不同输入分辨率下实现检测精度、模型参数、FLOP和检测速度之间的良好平衡。

感受野扩大法  

空洞卷积由于可以用较少的参数增加感受野,在目标检测任务中得到了广泛的应用。YOLOF、RFB-Net、LFD-Net和SA-YOLOv3将空洞卷积与深度特征相结合,以提高检测性能,但显著增加了模型参数。作者认为,对于交通目标检测而言,一种能够提高检测精度并保持较高检测速度,同时具有较少参数的模型无疑更具前景。

基于这一愿景,作者建议在主干浅层结合空洞卷积模块,以实现模型参数、检测精度、FLOP和检测速度之间的良好平衡。提出的空洞卷积模块如图3所示。其核心思想包括两个方面:

 一是尽可能少地使用卷积核和小卷积核,以减少模块参数;

 另一种方法是采用shortcut将2个不同空洞率的卷积和一个标准的3×3卷积结合起来,以增加模型的感受野,同时缓解网格问题。          

提出的空洞卷积模块简洁、轻便。它很容易与任何主干层结合。

实验

 检测头配置的影响

(1)416 x 416分辨率

从图1可以看出,大量的物体与5个分辨率为416的检测头匹配。根据提出的探测头与物体分布的匹配策略,设置H1-5检测头来检测物体,从而达到最高的mAP值,如表1所示,这表明提出的策略是有效的。在这种情况下,5个检测头的配置最大限度地覆盖不同尺度的物体,从而达到最高的检测精度。

此外,根据提出的跨尺度检测头配置准则,选择具有丰富特征表示的H1和H3检测头来检测交通目标。从表1可以看出,与使用5个检测头相比,充分利用两个跨尺度检测头获得的mAP仅略有下降,但模型参数急剧下降了31%以上,FLOP也下降了14%以上,FPS提高了20%以上。检测精度、模型参数、FLOP和检测速度之间的出色平衡证明了提出的跨尺度检测头配置的效率。

此外,当部署连续H1和H2检测头时mAP值减小,这表明大量不匹配这两个检测头的目标可能超出检测头的有效感知范围,从而降低了探测精度。H1和H5检测头配置的检测精度也有类似的降低。用H4和H5检测头构建的模型获得最低的mAP值,特别是对于小目标。原因可能是在向下采样过程中,大量小目标的位置信息很容易丢失。在这种情况下,低分辨率特征图对应的检测头不能有效地表示小目标特征,导致检测结果很差。随着高分辨率特征图对应的检测头的增加,与检测头匹配的小目标数量逐渐增加,检测头对小目标的表示能力增强,检测性能提高。

(2)800 x 800分辨率

输入分辨率为800时,计算目标分布与每个检测头之间的匹配关系,如图1所示。可以发现大量目标与H2-5检测头匹配。基于提出的检测头与目标分布的匹配策略,这4个检测头被用于检测交通目标。检测结果如表2所示。毫不奇怪,这4个检测头配置获得了最高的mAP值,这再次验证了提出的策略的有效性。

此外,根据提出的跨尺度检测头配置指南,采用H2和H4检测头,以在检测精度、模型参数、FLOP和检测速度之间取得良好的平衡。与输入分辨率为416的检测性能一致,连续H2和H3检测头的配置降低了检测精度。H4和H5检测头获得的mAP最低。通过添加与高分辨率特征图相对应的检测头,提高了小目标的检测性能。

然而,检测头越多越好。使用5个检测头获得的检测性能不如使用4个检测头得到的检测性能好。随着参数和FLOP的增加,检测精度和速度降低。原因可能是大量物体与H2-5检测头匹配,而与H1检测头匹配的物体不到1%。在这种情况下,增加H1检测头会导致检测头冗余,不利于模型优化。

(3)1504 x 1504分辨率

 从图1可以看出,输入分辨率为1504,大量目标与H3-5检测头匹配,而与H1和H2检测头匹配的物体很少,占不到1%。根据提议的检测头和目标分布匹配策略,使用H3-5检测头检测目标并获得最高mAP值,如表3所示。

此外,根据提议的跨尺度检测头配置指南,利用H3和H5检测头获得了与H3-5检测头相同的mAP值。虽然基于提议的跨尺度检测头H3,5配置的模型参数的减少和FPS的增加略好于使用H3-5检测头的那些,但提议的跨规模检测头配置指南的指导意义仍然有效。与输入分辨率为416和800的检测性能一致,H4和H5检测头获得的mAP最低。通过增加与高分辨率特征图相对应的检测头,提高了小目标的检测性能。同样,当继续添加与许多目标不匹配的检测头时,例如H2头,检测精度和速度会降低,模型参数和FLOP也会增加。

通常,检测头配置对不同输入分辨率下的检测性能有很大影响。基于提出的检测头和目标分布匹配策略,可以构建一个适用的模型,以实现比其他检测头配置更高的检测精度。根据提出的跨尺度检测头配置指南,只有两个检测头可以用来代替多个检测头,以在检测精度、模型参数、FLOP和检测速度之间取得极好的平衡。

(4)空洞卷积的影响

使用配置有H1和H3检测头的轻量级模型作为基线,建议的空洞卷积模块与基线主干的不同下采样层相结合,以探讨空洞卷积对检测性能的影响。

从表5可以看出,将空洞卷积模块与第一个下采样层相结合,mAP值增加1.6,而模型参数仅增加了0.01M。将空洞卷积模块与第一个和第二个向下采样层相结合,mAP值提高了2.6,模型参数仅提高了0.06M。当空洞卷积模型进一步集成到主干的深层时,mAP数值略有增加,但模型参数和FLOP显著增加。原因可能是提出的空洞卷积模块利用大的空洞率来产生大的感受野,对于高分辨率的浅层特征具有明显的增益,但对于低分辨率的深层特征,增益将很弱。为了更好地平衡检测精度、参数、FLOP和检测速度,作者将空洞卷积模块与两个浅层下采样层相结合,构建了一个用于交通目标检测的轻量级检测模型。

对比  

#VisionLLaMA

半年多来,Meta 开源的 LLaMA 架构在 LLM 中经受了考验并大获成功(训练稳定、容易做 scaling)。

沿袭 ViT 的研究思路,我们能否借助创新性的 LLaMA 架构,真正实现语言和图像的架构统一?

在这一命题上,最近的一项研究 VisionLLaMA 取得了进展。VisionLLaMA 在图像生成(包含 Sora 依赖的底层的 DIT)和理解(分类、分割、检测、自监督)等多个主流任务上相较于原 ViT 类方法提升显著。

在本文中,作者通过提出一种类似 LLaMA 的朴素和金字塔形式的Transformer来处理2D图像,称为 VisionLLaMA。VisionLLaMA 是一个统一的通用建模框架,用于解决大多数视觉任务。

  • 论文标题:VisionLLaMA: A Unified LLaMA Interface for Vision Tasks

​​https://arxiv.org/abs/2403.00522​​ https://github.com/Meituan-AutoML/VisionLLaMA

该研究在统一图像和语言架构方面的尝试,可以复用 LLM 社区在 LLaMA 上的训练(稳定且有效的 scaling)、部署等一系列成果。

本文概述

大型语言模型构建在基于Transformer的架构之上来处理文本输入, LLaMA 系列模型在众多开源实现中脱颖而出。类似LLaMa的Transformer可以用来处理2D图像吗?在本文中,我们通过提出一种类似 LLaMA 的朴素和金字塔形式的Transformer来回答这个问题,称为 VisionLLaMA。VisionLLaMA 是一个统一的通用建模框架,用于解决大多数视觉任务。

我们采用经典的预训练框架在图像感知(尤其是图像生成)任务上对齐有效性进行了充分评估。在大多数情况下,VisionLLaMA表现出了比已有SOTA ViT方案更优的性能。我们相信 VisionLLaMA 可以作为视觉生成和理解的强大新基线模型。

LLaMA 架构的成功使得本文作者提出了一个简单而有趣的设想:该架构是否可以在视觉模态上同样成功?如果答案是肯定的,那么视觉模型和语言模型都可以使用相同的统一架构,并从为 LLaMA 设计的各种动态部署技术中受益。然而,这是一个复杂的问题,因为这两种模态之间存在一些明显的差异。

首先存在维度差异:文本序列是一维的,而视觉任务需要处理两个或更多维度的数据;其次存在结构差异:许多视觉任务依赖于金字塔结构的骨干网络以获得更好的性能,而 LLaMA 是一个结构上朴素的编码器;第三,需要有效处理不同分辨率的图像和视频输入。

本文旨在解决这些挑战,并弥合不同模态之间的架构差距,具体为提出适应视觉任务的 LLaMA 架构,解决与模态差异相关的难题,并实现通过一种统一的方法对视觉和语言数据进行处理。

本文贡献

  • 提出一种类似于LLaMA的视觉转换器架构VisionLLaMA,以减少语言和视觉之间的架构差异。
  • 我们研究了两个版式的视觉架构方案(朴素和金字塔),并评估它们在监督和自监督学习场景下的性能。此外,我们还引入了 AS2DRoPE(即自动缩放 2D RoPE),它将旋转位置编码从 1D 扩展到 2D,并利用插值缩放来适应任意分辨率。
  • 在没有花里胡哨的情况下,VisionLLaMA 在图像生成、分类、语义分割和对象检测等许多代表性任务中明显优于广泛使用且经过仔细微调的视觉转换器。大量实验表明,VisionLLaMA 比现有视觉转换器具有更快的收敛速度和更好的性能。

本文方案

朴素版VisionLLaMA延续了ViT的处理流程,核心在于VisionLLaMA模块,见上图。VisionLLaMA与ViT不同之处在于:位置编码自注意力RoPE和SwiGLU激活函数。此外,它仍然使用ViT的LayerNorm,而非RMSNorm。需要注意的是,由于1DRoPE不能很好的扩展到其他分辨率,故作者将其扩展为2维形式,描述如下:

金字塔VisionLLaMA

更进一步,类似SwinT,作者还构建了一个金字塔版本的VisionLLaMA。在本文中,我们选择更强的基线 Twins 来探索如何在严格控制的设置下构建强大的金字塔变压器。Twins 的原始架构利用了条件位置编码和以局部和全局注意力的形式进行交错的局部-全局信息交换。这些组件可以在各种变压器中找到,这意味着按照我们的方法在其他金字塔变压器变体中应用 VisionLLaMA 并不困难。请注意,我们的目标不是发明一种新颖的金字塔视觉转换器,而是展示我们如何在现有设计的基础上调整 VisionLLaMA 的基本设计。因此,我们只是遵循对架构和超参数进行最小的修改。

需要注意:我们删除了金字塔 VisionLLaMA 中的条件位置编码,因为 AS2DRoPE 已经包含位置信息。此外,我们还删除了类标记并在分类头之前使用 GAP(全局平均池)。

Training or Inference Beyond Sequence Length

处理不同的输入分辨率是视觉任务中的常见要求。卷积神经网络使用滑动窗口机制来处理可变长度。相反,大多数视觉转换器应用局部窗口操作或插值。例如,DeiT在不同分辨率上训练时采用双三次插值。CPVT使用基于卷积的位置编码。   

超越序列长度限制的训练或推理

将一维 RoPE 拓展到二维:对不同的输入分辨率进行处理是视觉任务中的常见需求。卷积神经网络使用滑动窗口机制来处理可变长度。与之相比,大多数视觉 transformer 应用局部窗口操作或插值,例如 DeiT 在不同分辨率上训练时采用双三次插值;CPVT 使用基于卷积的位置编码。本文中评估了 1D RoPE 的性能,发现其在 224×224 分辨率上拥有最高的精度,然而当分辨率上升到 448×448 时,精度急剧下降甚至为 0。因此,本文将一维 RoPE 扩展到二维。对于多头自注意力机制,二维 RoPE 在不同头之间共享。

位置插值有助于二维 RoPE 更好地泛化:受一些使用插值来扩展 LLaMA 的上下文窗口的工作启发,在更高分辨率的参与下,VisionLLaMA 采用类似方式扩展二维上下文窗口。与具有扩大的固定上下文长度的语言任务不同,目标检测等视觉任务通常在不同的迭代中处理不同的采样分辨率。本文使用 224×224 的输入分辨率对小模型进行训练,并在不重新训练的情况下评估更大分辨率的性能,指引本文能够更好的应用内插值或外差值策略。经过实验,本文选择应用基于 “锚点分辨率” 的自动缩放插值(AS2DRoPE)。对 H × H 的方形图像和 B × B 的锚点分辨率进行处理的计算方式如下:

这种计算方式效率高并且不会引入额外的成本。如果训练分辨率保持不变,AS2DRoPE 会退化为 2 维 RoPE。

由于需要将位置信息添加到汇总的键值中,本文对于金字塔结构设置下的 GSA 进行了特殊处理。这些子采样的键值是通过特征图上的抽象生成的。本文使用内核大小为 k×k 且步长为 k 的卷积。如图 3 所示,生成的键值的坐标可以表示为采样特征的平均值。

本文实验

本文全面评估了 VisionLLaMA 在图像生成、分类、分割和检测等任务上的有效性。默认情况下,本文所有模型均在 8 个 NVIDIA Tesla A100 GPU 上进行训练。

图像生成

基于 DiT 框架的图像生成:本文选择在 DiT 框架下应用 VisionLLaMA,因为 DiT 是使用视觉 Transformer 和 DDPM 进行图像生成的代表性工作。本文用 VisionLLaMA 替换了 DiT 原来的视觉 transformer,同时保持其他组件与超参数不变。该实验证明了 VisionLLaMA 在图像生成任务上的通用性。与 DiT 相同,本文设置 DDPM 的 sample steps 为 250,实验结果如表 1 所示。与大多数方法保持一致,FID 被视为主要指标,并在其他次要指标上例如 sFID、Precision/Recall、Inception Score 进行评估。结果表明,VisionLLaMA 在各种模型尺寸上都显着优于 DiT。本文还将 XL 模型的训练步数扩展到 2352k,以评估本文的模型是否具有更快的收敛优势,或者在更长的训练周期设置下仍然表现更好。DiT-LLaMA-XL/2 的 FID 比 DiT-XL/2 低 0.83,表明 VisionLLaMA 不仅具有更好的计算效率,而且比 DiT 具有更高的性能。图 1 中展示了使用 XL 模型生成的一些示例。

图像分类

基于 SiT 框架的图像生成:SiT 框架显著提高了使用视觉 transformer 生成图像的性能。本文用 VisionLLaMA 替换 SiT 中的视觉 transformer,以评估更好的模型架构带来的收益,本文将其称为 SiT-LLaMA。实验保留了 SiT 中其余所有设置与超参数,所有模型都使用相同数量的步骤进行训练,在所有实验中都使用线性插值(linear interpolant)和快速模型(velocity model)。为了进行公平比较,本文还重新运行已发布的代码,并使用 250 steps 的 SDE 采样器(Euler)对 50k 256×256 图像进行采样,结果如表 2 中所示。SiT-LLaMA 在各种容量级别的模型中均优于 SiT。与 SiT-L/2 相比,SiT-LLaMA-L/2 降低了 5.0 FID,其幅度大于新框架带来的提升(4.0 FID)。本文还在表 13 中展示了更高效的 ODE 采样器 (dopri5),与本文方法的性能差距仍然存在。可以得出与与 SiT 论文中的类似的结论:SDE 比其对应的 ODE 具有更好的性能。

ImageNet 上的图像分类

  • 全监督训练

本节重点关注模型在 ImageNet-1K 数据集上的全监督训练,排除其他数据集或蒸馏技巧的影响,所有模型均使用 ImageNet-1K 训练集进行训练,并在表 3 中展示了在验证集上的准确性结果。

 常规视觉 Transformer 的比较:DeiT3 是当前最先进的常规视觉 transformer,它提出了一种特殊的数据增强并执行广泛的超参数搜索以提高性能。DeiT3 对超参数敏感并且容易出现过拟合,用 GAP(全局平均池化)替换类别 token 会导致 DeiT3-Large 模型在经过 800 个 epoch 训练后准确率下降 0.7%。因此,本文在常规 transformer 中使用类别 token 而不是 GAP。结果如表 3 中所示,其中 VisionLLaMA 取得了与 DeiT3 相当的 top-1 精度。单一分辨率上的准确性并不能提供全面的比较,本文还评估了不同图像分辨率的性能,结果如表 4 所示。对于 DeiT3,本文使用双三次插值来进行可学习的位置编码。尽管这两个模型在 224×224 分辨率下具有相当的性能,但当分辨率增加时,差距会扩大,这意味着本文的方法在不同分辨率下具有更好的泛化能力,这对于目标检测等许多下游任务来说至关重要。

金字塔结构的视觉 transformer 比较:本文使用与 Twins-SVT 相同的架构,详细配置列于表 17。本文移除了条件位置编码,因为 VisionLLaMA 已经包含一种旋转位置编码。因此,VisionLLaMA 是一种无卷积架构。本文沿用 Twins-SVT 中的包含超参数在内的所有设置,与 Twins-SVT 保持一致,本文不使用类别 token,而是应用 GAP。结果如表 3 所示,本文的方法在各个模型级别上都实现了与 Twins 相当的性能,并且始终优于 Swin。

  • 自监督训练

本文使用 ImageNet 数据集评估自监督视觉 transformer 的两种常见方法,同时将训练数据限制为 ImageNet-1K,移除了任何使用 CLIP、DALLE 或蒸馏等可以提高性能的组件,本文的实现基于 MMPretrain 框架,利用 MAE 框架并使用 VisionLLaMA 替换编码器,同时保持其他组件不变。该对照实验能够评估本文方法的有效性。此外,本文使用与所比较方法相同的超参数设置,在这种设置下,与强大的基线相比依然实现了显着的性能提升。

Full fine-tuning 设置:在当前设置下,模型首先使用预训练的权重进行初始化,然后使用完全可训练的参数进行额外的训练。VisionLLaMA-Base 在 ImageNet 上经过 800 个 epoch 的训练,达到了 84.0% 的 top-1 准确率,比 ViT-Base 提高了 0.8%。本文的方法训练速度比 SimMIM 快约 3 倍。本文还将训练周期增加到 1600,以验证 VisionLLaMA 能否在足够的训练资源下保持优势。VisionLLaMA-Base 在 MAE 变体中取得了新的 SOTA 结果,top-1 准确率达到 84.3%,比 ViT-Base 提高了 0.9%。考虑到 full fine-tuning 具有性能饱和风险,本文方法的提升十分显着。

Linear probing:最近的一项工作认为线性探测度量(linear probing metric)是对表示性学习更加可靠的评估。在当前设置下,模型由 SSL 阶段的预训练权重初始化。然后,在训练过程中,除了分类器头之外,整个骨干网络都被冻结。结果如表 5 所示:在训练成本为 800 个 epoch 的情况下,VisionLLaMA-Base 的性能优于 ViTBase-MAE 4.6%。它还超过了训练了 1600 个 epoch 的 ViT-Base-MAE。当 VisionLLaMA 训练 1600 个 epoch 时,VisionLLaMA-Base 达到了 71.7% 的 top1 准确率。本文方法还扩展到 VisionLLaMA-Large,相比 ViT-Large 提高了 3.6%。

语义分割

COCO检测

ADE20K 数据集上的语义分割

  • 全监督训练

按照 Swin 的设置,本文在 ADE20K 数据集上使用语义分割来评估本文方法的有效性。为了进行公平比较,本文限制基线模型仅使用 ImageNet-1K 进行预训练。本文使用 UperNet 框架,并用金字塔结构 VisionLLaMA 替换主干网络。本文的实现基于 MMSegmentation 框架。模型训练步数设置为 160k,全局 batch size 为 16。结果如表 6 中所示,在相近的 FLOP 下,本文的方法比 Swin 和 Twins 的性能高出 1.2% mIoU 以上。

  • 自监督训练

本文使用 UperNet 框架在 ADE20K 数据集上进行语义分割,用 VisionLLaMA 替换 ViT 主干,同时保持其他组件和超参数不变。本文的实现基于 MMSegmentation,结果如表 7 所示。对于 800 个 epoch 的预训练组,VisionLLaMA-B 将 ViT-Base 显着提升了 2.8% mIoU。本文方法还明显优于其他一些改进,例如引入额外的训练目标或特征,这些方法会给训练过程带来额外的开销并降低训练速度。相比之下,VisionLLaMA 仅涉及基础模型的替换,并且具有快速的训练速度。本文进一步评估了 1600 个较长预训练 epoch 的性能,VisionLLaMA-B 在 ADE20K 验证集上实现了 50.2% mIoU,这使得 ViT-B 的性能提高了 2.1% mIoU。

COCO 数据集上的目标检测

  • 全监督训练

本文评估了金字塔结构 VisionLLaMA 在 COCO 数据集上的目标检测任务的性能。本文使用 Mask RCNN 框架并用金字塔结构 VisionLLaMA 替换主干网络,类似于 Swin 的设置,该金字塔结构 VisionLLaMA 在 ImageNet-1K 数据集上预训练了 300 个 epoch。因此,本文的模型具有与 Twins 相同数量的参数和 FLOP。该实验能够用于验证本文方法在目标检测任务上的有效性。本文的实现基于 MMDetection 框架,表 8 中展示了标准的 36 个 epoch 训练周期 (3×) 的结果,本文的模型优于 Swin 和 Twins。具体来说,VisionLLaMA-B 比 Swin-S 高出 1.5% 的 box mAP 和 1.0% mask mAP。与更强的基线 Twins-B 相比,本文的方法具有在 box mAP 上高出 1.1% ,在 mask mAP 上高出 0.8% 的优势。

  • 自监督训练

本文应用基于 ViTDet 框架的 VisionLLaMA,该框架利用常规视觉 transformer 来实现与对应金字塔结构视觉 transformer 相当的性能。本文使用 Mask RCNN 检测器,并用 VisionLLaMA-Base 模型替换 vit-Base 主干网络,该模型使用 MAE 预训练 800 轮。原始的 ViTDet 收敛缓慢,需要专门的训练策略,例如更长的训练周期才能实现最佳性能。在训练过程中,本文发现 VisionLLaMA 在 30 个 epoch 后达到了相似的性能,因此,本文直接应用标准的 3x 训练策略。本文方法的训练成本仅为基线的 36%。与所比较方法不同,本文方法不进行最佳超参数搜索。结果如表 9 所示,VisionLLaMA 在 Box mAP 上优于 ViT-B 0.6%,在 mask mAP 上优于 ViT-B 0.8%。

消融实验与讨论

消融实验

本文默认选择在 ViT-Large 模型上进行消融实验,因为本文观察到该模型在多次运行中产生的方差较小。

FFN 和 SwiGLU 的消融:本文用 SwiGLU 替换 FFN ,结果如表 11a 中所示。由于明显性能差距,本文选择使用 SwiGLU 以避免对 LLaMA 架构引入额外的修改。

归一化策略的消融:本文对 transformer 中两种广泛使用的归一化方法 RMSNorm 和 LayerNorm 进行了比较,结果如表 11g 中所示。后者具有更好的最终性能,这表明重新居中不变性(re-centering invariance)在视觉任务中也很重要。本文还计算了每次迭代花费的平均时间用来衡量训练速度,其中 LayerNorm 仅比 RMSNorm 慢 2%。因此,本文选择 LayerNorm 而不是 RMSNorm 以获得更均衡的性能。

部分位置编码:本文使用 RoPE 调整全部 channel 的比率,结果如表 11b 中所示,结果表明将比率设置在小阈值上即可获得良好的性能,不同的设置之间没有观察到存在显着的性能差异。因此,本文保留 LLaMA 中的默认设置。 

基础频率:本文对基础频率进行更改与比较,结果如表 11c 中所示,结果表明,性能对于大范围的频率来说是稳健的。因此,本文保留 LLaMA 中的默认值以避免部署时的额外特殊处理。 

每个注意力头之间共享位置编码:本文发现,在不同头之间共享相同的 PE(每个头中的频率从 1 到 10000 变化)比独立的 PE(所有通道中的频率从 1 到 10000 变化)要好,结果如表 11d 所示。 

特征抽象策略:本文在大参数规模的模型(-L)上比较了两种常见的特征提取策略:类别 token 和 GAP ,结果如表 11e 中所示,使用类别 token 比 GAP 更好,这与 PEG [13] 中所得到的结论不同。然而,两种方法的训练设置截然不同。本文还使用 DeiT3-L 进行了额外的实验,得到了类似的结论。本文进一步评估 “小型”(-S)和 “基础”(-B)模型的性能。有趣的是,在小模型中观察到了相反的结论,有理由怀疑 DeiT3 中使用的较高丢弃路径率(drop-path rate)使得诸如 GAP 之类的无参数抽象方法(parameter-free abstraction)难以达到应有的效果。 

位置编码策略:本文还在金字塔结构 VisionLLaMA-S 上评估了其他绝对位置编码策略,例如可学习位置编码 和 PEG。由于存在强大的基线,本文使用 “小” 模型,结果显示在表 11f 中:可学习的 PE 不会提高性能,PEG 将基线从 81.6% 略微提高到 81.8%。出于三个原因,本文并没有将 PEG 作为基本组成部分。首先,本文尝试对 LLaMA 进行最小程度的修改。其次,本文的目标是为 ViT 等各种任务提出一种通用方法。对于像 MAE 这样的屏蔽图像框架(masked image frameworks),PEG 增加训练成本,并可能损害下游任务上的性能。原则上,可以在 MAE 框架下应用稀疏 PEG,但会引入部署不友好的算子。稀疏卷积是否与其密集版本一样包含足够的位置信息仍然是一个未解决的问题。第三,无模态束缚的设计为进一步研究涵盖文本和视觉之外的其他模态铺平了道路。 

对输入尺寸的敏感性:在未训练的前提下,本文进一步比较了增大分辨率和常用分辨率的性能,结果如表 12 中所示。这里使用了金字塔结构 transformer,因为其在下游任务中比对应的非层次结构版本更受欢迎。1D-RoPE 的性能因分辨率变化而受到严重影响并不奇怪。α = 2 的 NTK-Aware 插值实现了与 2D-RoPE 类似的性能,2D-RoPE 实际上是 NTKAware (α = 1)。AS2DRoPE 展示出了在较大分辨率上的最佳性能。

讨论

收敛速度:对于图像生成,本文研究了不同训练步数下的表现,分别在 100k、200k、300k 和 400k 次迭代时存储权重来计算保真度指标。由于 SDE 明显慢于 ODE,因此本文选择使用 ODE 采样器。表 10 中的结果表明 VisionLLaMA 在所有模型上的收敛速度都比 ViT 快得多。具有 30 万次训练迭代的 SiT-LLaMA 性能甚至优于具有 40 万次训练次数的的基线模型。

本文还与图 4 中 ImageNet 上使用 DeiT3-Large 全监督训练 800 个 epoch 的 top-1 精度进行了比较,表明 VisionLLaMA 比 DeiT3-L 收敛得更快。本文进一步比较了 MAE 框架下 ViT-Base 模型的 800 个 epoch 的训练损失,并在图 5 中进行了说明。VisionLLaMA 在开始时具有较低的训练损失,并将该趋势保持到最后。

#CoPa(Robotic Manipulation through Spatial Constraints of Parts)

近期,具身智能方向取得了诸多进展。从谷歌的 RT-H 到 OpenAI、Figure 联合打造的 Figure 01,机器人的交互性、通用性越来越强。一句指令就能冲咖啡、倒红酒、锤钉子,清华具身智能CoPa「动」手了

如果未来机器人成为人们日常生活的助手,你期待它们能够完成哪些任务?泡一杯热气腾腾的手冲咖啡,整理桌面,甚至帮你精心安排一场浪漫的约会,这些任务,只需一句指令,清华的具身智能新框架「CoPa」都能完成。

CoPa(Robotic Manipulation through Spatial Constraints of Parts)是清华叉院高阳教授机器人研究团队最新提出的具身智能框架,首次实现了多场景、长程任务、复杂3D行为的泛化能力。

  • 论文地址:https://arxiv.org/abs/2403.08248
  • 项目主页:https://copa-2024.github.io/

得益于对视觉语言大模型(VLMs)的创新使用,在不经过任何训练的前提下,CoPa 可以泛化到开放场景中,处理复杂的指令。CoPa 最令人惊喜的是它展现出对场景中物体的物理属性具备细致的理解,以及其精确的规划与操作能力。

例如,CoPa 能够帮助研究人员制作一杯手冲咖啡:

视频看不了~~

在该任务中,CoPa 不仅可以理解复杂桌面陈设中每个物体的作用,还可以通过精确的控制,完成对它们的物理操作。比如「把水从水壶倒到漏斗中」这一任务,机器人将水壶移动到漏斗的上方,精确地将其旋转至合适的角度,使得水可以从壶口流到漏斗中。

CoPa 还能精心安排一场浪漫的约会。在了解研究人员的约会需求后,CoPa 帮助其布置了精美的西餐桌。

在深入理解用户需求的同时,CoPa 还展现出了精确的操作物体本领。比如「把花插入花瓶」这一任务,机器人首先抓住了花的茎,将其旋转至正对着花瓶,最后将其插入。

方法介绍

算法流程

大多数操作任务可以被分解为两个阶段:物体的抓取,以及完成任务所需的后续动作。比如,在开抽屉时,我们需要先抓住抽屉的把手,再沿着直线拉出抽屉。基于此,研究人员设计了两个阶段,即首先通过「任务导向的抓取模块(Task-Oriented Grasping)」生成机器人抓取物体的位姿,再通过「任务相关的运动规划模块(Task-Aware Motion Planning)」生成抓取后完成任务所需的位姿。机器人在相邻位姿之间的转移可以通过传统的路径规划算法实现。

重要部分检测模块

研究人员观察到大多数操作任务都需要对场景中的物体具有细致的「部分级(part-level)理解」。比如在用小刀切东西时,我们会握着刀柄而非刀刃;在戴眼镜时,我们会拿着镜框而非镜片。基于这个观察,研究团队设计了「由粗到细的部分检测(coarse-to-fine part grounding)模块」来定位场景中和任务相关的部分。具体来说,CoPa 先通过粗粒度物体检测来定位场景中和任务相关的物体,随后通过细粒度部分检测来定位这些物体上和任务相关的部分。

在「任务导向的抓取模块」中,CoPa 首先通过该重要部分检测模块定位抓取的位置(比如工具的柄),该位置信息被用来过滤 GraspNet(一个可以生成场景中所有可能的抓取位姿的模型)生成的抓取位姿,进而得到最终的抓取位姿。 

为了让视觉语言大模型来帮助机器人进行操作任务,该研究需要设计一个接口,该接口既可以让大模型以语言的方式推理,又有利于机器人操作。研究团队发现,在执行任务的过程中,任务相关的物体通常会受到许多的空间几何限制。比如,在给手机充电时,充电头必须正对着充电口;在盖瓶盖时,盖子必须被正放在瓶口位置。基于此,研究团队提出使用空间限制作为视觉语言大模型和机器人之间的桥梁。具体来说,CoPa 首先通过视觉语言大模型生成任务相关的物体在完成任务时需要满足的空间限制,再通过一个求解模块基于这些限制解出机器人的位姿。

实验结果

CoPa 能力评估

CoPa 在现实世界操作任务中展现了极强的泛化能力。得益于对视觉语言大模型中蕴含的常识知识的利用,CoPa 对场景中物体的物理属性具有深入的理解。

例如,在「锤钉子」任务中,CoPa 首先抓住了锤柄,再将锤子旋转至锤头正对着钉子,最后向下锤。该任务要求精确识别出锤柄、锤面以及钉面,并充分理解它们的空间关系,证明 CoPa 对场景中物体的物理属性具有深入的理解。

在「把橡皮放进抽屉」任务中,CoPa 首先定位到了橡皮的位置,然后发现橡皮的一部分被纸包裹着,于是聪明地抓取了该部分,确保橡皮不会被弄脏。

在「把勺子插入杯子」任务中,CoPa 首先抓住了勺柄,将其平移旋转至竖直朝下,并正对着杯子,最后将其插入杯中,证明 CoPa 可以很好的理解完成任务时物体需要满足的空间几何限制。

研究团队在 10 个现实世界任务上进行了充分的定量实验。如表一所示,CoPa 在处理这些复杂任务的表现上显著超过了基线方法以及许多消融变种方法。

消融实验

研究人员通过一系列消融实验证明了 CoPa 框架中如下三个组成部分的重要性:基础模型、由粗到细的部分检测、空间限制生成。实验结果如上方表一中所示。

  • 基础模型

表中 CoPa w/o foundation 消融实验去除了 CoPa 中对基础模型的使用,转而通过检测模型来定位物体,以及基于规则的方法生成空间限制。实验结果表明该消融变种的成功率很低,证明了基础模型中蕴含的丰富常识知识在 CoPa 中的重要作用。比如在「扫螺母」任务中,该消融变种不知道场景中哪个工具适合用来扫。

  • 由粗到细的部分检测

表中 CoPa w/o coarse-to-fine 消融实验去除了 CoPa 由粗到细的部分检测设计,转而直接使用细粒度分割来定位物体。该变种在定位物体重要部分相对困难的任务中表现显著降低。比如在「锤钉子」任务中,缺少「由粗到细」这一设计导致很难识别出锤面。

  • 空间限制生成

表中 CoPa w/o constraint 消融实验去除了 CoPa 的空间限制生成模块,转而让视觉语言大模型直接输出机器人的目标位姿的具体数值。实验表明根据场景图片直接输出机器人目标位姿是十分困难的。比如在「倒水」任务中,水壶需要被倾斜一定的角度,该变种完全无法生成此时机器人的位姿。

#SADE-AgnosticLT

近年来,长尾学习在计算机视觉领域得到了广泛关注,甚至在学术领域的常用设定中有了很好的解决方案,但是该类算法却一直无法很好地落地

在这篇 论文中,来自新加坡国立、字节跳动和华为的学者表明:这个问题的本质在于实际应用中的测试集并不是单一的均匀分布的。因此,他们设计了 SADE 算法,即使是在一个固定的长尾分布数据集上训练的模型,也能够自适应地处理多个不同类别分布的测试场景。

深度长尾学习是计算机视觉领域中最具挑战性的问题之一,旨在从遵循长尾类别分布的数据中训练出性能良好且类别无偏的深度神经网络。在传统视觉识别任务中,数据的类别分布往往受人为调整而变得均衡,即不同类别的样本量无明显差别。

但在实际应用中,数据的不同类别往往遵循长尾分布(如下图所示):一小部分类别拥有大量的样本(被称为多数类),而其余大部分类别只有较少的样本量(被称为少数类)。

该长尾类别不平衡问题使得神经网络的训练变得非常困难。所得到的模型往往有偏于多数类,即倾向于分对更多多数类样本,导致了模型在样本量有限的少数类上表现不佳。

近年来,越来越多的研究开始探索长尾分类任务,并设计了各类方法来解决长尾类别不平衡问题,期望所得到的模型能在类别平衡的测试集上表现好。例如,Google 的 Logit Adjustment 从理论上提供了优雅的解法,能够较好地处理长尾分类任务中的类别不平衡。然而,学者们近期发现长尾学习问题到达了一个瓶颈,即传统的长尾分类问题似乎已经有了很好地解决方案,但却依然无法较好地落地。 那么,问题到底出在哪里呢?

这一问题的本质源于现存方法对传统长尾分类任务的设定:假设测试数据集的类别是均匀分布的,即不同的类别有相同的测试样本量。在这样的设定下,我们只需考虑如何优化模型在平衡数据集上的性能即可,因此最前沿的长尾学习方法往往都能在均匀分布测试集上表现良好。但问题在于,在实际应用场景中,测试集的类别分布是不可控的:它也许是均匀分布,但也可能是与训练集一样的长尾分布,甚至是反向长尾分布(即训练集中的少数类变成了测试集中的多数类)。

如下示意图所示,由现存长尾方法训练得到的模型虽能够较在服从均匀分布的测试集上表现良好,但却无法处理好遵循其他类别分布的测试集。这就导致那些在论文中看似表现良好的长尾学习模型无法较好地应用到实际场景中。

那么,这个问题可以被解决吗?

论文链接:https://arxiv.org/pdf/2107.09249.pdf

该工作呼吁大家研究测试分布未知的长尾识别问题(Test-agnostic Long-tailed Recognition)。该任务旨在从一个固定的长尾分布训练集上训练一个神经网络模型,并期望它能在服从不同类别分布(包括均匀、长尾、反向长尾分布)的测试集上表现良好。为了解决该任务,该论文提出了 SADE(Self-supervised Aggregation of Diverse Experts)算法,在多个数据集的不同类别分布测试集上均取得了显著的性能提升。

总体而言,这项研究阐明了:即使是在一个固定的长尾分布数据集上训练的模型,也能够自适应地处理不同类别分布的测试场景。目前该方法的代码已经开源,感兴趣的小伙伴可以在 Github 上查看。

GitHub:https://github.com/Vanint/SADE-AgnosticLT

方法

动机和方法框架 该工作发现:不同方法所得模型的性能分布是相对固定的,并不会随着测试分布的变化而变化。如下表所示,传统的 Softmax Cross-entropy 拟合原始长尾分布,因此它在多数类(Many-shot classes)上表现得比少数类(Few-shot classes)更好。这一特性在不同类别分布的测试集上表现一致。而由长尾学习方法(如 Balanced Softmax)所得到的模型则表现得更为均衡,且其性能分布在各测试分布上表现一致。 

这一现象说明了通过不同方法得到的模型具有不同的技能特长,即擅长不同的类别分布。例如,Softmax 更擅长长尾分布,而 Balanced Softmax 更擅长均匀分布。基于这一发现,自然能联想到:如果能训练多个擅长不同类别分布的模型,并在测试场景下能够有效地组合它们,我们就能自适应地处理任何类别分布了!

然而,这听起来很简单,但做起来却不太容易。这里有两个难题尚未解决:(1)如何在一个静态的、固定的长尾分布数据集上训练多个擅长不同类别分布的专家模型?(2)如何在完全无标注的测试数据上有效地组合多各专家模型?为了解决这些挑战,SADE 提出了两个解决策略:(a) 特长差异化的多专家模型学习策略,(b) 多专家模型测试场景自适应组合策略,如下图所示。

(a) 特长差异化的多专家模型学习策略 为了学习这样一个特长差异化的多专家模型,SADE 利用不同的损失函数训来练不同的专家模型。如下图所示,SADE 利用 Softmax loss 来学习擅长长尾分布的专家模型,用 Balanced Softmax loss 来学习擅长均匀分布的专家模型,并提出了一个新的 Inverse Softmax loss 来学习擅长反向长尾分布的专家模型。 

相较于之前致力于学习多个具有相同类别分布的多专家学习方法 RIDE,该策略能有效学习擅长不同类别分布的多专家模型,如下表所示。

 (b) 多专家模型测试场景自适应策略 既然我们已经学到多个擅长不同类别分布的专家模型,那么接下就是如何自适应地组合它们。一个自然的想法就是适者生存,即更擅长目标测试集分布的专家应该被分配更高的组合权重。

那么问题来了:在无标签的测试数据上,如何去检测哪个专家更擅长测试集分布呢?为了解决这一问题,该研究观察到:给定一个测试分布,更强的专家模型往往能在预测其熟练类别样本时表现得更加稳定,即更强的专家对于其熟练类别样本的不同变体预测具有更高的预测相似性,如下表所示。

基于该发现,SADE 提出通过最大化样本不同变体之间的预测稳定性来检测更强大的专家模型,并自适应地学习专家模型间的组合权重,如下图所示。

 该策略能有效学到适用于未知测试类别分布的专家组合权重(如下表左),从而在不同类别分布(除均匀分布外)的测试集上都能获得显著的性能提升(如下表右)。 

基于上述策略,SADE 能够在多个数据集的各种类别分布测试集(包括均匀分布、长尾分布、反向长尾分布)上取得最优的性能。    

在实际应用场景中,测试数据也许遵循部分类别分布(partial class distribution),即只有部分类别存在。对于这种更加复杂的应用场景,SADE 也能表现良好,如下表所示。

 总而言之,这篇的研究表明:通过合理的方法设计,即使是一个在固定的长尾分布数据集上训练的模型,也能够自适应地处理不同类别分布的测试场景,而不只是单纯地对一个固定的测试分布不断地过拟合。

因此,该研究有效地推动了视觉长尾学习模型在实际场景中的落地。我们希望通过对这项研究的介绍,大家能重新思考深度长尾学习的落地问题,并设计出更有效和更实际的长尾学习新范式!

#FFCLIP

最近用文本来引导图像编辑取得了非常大的进展以及关注度,特别是基于去噪扩散模型如 StableDiffusion 或者 DALLE 等。但是基于 GAN 的文本 - 图像编辑依旧有一些问题等待解决,例如经典的 StyleCILP 中针对每一个文本必须要训练一个模型,这种单文本对单模型的方式在实际应用中是不方便的。本文我们提出 FFCLIP 并解决了这个问题,针对灵活的不同文本输入,FFCLIP 只需要一个模型就能够对图片进行相应的编辑,无需针对每个文本重新训练模型,并且在多个数据集上都取得了非常不错的效果。~图片编辑新范式,单个模型实现多文本引导图像编辑

利用文本对图像进行编辑的相关研究非常火热,最近许多研究都基于去噪扩散模型来提升效果而少有学者继续关注 GAN 的相关研究。本文基于经典的 StyleGAN 和 CLIP 并提出语义调制模块,从而对不同的文本仅需要单个模型就可以进行文本 - 图像编辑。

本文首先利用已有的编码器将需要编辑的图像转换到 StyleGAN 的 W^+ 语义空间中的潜在编码 w,再通过提出的语义调制模块对该隐编码进行自适应的调制。该语义调制模块包括语义对齐和语义注入模块,首先通过注意力机制对齐文本编码和 GAN 的隐编码之间的语义,再将文本信息注入到对齐后的隐编码中,从而保证该隐编码拥有文本信息从而达到利用文本编辑图像能力。

不同于经典的 StyleCLIP 模型,我们的模型无需对每个文本单独训练一个模型,一个模型就可以响应多个文本从而对图像做有效的编辑,所以我们的模型成为 FFCLIP-Free Form Text-Driven Image Manipulation。同时我们的模型在经典的教堂,人脸以及汽车数据集上都取得了非常不错的效果。

  • 论文地址:https://arxiv.org/pdf/2210.07883.pdf
  • Github 地址:https://github.com/KumapowerLIU/FFCLIP

背景和启示

最近,描述用户意图的自由文本提示已被用于编辑 StyleGAN 潜在空间以进行图像编辑操作 [1、2]。一句话(例如,‘Blue’)或短语(例如,‘Man aged 10’)作为输入,这些方法通过调制 StyleGAN 潜在空间中的潜在编码来相应地编辑所描述的图像属性。

精确的文本 - 图像编辑依赖于 StyleGAN 的视觉语义空间与 CLIP 的文本语义空间之间的精确潜在映射。比如当文本提示是 “惊喜”,我们首先在视觉语义空间中识别其相关的语义子空间(即 “表情”,因为惊喜属于表情这个属性)。找到与文本相对应的语义子空间后,文本会告诉我们隐编码的变化方向,从让隐编码从当前的表情变化到惊喜的表情。TediGAN [1] 和 StyleCLIP [2] 等开创性研究凭经验预先定义了哪个潜在视觉子空间对应于目标文本提示嵌入(即 TediGAN 中的特定属性选择和 StyleCLIP 中的分组映射)。这种经验识别限制了给定一个文本提示,他们必须训练相应的编辑模型。 

不同的文本提示需要不同的模型来调制 StyleGAN 的潜在视觉子空间中的潜在代码。虽然 StyleCLIP 中的全局方向方法没有采用这样的过程,但参数调整和编辑方向是手动预定义的。为此,我们有理由来探索如何通过显性的文本自动的找到隐性的视觉语义子空间,从而达到单个模型就可以应对多个文本。

在这篇论文中,我们提出了 FFCLIP-Free Form CLIP,它可以针对不同的文本自动找到相对应视觉子空间。FFCLIP 由几个语义调制模块组成,这些语义调制模块把 StyleGAN 潜在空间 W^+ 中的潜在编码 w^+ 和文本编码 e 作为输入。  

语义调制模块由一个语义对齐模块和一个语义注入模块组成。语义对齐模块将文本编码 e 作为 query,将潜在编码 w 作为 key 和 Value。然后我们分别在 position 和 channel 维度上计算交叉注意力,从而得到两个注意力图。接着我们使用线性变换将当前的视觉空间转换到与文本对应的子空间,其中线性变换参数(即平移和缩放参数)是基于这两个注意力图计算的。通过这种对齐方式,我们可以自动的为每个文本找到相应的视觉子空间。最后,语义注入模块 [3] 通过之后的另一个线性变换修改子空间中的潜在代码。

从 FFCLIP 的角度来看,[1, 2] 中子空间经验选择是我们在语义对齐模块中线性变换的一种特殊形式。他们的组选择操作类似于我们的缩放参数的二进制值,以指示 w 的每个位置维度的用法。另一方面,我们观察到 W^+ 空间的语义仍然存在纠缠的现象,经验设计无法找到 StyleGAN 的潜在空间和 CLIP 的文本语义空间之间的精确映射。相反,我们的语义对齐模块中的缩放参数自适应地修改潜在代码 w 以映射不同的文本提示嵌入。然后通过我们的平移参数进一步改进对齐方式。我们在基准数据集上评估我们的方法,并将 FFCLIP 与最先进的方法进行比较。结果表明,FFCLIP 在传达用户意图的同时能够生成更加合理的内容。

FFCLIP

图 1 所展示的就是我们的整体框架。FFCLIP 首先通过预训练好的 GAN inversion 编码器和文本编码器得到图像和文本的潜在编码,其中图像的潜在编码则是之前提到的 StyleGAN 视觉语义空间 W^+ 中的 w, 而文本编码则是 e_t。我们和 StyleCLIP 一样采用 e4e GAN inversion 编码器 [4] 和 CLIP 中的文本编码器来分别得到相应的潜在编码。接着我们将 e_t 和 w 作为调制模块的输入并输出得到 w 的偏移量∆w,最后将 ∆w 与原始的 w 相加并放入预训练好的 StyleGAN 中得到相应的结果。

图 1:整体框架图

下图二就是我们的语义调制模块。在语义对齐模块中(Semantic  Alignment),我们可以清晰地看到我们将 ∆w 设置为 Key 和 Value 并将 e_t 设置为 Query 来计算两个注意力图,这两个注意力图的大小分别是 18×1 以及 512×512。接着我们将 18×1 的注意力图当作线性变换中缩放系数 S,我们计算该注意力图的过程如下:

同时我们将 512×512 的注意力图与 Value 相乘以后再经过 Pooling 操作得到显性变换中的平移系数 T。我们计算该注意力图的过程如下:

拥有了平移和缩放系数后,我们就可以通过线性变换为当前文本 e_t 找到相对应的视觉子空间,计算步骤如下: 

期中 x_i 是我们第 i 个语义调制模块的输出结果。由于 ∆w 的大小是 18×512,所以 18×1 和 512×512 的注意力图分别是在∆w 的 position 和 channel 两个维度上进行注意力图的计算,这个操作类似于 Dual Attention [5].

图 2:语义调制模块

我们通过以上的操作可以得到与文本对应的视觉子空间,紧接着我们采用类似 AdaIN 的方式,将文本信息注入到这个空间中,从而得到最后的结果,我们称这个操作为语义注入模块(Semantic Injection)。整个模块的实现步骤如下:

最终我们的 FFCLIP 中一共堆叠了 4 个语义调制模块,并最终得到最后的偏移量∆w。

实验结果

 图 3:视觉对比图

如图 3 所示,我们与 StyleCLIP [1],TediGAN [2] 以及 HairCLIP [3] 进行了视觉上的对比:可以看到 FFCLIP 能够更好的反应文本的语义,并且生成更加真实的编辑图像。同时相对应的数值对比结果如下表所示,我们的方法无论是在客观数值还是在主观数值上都能取得最好的效果。

表 1:数值对比

同时我们的方法还展现出了非好的鲁棒性,FFCLIP 在训练中并未见过词的组合而是用单个的单词进行训练,但是在测试中能够很好的针对词组的语义对图像进行编辑,视觉效果如图 4 所示。

图 4:词组编辑

更多的实验结果和消融实验请看原文。

总结

我们在本文中提出了 FFCLIP,一种可以针对不同文本但只需要单个模型就能进行有效图像编辑的新方法。本文动机是现有方法是根据已有的经验来匹配当前文本和 GAN 的语义子空间,因此一个编辑模型只能处理一个文本提示。我们通过对齐和注入的语义调制来改进潜在映射。它有利于一个编辑模型来处理多个文本提示。多个数据集的实验表明我们的 FFCLIP 有效地产生语义相关和视觉逼真的结果。

#Anchor3

这里介绍如何修改 Anchor 的尺寸来提高小目标的检测效果,算法tricks优化小目标检测

修改 Anchor 尺寸

在实际的应用场景中,我们按照 MS COCO 标准中把大小不大于 32x32 或者占原始图片比率不足 0.01 的目标物体定义为一个小目标物体。

在使用 Anchor 的检测算法(以目标检测网络 Faster RCNN 为例)中,如下图所示:算法会按照一定的规则在主干网络的所有输出 Feature Map 上生成不同尺寸的 Anchor,而候选提议框生成层 RPN(RPN 的输出结果和最后生成的预测目标物体框的大小、分类以及定位息息相关)则会预测这些 Anchor 中是否含有目标物以及目标物体框离 Anchor 框的偏移。

为了提高小目标物体的检测效果,我们可以通过修改 Anchor 的尺寸来生成合适的 Anchor。

下面我们详细介绍如何修改 Anchor 的尺寸来提高小目标的检测效果。根据上图所示我们知道 Anchor 生成在主干网络的输出特征图上进行,如果我们选择合适的 Anchor 来 Match 小目标,我们就可以提高小目标物体的分类准确度和定位精准度,从而提高小目标的检测精准度。

下面我们以 Faster RCNN 网络中 Anchor 的生成代码为例,说明如何调节输入参数来对调节 Anchor 的尺寸。

import numpy as np  # 传入anchor的左上角和右下角的坐标,返回anchor的中心坐标和长宽  
def _whctrs(anchor):  """  :param anchor: list,某个anchor的坐标信息[xmin, ymin, xmax, ymax]  :return: anchor的中心点坐标和anchor的长宽  """  w = anchor[2] - anchor[0] + 1  h = anchor[3] - anchor[1] + 1  x_ctr = anchor[0] + 0.5 * (w - 1)  y_ctr = anchor[1] + 0.5 * (h - 1)  return w, h, x_ctr, y_ctr  # 给定一个anchor的中心坐标和长宽,输出各个anchor,即预测窗口,**输出anchor的面积相等,只是宽高比不同**  
def _mkanchors(ws, hs, x_ctr, y_ctr):  """  :param ws: anchor的宽  :param hs: anchor的长  :param x_ctr: anchor中心点x坐标  :param y_ctr: anchor中心点y坐标  :return: numpy array, 生成的符合条件的一组anchor  """  # 将ws和hs数组转置  ws = ws[:, np.newaxis]  hs = hs[:, np.newaxis]  # 生成符合条件的一组anchor  anchors = np.hstack((x_ctr - 0.5 * (ws - 1),  y_ctr - 0.5 * (hs - 1),  x_ctr + 0.5 * (ws - 1),  y_ctr + 0.5 * (hs - 1)))  return anchors  # 将给定的anchor放大scales中指定的倍数  
def _scale_enum(anchor, scales):  """  :param anchor: list,某个anchor的坐标信息[xmin, ymin, xmax, ymax]  :param scales: list,将anchor中的元素放大到scales中指定的倍数  :return: numpy array, 生成的符合条件的一组anchor  """  # 找到anchor的中心坐标  w, h, x_ctr, y_ctr = _whctrs(anchor)  # 将anchor的长宽放大到scales中指定的倍数  ws = w * scales  hs = h * scales  # 根据指定的anchor长宽和中心点坐标信息生成一组anchor  anchors = _mkanchors(ws, hs, x_ctr, y_ctr)  return anchors  # 计算不同长宽尺度下的anchor的坐标  
def _ratio_enum(anchor, ratios):  """  :param anchor: 基准anchor  :param ratios: list, anchor长宽比例尺寸  :return: list, 生成的anchor信息  """  # 获取anchor的中心点坐标和长宽  w, h, x_ctr, y_ctr = _whctrs(anchor)  # 获取anchor的面积  size = w * h  # 在保持面积不变的情况下生成ratios中指定长宽比的anchor长和宽  size_ratios = size / ratios  ws = np.round(np.sqrt(size_ratios))  hs = np.round(ws * ratios)  # 获取指定长宽和中心点坐标的anchors  anchors = _mkanchors(ws, hs, x_ctr, y_ctr)  return anchors  def generate_anchors(base_size=16, ratios=[0.5, 1, 2],  scales=2 ** np.arange(3, 6)):  """  :param base_size: int, 基准anchor尺寸  :param ratios: list, anchor长宽比例尺寸  :param scales: list, anchor边长放大的倍数  :return: list, 生成的anchor信息  """  # 请注意anchor的表示形式有两种,一种是记录左上角和右下角的坐标,一种是记录中心坐标和宽高  # 这里生成一个基准anchor,采用左上角和右下角的坐标表示[0,0,15,15]  # base_anchor = [0,0,15,15]  base_anchor = np.array([1, 1, base_size, base_size]) - 1  # 按照ratios元素信息生成不同长宽比的anchor  ratio_anchors = _ratio_enum(base_anchor, ratios)  # 将ratio_anchors中的每个anchor放大到scales里指定的倍数  anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)  for i in range(ratio_anchors.shape[0])])  return anchors  if __name__ == '__main__':  import time  t = time.time()  # 生成anchor  a = generate_anchors(base_size=16, ratios=[0.25, 0.5, 1, 2],  scales=2 ** np.arange(2, 6))  # 打印生成过程所需要的时间  print(time.time() - t)  print(a)

结果如下:

0.00026607513427734375  
[[ -56.   -8.   71.   23.]  [-120.  -24.  135.   39.]  [-248.  -56.  263.   71.]  [-504. -120.  519.  135.]  [ -38.  -16.   53.   31.]  [ -84.  -40.   99.   55.]  [-176.  -88.  191.  103.]  [-360. -184.  375.  199.]  [ -24.  -24.   39.   39.]  [ -56.  -56.   71.   71.]  [-120. -120.  135.  135.]  [-248. -248.  263.  263.]  [ -14.  -36.   29.   51.]  [ -36.  -80.   51.   95.]  [ -80. -168.   95.  183.]  [-168. -344.  183.  359.]]

上述 Anchor 函数生成的所有 Anchor,我们可以根据主干网络的网络架构计算出其在原始图像上的感受野大小。进而可以比对原始图片上感受野大小和原始图片上目标标注框大小。而在实际操作过程中,原始图片上目标标注框已经获取,我们需要通过分析这些目标标注框的大小反推 Anchor 生成函数的参数,进而调控生成 Anchor 的尺寸来更好的 Match 小目标物体的尺寸。上面给出的 Anchor 生成函数 ​​generate_anchors​​ 共有三个可调节参数:

  • 第一个参数 base_size 为基准 Anchor 的大小。
  • 第二个参数 ratios=[0.5, 1, 2] 指的是在保持面积不变的情况下,Anchor 框的边长按照 1:2、1:1、2:1 三种比例进行变换得到一组新的 Anchor,如下图所示:

  • 第三个参数 scales=2 ** np.arange(3, 6),指的是将各个 Anchor 放大 [8, 16, 32] 倍,得到一组新的 Anchor。如下图所示:

修改 Anchor 数量

根据上述所阐述的生成 Anchor 的尺寸和预测目标物体框的关系可知,如果我们能根据实际应用场景中目标物的大小来设计 Anchor 的尺寸,我们能在一定的程度上提高小目标物体的分类和定位精准度。而在实际应用场景中,我们会碰到一类数据集目标物的大小变化范围比较大且含有大部分的小目标物体,这种情况下,如果我们仅仅通过调节参数值修改 Anchor 的尺寸,可能不足以达到提高所有目标物的分类和定位准确度,我们还需要适当的增加 Anchor 的个数,让 Anchor 更加多尺度的来 Match 不同大小的目标物体。根据上述给出的 Anchor 生成函数可知,修改 ​​anchor ratio​​​ 或者 ​​anchor scale​​ 的值的个数可以生成更多数量的 Anchor,即在实际预测过程中,会生成更多的不同尺寸的目标候选框来 Match 更多不同大小的目标物体。下面我们介绍一种在实际应用过程中的普适方法,来详细说明在不同数据集上,如何修改 Anchor 的尺寸和数量让 Anchor 机制生成更加符合实际目标物体大小的 Anchor。第一步:解析并读取目标物标注信息,计算并统计目标物体的坐标信息,代码如下:

import os  
import tqdm  
import xml.etree.ElementTree as ET  
import config  def convert_annotation(year, classes, image_name):  """  :param year: str, 数据集版本(voc2012)  :param classes: list, 数据集类别list  :param image_name: str, 标注图片名字  :return: list, 标注框坐标信息和类别信息  """  # 获取图片对应的标注文件路径并打开  xml_file = open(os.path.join(config.PLANE_CUT_DATASET,  'VOC%s/Annotations/%s.xml' % (year, image_name)))  # 使用xml读取三方包解析xml信息  tree = ET.parse(xml_file)  # 遍历根目录下的所有标注信息  b = []  root = tree.getroot()  for obj in root.iter('object'):  # 是否是难检出目标物  difficult = obj.find('difficult').text  # 标注类别名字并过滤掉不在类别list中的标注信息  cls = obj.find('name').text  if cls not in classes or int(difficult) == 1:  continue  # 获取对应的类别id  cls_id = classes.index(cls)  # 获取标注框信息  bbox = obj.find('bndbox')  box_info = (int(bbox.find('xmin').text),   int(bbox.find('ymin').text),   int(bbox.find('xmax').text),   int(bbox.find('ymax').text), cls_id)  # 过滤掉切图产生的空背景标注  if box_info == (1, 1, 1, 1, 0):  continue  else:  b.append(box_info)  return b  def main():  # 设置数据集版本和类别等信息  sets = [('2012', 'train'), ('2012', 'val')]  classes = ["plane"]  wd = os.getcwd()  # 遍历分别为训练集、验证集、测试集生成标注信息文件  for year, image_set in sets:  # 读取数据文件信息  temp_path = 'VOC%s/ImageSets/Main/%s.txt' % (year, image_set)  # 获取图像数据名字  image_names = open(os.path.join(config.PLANE_CUT_DATASET,  temp_path)).read().strip().split()  # 用只读模式打开标注信息记录文件  info_fp = open('%s_%s.txt' % (year, image_set), 'w')  # 遍历写入每个标注文件的标注信息  for image_name in tqdm.tqdm(image_names):  # 解析并读取标注文件信息,并写入文件  idx_info = convert_annotation(year, classes, image_name)  if idx_info:  info_fp.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg'  % (wd, year, image_name))  # 将标注框坐标等信息写入文件  for box_info in idx_info:  info_fp.write(" " + ",".join([str(a) for a in box_info]))  info_fp.write('\n')  info_fp.close()  if __name__ == '__main__':  main()

第二步:使用 Kmeans 方法对目标物体的统计数据进行聚类,得到每一类的中心位置信息,代码如下:

import numpy as np  class KMEANS(object):  def __init__(self, cluster_number, filename):  self.cluster_number = cluster_number  self.filename = "2012_train.txt"  # 计算每个标注框和聚类中心的iou值矩阵  def iou(self, boxes, clusters):  """  :param boxes: numpy array, 每个元素为每个标注框宽高  :param clusters: numpy array, 元素个数=聚类中心个数,元素为从boxes中随机选取的元素  :return: float, iou值  """  # 获取标注框个数和聚类中心数目  n = boxes.shape[0]  k = cluster_number  # 计算标注框面积,并让每个元素重复k遍,整理成维度为(n, k)的numpy数组  box_area = boxes[:, 0] * boxes[:, 1]  box_area = box_area.repeat(k)  box_area = np.reshape(box_area, (n, k))  # 计算随机挑选的聚类中心面积, 并将元素复制n遍  cluster_area = clusters[:, 0] * clusters[:, 1]  cluster_area = np.tile(cluster_area, [1, n])  cluster_area = np.reshape(cluster_area, (n, k))  # 构建标注框宽矩阵和聚类中心宽矩阵  box_w_matrix = np.reshape(boxes[:, 0].repeat(k), (n, k))  cluster_w_matrix = np.reshape(np.tile(clusters[:, 0], (1, n)), (n, k))  # 获取两个矩阵中对应元素中较小的值  min_w_matrix = np.minimum(cluster_w_matrix, box_w_matrix)  # 构建标注框高矩阵  box_h_matrix = np.reshape(boxes[:, 1].repeat(k), (n, k))  cluster_h_matrix = np.reshape(np.tile(clusters[:, 1], (1, n)), (n, k))  # 获取最两个矩阵中对应元素中较大的值  min_h_matrix = np.minimum(cluster_h_matrix, box_h_matrix)  # 计算两个矩阵对应元素的内积,即计算聚类中心和每个标注框的相交面积  inter_area = np.multiply(min_w_matrix, min_h_matrix)  # 计算聚类中心和每个标注框的iou值  result = inter_area / (box_area + cluster_area - inter_area)  return result  # 计算iou均值  def avg_iou(self, boxes, clusters):  """  :param boxes: numpy array, 每个元素为每个标注框宽高  :param clusters: numpy array, 每个元素为一个聚类中心  :return: 标注矩形框和聚类中心的iou均值  """  accuracy = np.mean([np.max(self.iou(boxes, clusters), axis=1)])  return accuracy  # 训练kmeans模型  def kmeans(self, boxes, k, dist=np.median):  """  :param boxes: numpy array, 每个元素为每个标注框宽高  :param k: 聚类类别数目  :param dist: 聚类中心距离计算函数  :return: 聚类中心信息  """  # 获取元素个数(标注框数目)  box_number = boxes.shape[0]  # 随机生成一个新的numpy数组,维度为(标注框数目, 聚类数目)  distances = np.empty((box_number, k))  # 生成一个0元素构成的numpy数组  last_nearest = np.zeros((box_number,))  np.random.seed()  # 从box_number中,随机选取大小为k的数据  clusters = boxes[np.random.choice(  box_number, k, replace=False)]  # init k clusters  while True:  # 计算每个元素和聚类中心的"距离"(1-每个标注框和聚类中心框的iou)  distances = 1 - self.iou(boxes, clusters)  # 判断模型是否收敛即聚类结果不再变化  current_nearest = np.argmin(distances, axis=1)  if (last_nearest == current_nearest).all():  break  # 重新计算新的聚类中心  for cluster in range(k):  clusters[cluster] = dist(  # update clusters  boxes[current_nearest == cluster], axis=0)  last_nearest = current_nearest  return clusters  # 将计算出来的kmeans计算出来的anchor结果写入txt文件  def result_txt(self, data):  """  :param data: 聚类中心数据  :return:  """  f = open("yolo_anchors.txt", 'w')  row = np.shape(data)[0]  for i in range(row):  if i == 0:  x_y = "%d,%d" % (data[i][0], data[i][1])  else:  x_y = ", %d,%d" % (data[i][0], data[i][1])  f.write(x_y)  f.close()  # 获取每个标注框的宽高信息  def get_box_info(self):  # 用只读模式打开标注信息统计文件  fp = open(self.filename, 'r')  box_info_list = []  # 遍历文件的每一行(每个文件)获取标注框信息并计算其宽高  for line in fp:  # 按照空格分割每个标注框信息  infos = line.split(" ")  length = len(infos)  # 遍历每个标注框信息并计算其宽和高  for i in range(1, length):  width = int(infos[i].split(",")[2]) - \  int(infos[i].split(",")[0])  height = int(infos[i].split(",")[3]) - \  int(infos[i].split(",")[1])  box_info_list.append([width, height])  # 将标注框信息list转成numpy数组并返回  result = np.array(box_info_list)  fp.close()  return result  # 训练kmeans并获取聚类结果  def get_clusters(self):  # 获取标注信息统计文件中的每个标注框的宽高  all_boxes = self.get_box_info()  # 将标注框宽高信息作为kmeans训练数据,获取其聚类中心  result = self.kmeans(all_boxes, k=self.cluster_number)  # 将聚类中心按照第一列进行排序  result = result[np.lexsort(result.T[0, None])]  # 将聚类中心结果存入txt文件  self.result_txt(result)  print("value of {} anchors:\n {}".format(self.cluster_number, result))  print("Accuracy: {:.2f}%".format(  self.avg_iou(all_boxes, result) * 100))  if __name__ == "__main__":  # 设置聚类中心数目和训练数据文件信息  cluster_number = 9  filename = "2012_train.txt"  # 创建KMEANS类对象  kmeans = KMEANS(cluster_number, filename)  # 调用类成员函数获取聚类中心、聚类中心和标注框iou准确率信息  kmeans.get_clusters()

第三步:根据聚类中心修改 Anchor 生成机制参数。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com