【项目问答】文本检测与识别

介绍一下你的项目/项目中用到了哪些算法

项目总共分为三部分:文本的检测、识别与界面程序的开发。文本检测通过advanced_EAST算法实现,文本识别通过CRNN实现,界面程序的开发由PyQt5。

advanced_EAST通过VGG16的卷积部分实现特征提取,VGG16通过5个卷积块将通道数依次提升到64、128、256、512、512,并且每经过一个卷积块它的长和宽就除以2,也就是经过卷积后通道数变成512,长和宽变为原始的1/32。然后进行反卷积,具体的做法是先将特征提取的最后一层输出层做反卷积,然后和第4层卷积块的输出做一个concat,concat之后再进行1*1卷积3*3卷积。将结果再进行反卷积,和第3层卷积块重复刚刚的步骤,再将结果进行反卷积和第2层卷积块输出重复步骤,最后进行一个3*3的卷积,最终输出一个宽高是原始宽高1/4,通道数是7的特征映射。

  • 为什么经过一个卷积块长/宽除以2:池化层(最大池化层)的大小是2*2,步长是2,所以每经过1次池化,长宽会除以2
  • 为什么进行特征融合?浅层特征强定位,语义弱,深层特征强语义,定位能力弱,通过融合能够提高特征提取能力
  • 上采样目的:将长宽扩大两倍来保证两者有相同的分辨率
  • 反卷积(unpool)怎么实现的?

先对原图做填充,比如想对一个2*2的卷积反卷积到4*4,那么可以先填充到比4*4更大的特征图,比如6*6,然后再卷积到4*4,填充的方法可以用均值、邻近值进行插值填充

  • concat的目的:在通道上进行拼接,将低层特征和高层特征进行融合更好地提取特征
  • 1*1卷积作用:1、融合各通道之间的信息;2、改变维度:降维或升维
  • 3*3卷积作用:提取特征
  • 通道数是7:第一个通道表示是否有文字,如果有文字的话第2,3通道表示是前点还是后点,如果是前点的话第4,5,6,7个通道表示x-x0,y-y0,x-x1,y-y1,如果是后点那4,5,6,7个通道就是x-x2,y-y2,x-x3,y-y3
  • 前后点:

(1)什么是前后点?

如果文本框是横向的,那么靠近文本框前面的是前点,靠近后面是后点,如果文本框是纵向的,那么靠近上方的是前点,靠近后方的是后点(长边的0.1进行区域划分)

(2)为什么有前后点?

原始的EAST论文使用文本框内的每个特征映射点(长方体的1条)去预测文本框四个顶点的位置,但文本框的形状一般是很长的一条,这时候如果用靠近右侧的特征映射点去预测文本框靠近左侧两个顶点的位置就容易出现很大的偏差

每16个像素点对应1个特征映射点(宽高除以4)

(3)为什么用靠近右侧的特征映射点去预测文本框靠近左侧两个顶点的位置就容易出现很大的偏差?

比如说我们用靠右的特征映射点同时去预测文本框左侧和右侧的顶点,假设label分别是100和10,而预测值是0和0,此时的loss很大;经过若干轮梯度下降后,loss减小,梯度下降过程中模型并不会区分左侧和右侧的差值,那么此时模型对左侧顶点和右侧顶点的预测值是同步靠近的,预测值是90和9,此时左侧点差10个像素点,右侧点差1个像素点,很明显左侧预测值偏差大。

(4)假如只预测到了前点,没有预测到后点,这样只有左上和左下坐标,文本框右边的两个坐标点怎么办?

预测失败,无法形成预测的文本框

(5)没有文本的区域前后点的预测值是多少

理论上这些值都应该预测为0,实际上由于我们在计算损失函数的时候不会计算非文本区域的损失,所以这部分预测值是不确定的,也不需要关注它(注:是不是文本的损失函数还是要计算的,只是不计算前后点和坐标的损失函数)

(6)中间的点怎么处理

中间的点只在判断是否是文本区域,是前点还是后点的时候用到,其他时候为0

  • 为什么选择advance_EAST来做文本检测?有尝试过其它的网络吗

在网上找的时候,看到很多人都在推荐这个网络,此外EAST是一个比较成熟的文本检测算法,网上也有相应的开源实现可以参考,所用的网络结构简单有效,所以选了它。没有尝试其他的网络了,当时时间比较有限

  • 有哪些传统文本检测算法,现在前沿的文本检测算法有哪些/还了解过其他的文本检测算法吗

传统的文本检测是通过寻找连通分支然后进行滑动窗口实现的

当时看过一篇发表在TPAMI上的端到端文本检测和识别论文PAN++,它的文本检测部分是通过Resnet18、特征堆叠金字塔和像素聚类来实现的,文本识别部分是通过注意力机制实现的。

  • VGG16参数量/EAST参数量....

VGG16不加全连接层大概1500万,加上全连接层1.4亿,EAST大概2000多万

计算方式:卷积层就是卷积核的长*宽*输入通道数*输出通道数,全连接层输入层神经元数*输出层神经元数

  • 关于VGG16

(1)网络结构:5个卷积块加3个全连接层,每个卷积块中包含多个卷积层和1个池化层,具体来说是卷积卷积池化、卷积卷积池化、卷积卷积卷积池化、卷积卷积卷积池化、卷积卷积卷积池化(卷积次数22333)

(2)VGG16只是用于特征提取,损失函数和具体任务有关

(3)优点:网络结构简单效果好;缺点:参数量太大

(4)VGG使用2个3*3卷积替代1个5*5卷积的优点

参数量变小,效果更好

  • 损失函数是如何设计的

