【论文阅读】Perceiving Stroke-Semantic Context: Hierarchical Contrastive Learning for Robust Scene Text Re

Perceiving Stroke-Semantic Context: Hierarchical Contrastive Learning for Robust Scene Text Recognition

作者:Hao Liu1†, Bin Wang1, Zhimin Bao1, Mobai Xue1,2‡, Sheng Kang1,2‡, Deqiang Jiang1, Yinsong Liu1, Bo Ren1

单位:腾讯优图实验室,中国科学技术大学

出处:AAAI2022

Abstract

提出PerSec(Perceiving Stroke-Semantic Context)

由于场景文本图像同时拥有视觉和语义属性,本文为提出的PreSec配备了双重上下文感知器,可以通过对未标记的文本图像数据的分层对比学习同时获取和比较赖在低级笔画和高级语义上下文空间的潜在表征。实验表明本文提出的方法在获取到更好的结果的同时具有很强的泛化性能。

Introduction

场景文本识别的难点在于:文本的字体、颜色、书写风格和光照、遮挡、低分辨率等各种外部因素的影响。且由于场景文本图像可能来自任何场景,因此其语义有丰富的多样性。

在这里插入图片描述

之前的研究试图通过纳入语言模型的方式增加算法的语义能力,但那些方法大多数都属于有监督学习,非常依赖大量注释数据,但数据的人工标注非常昂贵,因此在某种程度上阻碍了这些方法的适用性。

目前,一些基于自监督对比学习的方法取得了可观的成就,这些方法大多遵循pre-training and fine-tuning范式,但这种方法在STR领域比较少见。

主要贡献

  • 提出了一种新的分层自监督学习方法PreSec,可以同时从笔画和语义上下文中学习鲁棒表示
  • 设计了一种新颖的上下文感知模块,该模块配备了可学习量化器和上下文聚合器,可以有效地将每个元素与其上下文区分开来,该模块是可插拔的。
  • 实验表明该方法在无监督和半监督学习环境下都能达到SOTA性能。
  • 提出了一个无标签的大型真实场景数据集UIT-100M,可以极大提高PerSec的性能。

Method

Architecture Overview

在这里插入图片描述
STR 任务通常会使用编码器-解码器作为pipeline。

将搭载了笔画-语义上下文感知器的Encoder用PerSec方法进行预训练,通过多层对比学习来学习鲁棒的文本图像表征,为了进行STR任务,为预训练好的Encoder加上Decoder,Decoder可以基于CTC也可以基于注意力,最后根据标记好的数据对pipeline进行微调。

Base Encoder

文本使用了两种编码器:CNN-based Encoder和ViT-based Encoder。

其结构如图:
在这里插入图片描述
在这里插入图片描述

Context Perceiver

在这里插入图片描述

为了学习鲁棒的分层文本表征,本文设计了Context Perceiver(CP)模块。

该方法将低级笔画编码器和高级的语义编码器的输出特征送入CP模块,该模块能将输入特征的每个元素与其上下文区分开来,也就是说,对比操作进发生在同一样本的特征元素内。

如图3,CP模块具有双分支结构,包括Context Aggregator(粉色部分)和Quantizer(蓝色部分)。

Context Aggregator

输入的特征 F ∈ R w × h × d F\in \mathbb{R}^{w\times h \times d} FRw×h×d首先通过一个掩码语言模型进行掩码处理得到掩码特征 F ′ ∈ R w × h × d F'\in \mathbb{R}^{w \times h\times d} FRw×h×d,再将该掩码特征经过位置编码送入N个含有W-MHSA和FFN的模块中,考虑到Context Aggregator需要协调来自低级特征图和高级特征序列的聚合,所以位置编码采用了2-D位置编码。得到的特征 F ^ \hat{F} F^可表示为:
F ^ = F ∗ σ ( D W C o n v ( F ) ) \hat{F}=F*\sigma(DWConv(F)) F^=Fσ(DWConv(F))
其中 σ \sigma σ表示sigmoid函数, D W C o n v ( ⋅ ) DWConv(·) DWConv()是一个3*3的深度卷积。

由于想要得到的场景文本图像的slow Feature通常包含在局部上下文中,且在低级笔画特征空间内,slow Feature代表笔画模式(如汉语的偏旁),而在高级语义特征空间中,slow Feature表示语义信息。为了更好地从局部上下文中捕获slow Feature,本文设计了W-MHAS:
W − M H S A ( Q , K , V ) = s o f t m a x ( Q K T d + M w i n ) V T = w ⋅ h        1 ≤ w ≤ T W-MHSA(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d}}+M_{win})V \\ T=w·h \;\;\; 1 \leq w\leq T WMHSA(Q,K,V)=softmax(d QKT+Mwin)VT=wh1wT

最后生成标签C.

Quantizer

Quantizer的任务是生成伪标签 P ∈ R T × d P\in \mathbb{R}^{T\times d} PRT×d。(这里原文写得有点抽象,可能是想读者去看那几篇它引用的论文,这里只简单说一下这个是干啥的。)

然后在Context Aggregator生成的上下文聚合特征C和Quantizer生成的伪标签P上做对比学习。

Pre-training Strategy

掩码技巧

