cf102452I. Incoming Asteroids
Posted 吾蒟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf102452I. Incoming Asteroids相关的知识,希望对你有一定的参考价值。
题解
如果说这 $k$ 个的和超过照相机的时间 $s$ ,那至少有一个值 $\\ge s/k$ ,其中 $s/k$ 取上整。
所以对每个星星维护一个堆,按照 $s/k$ 从小到大排序,每次取出看是否符合条件即可。
每次取出, $s$ 至多变为 $2/3\\times s$ ,所以效率为 $O(m \\log_2 m \\log_{2/3}s)$ 。
代码
#include<bits/stdc++.h> #define LL long long using namespace std; const int N=2e5+5; int n,m,t,p[4][N],c[N]; LL a[N],b[N];bool d[N]; struct O{int x;LL v;}; bool operator < (O A,O B){return A.v>B.v;} priority_queue<O>q[N]; int main(){ scanf("%d%d",&n,&m); for (int op,x,y,lst=0;m--;){ scanf("%d%d%d",&op,&x,&y); if (op&1){ x^=lst;p[0][++t]=y;b[t]=x; for (int j=1,u;j<=y;j++){ scanf("%d",&u);u^=lst; p[j][t]=u;b[t]+=a[u]; q[u].push((O){t,a[u]+(x+y-1)/y}); } continue; } x^=lst;y^=lst;a[x]+=y;lst=0; for (;!q[x].empty();){ O u=q[x].top();q[x].pop(); if (u.v>a[x]){q[x].push(u);break;} if (d[u.x]) continue;LL v=0; for (int i=1;i<=p[0][u.x];i++) v+=a[p[i][u.x]]; if (v>=b[u.x]) c[++lst]=u.x,d[u.x]=1; else for (int i=1,k,j=p[0][u.x];i<=j;i++) k=p[i][u.x], q[k].push((O){u.x,(b[u.x]-v+j-1)/j+a[k]}); } printf("%d",lst); sort(c+1,c+lst+1); for (int i=1;i<=lst;i++) printf(" %d",c[i]); puts(""); } return 0; }
文字识别领域经典论文:ASTER
方法概述
本文方法主要解决不规则排列文字的文字识别问题,论文为之前CVPR206的paper(Robust Scene Text Recognition with Automatic Rectification,方法简称为RARE)的改进版。
1. 主要思路
- 针对不规则文字,先矫正成正常线性排列的文字,再识别;
- 整合矫正网络和识别网络成为一个端到端网络来训练;
- 矫正网络使用STN,识别网络用经典的sequence to sequence + attention
2. 方法框架和流程
方法ASTER全称为Attentional Scene TExt Recognizer with Flexible Rectification,包括两个模块,一个用来矫正(rectification network),另一个用来识别(recognition work),如下图所示。
模型结构总览
ASTER是2018年提出的论文,论文的全称是《ASTER: An Attentional Scene Text Recognizer with Flexible Rectification》。ASTER基于encoder-decoder的方式,整体的模型架构以下三块:
-
TPS(Thin-Plate-Spline):分为localization network和grid sampler,前者用于回归出控制点,后者用于在原图上进行网格采样;
-
encoder:卷积神经网络用的是resnet,语言模型使用的是BiLSTM,需要说明的是在后续的DTRB论文中语言模型会单独拆分出来,在这里还是和原论文保持一致;
-
decoder:使用的是基于bahdanau attention的decoder,这里用了两个LSTM decoder。一个从左到右,一个从右到左,进行双向的解码。
2.2 矫正器
从模型结构的总览可以看出,ASTER其实和FAN有诸多的相似之处,最大的不同就在于TPS模块。所以,我们就重点介绍一下这个模块究竟是怎么实现文字的矫正的。首先我们看一下TPS的整体结构,对于形状为(N,C,H_in,W_in)的输入图像I,经过下采样得到I_d,然后通过localization network得到控制点C’。有了C‘我们可以通过TPS得到一个矩阵变换T,接下来我们通过grid generator得到网格P,形状为 (N, H_out, W_out, 2),最后一维的2代表xy。接下来我们通过矩阵变换T将网格P映射至原图上得到P’,形状仍然为 (N, H_out, W_out, 2)。最后根据原图的网格P'采样得到I_r.下面我们进行一一讲解。
2.2.1 Localization Network
localization network就是一个卷积神经网络,里面都是3x3的conv block,最终通过全连接层得到控制点C‘,形状为(20, 2). 20代表上下各10个点,第二维是xy坐标。在这里需要注意全连接层的数值初始化的问题。作者通过对比试验证明了,当全连接层的偏置项初始化为[(0.01, 0.01), (0.02, 0.01), ..., (0.01, 0.99), ..., (0.99, 0.99)]时,即在图片的上下边缘等距采样时,模型收敛的速度更快。
- 定位网络(已经训练完进行测试时)的输入是待识别的未矫正前图像,输出是K个控制点的位置。
- 该定位网络训练时没有用K个控制点作为annotation进行训练,而是直接接入后面的Grid Generator + Sample利用最后的识别结果,连成一个end-to-end的框架进行训练。
- 网络结构采用一个自己设计的普通的卷积网络(6层卷积 + 5个max-pooling + 2个全连接)来预测K个control point的位置(K= 20),点对应关系如下图:
2.2.2 Thin Plate Transformation
由localization network我们得到了C’,然后我们同样用等距采样得到C,C的形状跟C‘一致,但是每两点的距离不是0.01,而是0.05.接下来我们通过如下的矩阵运算得到变换矩阵T,
网格生成器的输入是已有的Control point点集 + 矫正后的图(还未生成,但给定图大小可以取点)上的某个点坐标,输出是该点在矫正前(原图)上的点坐标位置
网格生成器可以看成是一个矩阵变换操作(变换的几个参数a0-a2, b0-b2可以通过Control point位置利用优化问题求解方法求出,因为Control Point在矫正前后的图上的位置都是已知的,故可以计算出对应关系),实际做预测时也是计算该待测点与已知的control point的位置关系,通过一系列对应关系算出在原图的位置。贴个图感受一下这个对应关系如下,p为矫正后的点位置,C为矫正后的Control point的点位置,p'为矫正前的点位置,C’为Control point在矫正前的点位置:
2.2.3 Sampler
Sampler就是给定点映射关系及原图,生成一张新的矫正后的图,用到了简单的插值,以及当超出图外时直接clip掉。另外,Sampler采用可微的采样方法,方便梯度的bp。
输入是原图 + 矫正后的图上的点在原图上的对应位置关系, 输出是矫正后的图
首先利用grid generator得到网格P,然后通过下式我们将P映射到原图的P’.注意P和P‘数值范围都在0到1之间,但在最终进行插值输出的过程中,我们会将P’映射到-1到1之间,这个会在下面的代码看出。
总结:从下图可以看出,其实TPS就是要得到一个变换矩阵,其中C‘是需要进行学习的参数,而C是不变的,即手动调整的参数。根据C和C’可以得到T,然后在原图上采样就得到最终矫正之后的图像。
2.3 特征提取层
本文的特征提取层跟FAN一致,都是先经过resnet,然后经过双向的LSTM,最终得到形状为(B, W, C)的三维特征向量,其中B代表batch size, W是time steps,C是channels.比如说根据原文,当输入大小为(32, 100)时,输出就是(B, 25, 512)
2.4 解码层
本文的解码层和FAN基本类似,但有两处改进。第一点是将原先FAN的单向attention解码改成了双向的attention解码,这点改进的出发点是非常直观的。比如当解码到一个特定的字符时,该字符不仅与左边的语义信息相关,也与右边的相关。双向解码具体的做法如下,分别从左到右以及从右到左进行解码输出,然后去log-softmax得分高的作为最终的输出。这里使用的attention与FAN中的一致,都是bahdanau attention,具体公式就不赘述了。
第二处改进是在最终预测输出的时候,原先我们一般取每个时间步概率最大的字符进行输出,本文改成了束搜索,搜索宽度一般设置成5
3. 代码解读
我们重点看看TPS以及attention decoder,这里的attention decoder用的还是单向的。如果想改成双向的话,直接将(B, L, C)中L的顺序改为从右至左就行。
3.1 TPS
首先我们看看如何回归得到C‘,注意是如何对最后一个全连接层进行初始化的。
3.2 attention decoder
这个实现是用GRU进行解码的,而FAN里使用的是LSTM。另外这个实现是将输入(B, L, W)中的L变成1,所以可以直接用GRU,而不是GRUCell进行解码。但其实我觉得用GRUCell解码更为直观一些。
4. 总结
ASTER在一般attention based的encoder-decoder基础上,加上了TPS作为矫正模块,可以部分缓解由于弯曲文字导致的识别不准确问题。后续也有不少论文是沿着这个方向进行改进的,比如说MORAN、ESIR等等。下一篇我会继续沿着识别弯曲文本的方向,介绍利用2d attention进行文字识别的论文SAR.
本文参考及学习资料推荐:
论文阅读(XiangBai——【PAMI2018】ASTER_An Attentional Scene Text Recognizer with Flexible Rectification ) - lilicao - 博客园
文字识别领域经典论文回顾第四期:ASTER_chibohe123的博客-CSDN博客
以上是关于cf102452I. Incoming Asteroids的主要内容,如果未能解决你的问题,请参考以下文章
Aster DM Healthcare宣布设立全球护理奖,奖金高达25万美元
我们是冠军 恭喜ASTER.Y夺得2021极限冲层赛第二赛季全球总冠军
Aster守护者全球护理奖现已开始接受世界各地护士的申请,奖金高达25万美元