ANYTEXT: MULTILINGUAL VISUAL TEXT GENERATION AND EDITING

2023-12-06 20:12

本文主要是介绍ANYTEXT: MULTILINGUAL VISUAL TEXT GENERATION AND EDITING,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ANYTEXT: MULTILINGUAL VISUAL TEXT GENERATION AND EDITING

Yuxiang Tuo, Institute for Intelligent Computing, Alibaba Group, ICLR2024 (6668), Code, Paper

1. 前言

在这里插入图片描述

基于扩散模型的文本到图像最近取得了令人印象深刻的成就。尽管当前用于合成图像的技术是高度先进的,并且能够以高保真度生成图像,但是当聚焦于生成的图像中的文本区域时,仍然有可能泄露显示,因为合成的文本通常包含模糊、不可读或不正确的字符,使得视觉文本生成成为该领域中最具挑战性的问题之一。为了解决这个问题,我们介绍了AnyText,这是一种基于扩散的多语言视觉文本生成和编辑模型,专注于在图像中呈现准确连贯的文本。AnyText包括一个具有两个主要元素的扩散管道:一个辅助潜在模块和一个文本嵌入模块。前者使用文本字形、位置和遮罩图像等输入来生成用于文本生成或编辑的潜在特征。后者采用OCR模型将笔划数据编码为嵌入,嵌入与标记器的图像字幕嵌入相融合,生成与背景无缝集成的文本。我们采用文本控制扩散损失和文本感知损失进行训练,以进一步提高写作准确性。AnyText可以用多种语言书写字符,据我们所知,这是第一部解决多语言视觉文本生成问题的作品。值得一提的是,AnyText可以插入社区中现有的扩散模型,以便准确地渲染或编辑文本。经过广泛的评估实验,我们的方法显著优于所有其他方法。此外,我们还提供了第一个大规模的多语言文本图像数据集AnyWord-3M,其中包含300万个带有多种语言OCR注释的图像-文本对。基于AnyWord-3M数据集,我们提出了用于评估视觉文本生成准确性和质量的AnyText基准。

2. 整体思想

整体就是基于了ControlNet,只不过有一些额外的细节创新吧,工作量比较足。Control Net确实强啊,就是一般人train不起。

3. 方法

如下图所示,AnyText框架包括一个文本控制扩散pipeline,该pipeline具有两个主要组件(辅助潜在模块和文本嵌入模块)。总体训练目标定义为:
L = L t d + λ L t p L = L_{td} + \lambda L_{tp} L=Ltd+λLtp在这里插入图片描述

3.1 TEXT-CONTROL DIFFUSION PIPELINE

如上图,带文本的图像 x 0 x_0 x0经过VAE编码为 z 0 z_0 z0,然后获得加噪的 z t z_t zt。正常训练只需要由 z t z_t zt预测噪声 ϵ \epsilon ϵ。这里作者使用的是ControlNet的思想,也就是 z t z_t zt只经过冻结的U-Net。另外拷贝一个U-Net的编码层,命名为TextControlNet。输入是 z a z_a za z t z_t zt相加,然后控制U-Net。这使TextControlNet能够专注于文本生成,同时保留基本模型生成没有文本的图像的能力。此外,通过模块化绑定,各种基本模型也可以生成文本。如下图:

在这里插入图片描述

3.2 AUXILIARY LATENT MODULE

如图2,辅助信息包含字形 l g l_g lg,位置 l p l_p lp和掩码 l m l_m lm l g l_g lg就是图片中对应的文字,因为曲线到文字不好直接画出,所以这个文字直接是矩形的。 l p l_p lp是对文字的地方掩码,在推理时候根据用户的输入掩码来生成,如下:
在这里插入图片描述

l m l_m lm是除了文字以外的内容,是我们要保留的地方。文成图阶段, l m l_m lm是全掩码,在文本编辑阶段是想编辑的区域。在训练过程中,文本编辑模式比以σ的概率随机切换。

为了融入这些条件, l g l_g lg l p l_p lp经过堆叠的卷积层 G G G P P P提取到与 z t z_t zt同样分辨率到特征图, l m l_m lm经过VAE编码器 ϵ \epsilon ϵ,最终他们相加经过一个卷积融合层 f f f得到 z a z_a za
z a = f ( G ( l g ) + P ( l p ) + ϵ ( l m ) ) z_a = f(G(l_g)+P(l_p)+\epsilon(l_m)) za=f(G(lg)+P(lp)+ϵ(lm))

3.3 TEXT EMBEDDING MODULE