掩码的大小为 m l o w × m l o w , 1 ≤ m l o w ≤ h m_{low}\times m_{low},1\leq m_{low}\leq h mlow×mlow,1mlowh, h h h时特征图的高度。一个特征图上可能存在多个掩码,其数量与特征图大小 w ⋅ h w·h wh成一定比例。对于T时间步长的高级特征序列,本文将掩码设置为 m h i g h m_{high} mhigh的连续时间步长, 1 ≤ m h i g h ≤ T 1\leq m_{high} \leq T 1mhighT,掩码的个数为 p h i g h ⋅ T p_{high}·T phighT。如果特征元素被掩码,它们将被替换为一个可训练的特征向量,由所有掩码元素共享,并且确保每个蒙版不重叠。

Loss Function

损失函数包括对比损失( L s t r o k e c o n , L s e m a n t i c c o n L_{stroke}^{con},L_{semantic}^{con} Lstrokecon,Lsemanticcon)和多样性损失( L s e m a n t i c d i v , L s e m a n t i c d i v L_{semantic}^{div},L_{semantic}^{div} Lsemanticdiv,Lsemanticdiv)两部分。
L = L s t r o k e c o n + α L s t r o k e d i v ⏞ s t r o k e − l e v e l + L s e m a n t i c c o n + β L s e m a n t i c d i v ⏟ s e m a n t i c − l e v e l L=\overbrace{L_{stroke}^{con}+\alpha L_{stroke}^{div}}^{stroke-level}+\underbrace{L_{semantic}^{con}+\beta L_{semantic}^{div}}_{semantic-level} L=Lstrokecon+αLstrokediv strokelevel+semanticlevel Lsemanticcon+βLsemanticdiv
对比损失可表示为:
L ∼ ( c o n ) ( i ) = − log ⁡ exp ⁡ ( s i m ( c i , p i ) / τ ) ∑ k ∈ I m a s k exp ⁡ ( s i m ( c i , p i ) / τ ) L_{\sim}^{(con)}(i)=-\log{\frac{\exp(sim(c_i,p_i)/\tau)}{\sum_{k\in I_{mask}}\exp(sim(c_i,p_i)/\tau)}} L(con)(i)=logkImaskexp(sim(ci,pi)/τ)exp(sim(ci,pi)/τ)
其中 c i , p i c_i,p_i ci,pi分别为上下文聚合特征C和伪标签P的第i个掩码元素,它们共同构成正样本对, p k p_k pk表示报刊正样本和负样本的其他掩码元素的第k个元素, I m a s k I_{mask} Imask为所有掩码元素的索引, s i m sim sim是余弦相似度, s i m ( a , b ) = a T b ∥ a ∥ ∥ b ∥ sim(a,b)=\frac{a^Tb}{\|a\|\|b\|} sim(a,b)=a∥∥baTb

多样性损失可表示为:
L ∼ d i v = 1 G V ∑ g = 1 G ∑ v = 1 V p g , v log ⁡ p g , v . L_{\sim}^{div}=\frac{1}{GV} \sum_{g=1}^{G} \sum_{v=1}^{V}p_g,v\log p_g,v. Ldiv=GV1g=1Gv=1Vpg,vlogpg,v.

A New Dataset:UTI-100M

在这里插入图片描述

实验结果

截取其中一部分。

在这里插入图片描述

在这里插入图片描述

提场景文本特征的方法值得学习。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的MBTI性格测试的代码示例,使用Go语言编写: ```go package main import ( "bufio" "fmt" "os" "strings" ) func main() { questions := []string{ "I prefer to spend time alone rather than socializing with a large group.", "I rely on my intuition more than on my senses.", "I like to plan things in advance rather than being spontaneous.", "I prefer to have a few close friends rather than many acquaintances.", "I prefer to work alone rather than in a team.", "I value logic and reason more than emotions and feelings.", "I like to have a routine rather than being flexible.", "I prefer to focus on the big picture rather than the details.", "I tend to be more reserved and quiet than outgoing and talkative.", "I like to keep my options open rather than making a decision quickly.", } answers := make([]string, len(questions)) reader := bufio.NewReader(os.Stdin) for i, q := range questions { fmt.Printf("(%d) %s\n", i+1, q) answer, _ := reader.ReadString('\n') answer = strings.TrimSpace(answer) answers[i] = answer } aCount := 0 tCount := 0 for _, a := range answers { switch a { case "A", "a": aCount++ case "T", "t": tCount++ default: fmt.Println("Invalid answer: ", a) } } var mbtiType string if aCount > tCount { mbtiType = "Introverted" } else { mbtiType = "Extroverted" } if answers[0] == "A" || answers[0] == "a" { mbtiType += " Intuitive" } else { mbtiType += " Sensing" } if answers[2] == "A" || answers[2] == "a" { mbtiType += " Judging" } else { mbtiType += " Perceiving" } fmt.Printf("Your MBTI type is %s\n", mbtiType) } ``` 该代码定义了一个问题数组和答案数组,通过循环询问问题并记录答案。然后,对答案数组进行计数,根据计数结果确定MBTI类型(根据A和T的数量)。最后,根据前三个答案,确定MBTI类型的第二个和第三个字母。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值