机器学习周报四十四
摘要
本周还是寻找到一个可以替换OCR的内容一致性损失,合成了新的数据集,以训练一个保持内容一致性的轻量级模型来替代OCR。
Abstract
This week, we managed to find a content consistency loss that can replace OCR, and synthesized a new dataset to train a lightweight model that maintains content consistency to replace OCR.
内容一致性
循环一致性微调的流程:
第一步生成任务的目标是用target_glyph的内容替换img1原来的内容source_glyph得到img2_pred;第二步的目标是用source_glyph替换img2_pred的内容得到img1_pred,最后计算img1_pred与img1的损失。
问题:
1、模型会走捷径,将img1复制到img2_pred,再把img2_pred复制到img1_pred,过程忽略掉了target_glyph,模型什么都没有学到。
由此,尝试了几种方法
方向向量损失:
方向向量delta=source_glyph-target_glyph和alpha=img1-img2的方向应该是一致的,cos_sim = F.cosine_similarity(delta,alpha)应该接近1,即角度为0,实际上这个更要求域的不变性,例如字形域将字形图片source_glyph映射到(1,2)、target_glyph映射到(2,1),由于背景的影响可能会导致img1映射到(3,5),img2映射到(1,3)
可以看到两个向量的方向完全不一致,所以方向损失的一致性会出问题。
其实好的监督项就是图片的内容,文本内容就是限制了img2_pred的内容要和target_glyph一样,避免图片的复制,但是如果引入OCR,就需要多语言字典,加入其他语言就需要重新训练一个识别多语言的OCR模型。
不使用OCR,避免复制的一些方法:
幅度损失:
1、两个字形target_glyph和random_glyph,两个字形输入模型得到两个结果target_img、random_img,target_img和random_img在隐空间latent之间计算相对于source_img的变化量
$ \alpha_1 = I_t - I_s \ \alpha_2 = I_r - I_s $
$ \delta_1 = G_t - G_s \ \delta_2 = G_r - G_s $
如果字形空间的 δ 1 > δ 2 \delta_1>\delta_2 δ1>δ2,那么也应该 α 1 > α 2 \alpha_1 > \alpha_2 α1>α2,比如原始的字形是’Hello’,目标的字形是’World’,随机的字形是’am’,那么am和Hello的差异比World和Hello的差异幅度更大,生成的图片也应该遵循这个关系,就避免模型直接复制原图,如果是走复制捷径,那么两个隐空间张量做差,幅度应该是很小的,不会体现出差异性。
自相似性,都是用一个内容,借助一个余弦相似度损失,target_glyph和忽略了背景的target_img应该是相似的。
问题:
1、隐空间可能会把所有的字形映射到同一个向量,然后所有的风格图片也是映射固定向量,然后幅值损失就是固定的。计算两个字形之间的差异,两个字形是不同的,那么就强调这两个字形的方向应该不一致,所以不会映射到固定的向量。 F . c o s i n e _ s i m i l a r i t y ( G t , G r ) F.cosine\_similarity(G_t,G_r) F.cosine_similarity(Gt,Gr)让这个相似度更接近1.
2、模型可能会随机加入噪声,来适应这种要求,不改变应该改变的文本内容,而是在背景加入噪声,引起这种幅度的差异。需要忽略背景的差异,因为字形图片的背景都是灰色,相互之间就只存在内容之间的变量。而风格图片之间由于背景的差异,相互之间的差异有背景和内容的差异,所以应该忽略背景的变化幅度,应该更关注内容的变化幅度。
思考:
这些角度、幅度损失都只是为了达到和内容损失接近的效果,但是都太主观或者没有想到域一致性的问题,文字识别(OCR)的内容损失可以强制循环生成中第一次生成的内容img2_pred必须要是和target_glyph一样的内容,但是文字识别模块会带来的问题就是,需要一个很大的字典,英语只有26个字母和一些符号,全部加起来大小一共也就96的字典大小,但是,中文常用字有3000多个,而且加入一个新的语言就要一个新的字典。
既然内容损失是为了一致,那么训练一个不需要把结果映射到字典上的模型,只是判断两个图片的内容是不是一样的,忽略掉背景、风格和字体,只是判断内容。
于是设计一个vgg16以为backbone的判别模型,模型只是判别两个图片的内容是不是一致,但是这个任务不能太简单了:
一条数据不能只有两个内容配对/不配对的图片,这样模型在走捷径,直接判断有字就一样,而不是判断字是不是不一样。
数据应该含有在不同的背景下具有相同内容的数据,这样可以去掉背景的影响,相同的背景,不同的字体,去掉字体的影响。
于是,从论文TripleFDS得到的灵感,生成一个SCB数据集,一条数据就有8(2风格*2背景*2字体)张图片
def triplet(anchor, positive, negative):
d_ap = 1 - F.cosine_similarity(anchor, positive, dim=-1)
d_an = 1 - F.cosine_similarity(anchor, negative, dim=-1)
return F.relu(d_ap - d_an + self.margin).mean()
loss = 0.0
# z_S_C_B
loss += triplet(z_111, z_112, z_122)
loss += triplet(z_211, z_212, z_222)
loss += triplet(z_111, z_211, z_221)
loss += triplet(z_112, z_212, z_222)
loss += triplet(z_111, z_212, z_121)
loss += triplet(z_111, z_212, z_221)
z_111和z_112只有背景变了,必须认为是一样的(距离拉近)。但是,z_122跟正样本 z_112用的是完全相同的背景2,不能因为背景一样就把z_122认错成一样的,要忽略背景2看到它其实是内容B,把它推开。
z_111和z_211只有字体变了,必须认为是一样的(距离拉近)。但是,z_221跟正样本 z_211用的是完全相同的字体2,不能因为字体一样就把z_221认错成一样的,要忽略背景2看到它其实是内容B,把它推开。
z_111和z_212的背景和字体都变了,但是内容不变,必须认为是一样的(距离拉近)。但是,z_121跟正样本z_111之间的内容不一样,不能因为其他就把z_121认错成一样的,要看到它其实是内容B,把它推开。
对比学习实际上是在做"空间结构的不变性检验",在忽略背景、字体、颜色、形状拉伸的差异,唯一剩下可以区分正负样本的信号就是内容信号。
总结
当前训练模型发现存在过拟合的问题,训练损失在下降,但是验证损失类似一条直线,基本不下降,后续还要继续修改,
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)