文本编码器擅长从标题中提取语义信息,但要呈现的文本的语义信息可以忽略不计。此外,大多数预训练的文本编码器都是基于拉丁数据进行训练的,不能很好地理解其他语言。在 AnyText 中,我们提出了一种解决多语言文本生成问题的新方法。具体来说,我们将字形行渲染成图像,编码字形信息,并从标题tokens替换它们的嵌入。然后,将替换后的嵌入作为tokens馈送到基于transformer的文本编码器中,以获得融合的中间表示,然后使用交叉注意力机制将其映射到UNet的中间层。由于使用了文本的图像渲染,而不是仅仅依赖于特定语言的文本编码器,我们的方法显著增强了多语言文本的生成,如下图所示:
在这里插入图片描述

具体来说,text2img中,“”双引号中的单词BEVERLY和HILLS被分别制作为两个图像,这个图像经过OCR的编码器并通过可学习的卷积调整并替换整个句子中对应的tokens。这么做的目的是,为了在训练阶段文本编码中对于特定文本的语言信息更强,或者说,相对于冻结的text encoder和OCR encoder,这里给模型更多调整的空间,个人认为。

在这里插入图片描述

3.4 TEXT PERCEPTUAL LOSS

我们提出了一种文本感知损失,以进一步提高文本生成的准确性。假设 ε t ε_t εt表示去噪网络 ε θ ε_θ εθ预测的噪声,我们可以将时间步长 t t t和噪声潜像 z t z_t zt相结合来预测 z 0 z_0 z0。这可以进一步与VAE解码器一起使用,以获得原始输入图像的近似重建,表示为 x ′ 0 x′_0 x0。通过从潜在空间过渡到图像空间,我们可以在像素级别上进一步监督文本生成。借助位置条件 l p l_p lp,我们可以准确地定位生成文本的区域。我们的目标是将该区域与原始图像 x 0 x_0 x0中的相应区域进行比较,并仅关注文本本身的书写正确性,不包括背景、字符位置、颜色或字体样式的偏差等因素。因此,我们采用PP-OCRv3模型,如第3.3节所述,作为图像编码器。通过裁剪、仿射变换、填充和归一化等操作处理位置 p p p处的 x 0 x_0 x0 x ′ 0 x′_0 x0,我们获得了用作OCR模型输入的图像 p g p_g pg p ′ g p′_g pg。我们利用全连通层之前的特征图,分别表示原始图像和预测图像中位置$p4处的文本书写信息。文本感知损失表示为:
在这里插入图片描述

4. DATASET AND BENCHMARK

在这里插入图片描述

目前,缺乏专门为文本生成任务量身定制的公开数据集,尤其是涉及非拉丁语言的数据集。因此,我们提出了AnyWord-3M,这是一个来自公开图像的大规模多语言数据集。这些图像的来源包括NoahWukong Gu等人,LAION-400M-Schuhmann等人,以及用于OCR识别任务的数据集,如ArT、COCO Text、RCTW、LSVT、MLT、MTWI、ReCTS。这些图像涵盖了包含文本的各种场景,包括街景、书籍封面、广告、海报、电影框架等。除了直接使用注释信息的OCR数据集外,所有其他图像都使用PP-OCRv3检测和识别模型。然后,使用BLIP-2重新生成字幕。

通过严格的过滤规则和细致的后处理,我们总共获得了3034486张图像,超过900万行文本和2000多万个字符或拉丁单词。我们从KongWu和LAION子集中随机提取了1000张图像,以创建名为AnyText基准的评估集。这两个评估集分别专门用于评估中文和英文生成的准确性和质量。剩下的图像被用作名为AnyWord-3M的训练集,其中大约160万张是中文,139万张是英文,还有1万张是其他语言的图像,包括日语、韩语、阿拉伯语、孟加拉语和印地语。

对于AnyText基准测试,我们使用了三个评估指标来评估文本生成的准确性和质量。首先,我们使用句子准确性(Sen.Acc)度量,其中根据指定的位置裁剪每个生成的文本行,并将其输入PP-OCRv3识别模型以获得预测结果。只有当预测的文本完全符合基本事实时,它才被认为是正确的。此外,我们使用了另一个不太严格的度量标准,归一化编辑距离(NED)来测量两个字符串之间的相似性。这两个指标是使用OCR模型进行评估的。然而,仅仅依靠OCR并不能完全捕捉图像质量。因此,我们引入了Frechet Inception Distance(FID)来评估生成的图像和真实世界图像之间的分布差异。

5. 实验

我们的训练框架是基于ControlNet实现的,模型的权重是从SD1.52初始化的。我们的模型在AnyWord-3M数据集上使用8个A100 GPU进行了10个epochs的训练。我们采用了渐进微调策略,在前5个时期关闭编辑分支,然后在接下来的3个时期以σ=0.5的概率激活。在最后两个时期,我们启用了权重系数λ=0.01的感知损失 l g l_g lg l p l_p lp的图像尺寸被设置为1024x1024和512x512,而 e g e_g eg p g p_g pg p ′ g p′_g pg都被设置为80x512。我们使用AdamW优化器,学习率为2e-5,批量大小为48。在采样过程中,每个图像最多选择5条文本行,每个文本行最多选择20个字符来渲染到图像上,因为此设置可以覆盖数据集中的大多数情况。


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