整个Loss分为三部分,分别是:(1)像素点是否在框内(2)像素点是前点还是后点(3)像素点如果是前点,到(x0, y0)、(x1, y1)的距离;像素点如果是后点,到(x2, y2)、(x3, y3)的距离。前两部分使用的是交叉熵,第三部分使用的是smooth_L1

(1)为什么这样做选择?分类用交叉熵,回归用smooth_L1

(2)回归为什么不用均方误差?smooth_L1的优点

  • 怎么处理数据中经常存在的数据不平衡的问题

EAST正样本的权重等于负样本数占样本总数的比例beta,负样本的权重等于1-beta

  • 后处理是怎么做的 / NMS是怎么做的?

NMS的目的是去除重复框,降低误检,算法的流程是:

(1). 先对网络预测出的所有边界框按分数(属于某个种类的概率)由高到低排列;
(2). 再取分数最高的预测框作为target,分别算出target与其余预测框的IoU;
(3). 若IoU大于某一设定的阈值,则认为该预测框与target同时负责预测同一个物体,所以将该预测框删除,否则就保留该预测框;
(4). 接着在未被删除的预测框中选择分数最高的预测框作为新的target,与它后面的其它框重复上面的步骤,直到判断出所有框是否应该删除

  • NMS的缺点是什么?有什么改进方法吗?

NMS的IOU阈值不容易设定,阈值设置过低容易删除重叠物体,阈值设置过高又容易增大误检。我知道的有两个改进方式:soft NMS与DIOU NMS。soft NMS并不粗鲁地删除所有IOU大于阈值的框,而是降低其置信度(用一个函数来衰减预测框score),DIOU是在IoU loss基础上添加一个惩罚项,该惩罚项用于最小化两个bbox的中心点距离


(介绍一下CRNN:)文本识别部分使用了CRNN算法实现,CRNN由卷积层、循环层和转录层三部分组成。卷积层对输入图像进行特征提取得到特征图,传入循环层后使用双向LSTM对特征序列进行相应的预测,转录层把循环层获取的一系列标签分布转换成最终的标签序列。

  • 什么是RNN,与CNN、LSTM区别

CNN用于处理图像,RNN用于处理文本,RNN可以处理变长的序列信息和长距离的依赖关系

RNN只考虑最近的状态,LSTM的细胞状态会决定哪些状态应该被留下来,哪些状态应该被遗忘。

  • 循环神经网络为什么会出现梯度消失或梯度爆炸,有哪些改进方案

在训练的过程中,序列间从左往右传播时,随着序列长度的增加,反向传播时基于链式法则,梯度一层层的传递下去,假如每层的梯度都比较小,趋向于0,难么n层相乘就会无限趋向于0,这就是梯度消失。反之,如果每层的梯度都很大,那么n层相乘就会趋向于正无穷,这就是梯度爆炸。

梯度爆炸可以通过梯度裁剪缓解,梯度消失可以通过LSTM来缓解

  • 循环神经网络常用的激活函数:tanh、sigmoid
  • 循环神经网络能否使用ReLU作为激活函数

可以,但是只有当w取值在单位矩阵附近才能取得比较好的效果。

CNN中用ReLU函数能解决梯度消失的问题是因为Relu函数梯度为1,能解决梯度爆炸的问题是因为反向传播时w1,w2....wi互不相同,它们连乘很大程度上能抵消梯度爆炸的效果;而RNN中用Relu是若干个相同w连乘,不能解决梯度消失和爆炸的问题。

  • LSTM

        1、LSTM的原理(结构及其计算公式 / 正向传播)

LSTM通过记住一些长期信息来解决梯度消失。首先将当前输入 x^t和上一个状态传递下来的h^{t-1}拼接后乘以对应权重矩阵后经过sigmoid激活函数得到三个门控状态,分别是输入门z^i、输出门z^o、遗忘门z^f,通过tanh激活函数得到z。忘记阶段主要是对上一个节点传进的输入进行选择性忘记,具体是通过忘记门控z^f与传入的c^{t-1}相乘进行控制,选择记忆阶段将选择门控z^i与当前输入内容z相乘,将选择记忆阶段和选择遗忘阶段的结果相加就可得到传输给下一个状态的c^t,输出阶段将刚刚得到的c^t通过tanh放缩后与输出门控相乘来决定哪些状态会当成当前状态的输出h^t,输出y^t也是通过 h^t变化得到。

        2、LSTM中有哪些激活函数,作用分别是什么

输入门、输出门、遗忘门使用sigmoid激活函数,因为sigmoid的输出在0~1间,符合门控的物理定义(如果用relu的话会有个问题,就是relu是没有饱和区域的,那么就没法起到门的作用)。生成候选记忆的时候使用tanh函数,因为tanh输出在-1~1之间,与大多数场景分布是0中心吻合,并且在0附近的梯度大,模型收敛快。

        3、LSTM为什么经常是两层双向的LSTM

双向是为了将文本上下文联系起来,两层LSTM就足够捕捉序列间的信息

  • CTC Loss是怎样的

LSTM层的输出经过softmax层分类后,得到每个特征序列对应的字符。但原始图像的一个字符可能形成多个序列,比如hello(h e l l o)经过softmax层的结果可能是多个h多个e多个l多个o,这个时候就需要进行路径压缩,压缩成hello。直接压缩显然是不行的,CTC引入了占位符,在空白字符处或者重复字符之间进行占位,这样只要softmax层的输出多个h多个e多个l多个o,再加上占位符就可以压缩为hello。以上可以压缩为hello的序列称为路径,存在多个路径可以压缩为hello,CTC算法的目标是最大化所有路径求和的概率。由于算法时间复杂度太高,CTC算法的反向传播采用动态规划求解。

损失函数:CTC loss

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值