5.1 消融实验

在这里插入图片描述

  1. Editing: 比较实验1和实验2,我们观察到当启用编辑分支时略有下降。这是因为文本生成和编辑是两项不同的任务,启用编辑分支增加了模型收敛的难度。为了集中精力分析文本生成部分,我们通过将概率参数σ设置为0,在所有后续实验中禁用了编辑。
  2. Position: 比较Exp.3和Exp.4,尽管 l g l_g lg中渲染的文本隐含地包含位置信息,但包含更准确的位置 l p l_p lp进一步提高了性能,并使模型能够在不规则区域中生成文本。
  3. Text Embedding: 在实验1~2中,字幕由CLIP文本编码器直接编码。在实验3中,我们使用文本嵌入模块将图像字幕的语义与文本的字形信息融合,使Sen-Acc度量显著提高了26.6%,这表明了该方法的显著优势。
  4. Text Perceptual Loss: 实验5~7验证了文本感知损失的有效性。在进行三个实验后,我们发现λ=0.01产生了最好的结果,与Sen-Acc度量中的Exp.3相比,提高了4.7%。值得注意的是,感知损失需要从潜在空间过渡到图像空间,这减缓了训练过程。因此,对于实验5~7,我们从实验3的13个epoh开始训练,只为剩下的2个epoch进行训练。尽管如此,知觉丧失表现出显著的改善。

这篇关于ANYTEXT: MULTILINGUAL VISUAL TEXT GENERATION AND EDITING的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/463162

相关文章

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

Python安装llama库出错“metadata-generation-failed”

Python安装llama库出错“metadata-generation-failed” 1. 安装llama库时出错2. 定位问题1. 去官网下载llama包 2.修改配置文件2.1 解压文件2.2 修改配置文件 3. 本地安装文件 1. 安装llama库时出错 2. 定位问题 根据查到的资料,发现时llama包中的execfile函数已经被下线了,需要我们手动修改代码后

【ReactJS】困惑于text/babel与browser.js还是babel.js?

使用JSX   使用JSX,可以极大的简化React元素的创建,JSX抽象化了React.createElement()函数的使用,其语法风格类似于HTML语法风格。对比如下代码可以让你更好的理解这一点。 // 使用React.createElement()return React.createElement('div',null,'Hello',this.props.name);//使用J

【Visual Studio 报错】未加载 wntdll.pdb(一种可行的解决办法)

调试程序时,会出现下面这个报错 分析原因: 出现未加载 wntdll.pdb 报错大概率是你的指针使用错误 ,比如使用野指针、越界访问、或者堆区空间释放方式错误等。 这里以 堆区空间释放方式错误 为例子 1、堆区开辟的数组空间使用 delete 释放 // 堆区开辟的数组空间使用 delete 释放int* p = new int[10];delete p; 正

查看Excel 中的 Visual Basic 代码,要先设置excel选项

1. excel VB的简单介绍 百度安全验证 2.excel选项设置 excel表格中在选项->自定义功能区域,选择开发工具,visual baisc/查看代码,即可看到代码。 3.excel已经设置,可以直接查看

Android:EditText在hint字体大小和text字体大小不一致时的设置方法

今天碰到一个需求,有一个输入框EditText,要求输入某项金额,要求在未输入文字之前,hint提示,输入文字之后显示输入的文字,要求是未输入内容时hint字体大小为14sp,输入金额之后字体大小要变成30sp。,可是EditText本身没有这个属性可以设置,怎么办呢,只有在代码中添加监听事件了: /*** 添加监听,在hint时和text时切换字体大小*/cetMoney.addTextCha

[VC] Visual Studio中读写权限冲突

前置场景: 编译没有报错,但是运行提示 内存异常: 情景1: 如下代码运行异常,提示引发了异常:写入权限冲突。*** 是 0xFFFFF..... char* str = (char*)malloc(10);str[0] = 0x30;  解决方案:要包含头文件<stdlib.h>  情景2: 在FileA文件调用FileB文件的函数,但是在FileA中却没有声明该B函数的原型

解决Visual C++ 中相互包含头文件的问题

在编MFC应用程序时,经常会遇到头文件相互包含的问题,很是苦恼,于是便求助于强大的CSDN,得到如下答案:   方法一:利用友元类   我一共有两个类,由于要在两个类的头文件里互相应用对方,所以,在每一个类的头文件里面现包含另一个类的头文件,然后在该类的定义中声明另一个类为友元类。如下:    #include "B.h"      class CA: public CDialog