Python深度学习基于Tensorflow(15)OCR验证码 文本检测与识别实例

Python深度学习基于Tensorflow(15)OCR验证码 文本检测与识别实例

文章目录

文本检测

文本识别

CTC层

生成验证码并制作数据集

建立模型

模型推理

参考

文本检测

文本检测和目标检测类似,其不同之处在于文本目标具有序列特征,有连续性,可以通过结合 Faster R-CNN 和 LSTM 的方式进行文本检测,如 CTPN 网络,其网络结构来自论文: Detecting Text in Natural Image with Connectionist Text Proposal Network (arxiv.org);

CNN学习的是感受野内的空间信息,LSTM学习的是序列特征。对于文本序列检测,显然既需要CNN抽象空间特征,也需要序列特征(毕竟文字是连续的)。

详细可以查看场景文字检测—CTPN原理与实现 - 知乎 (zhihu.com),CTPN网络的缺点很明显,只能识别行排列文本,如果文本充满艺术排列效果就不是很好;

这里有其他更好的方法进行文本检测:

FCENet:[2104.10442] Fourier Contour Embedding for Arbitrary-Shaped Text Detection (arxiv.org)

DBNet:[1911.08947] Real-time Scene Text Detection with Differentiable Binarization (arxiv.org)

DBNet++:[2202.10304] Real-Time Scene Text Detection with Differentiable Binarization and Adaptive Scale Fusion (arxiv.org)

详细介绍可以看这个网站:天天教程 (foobarweb.net)

文本识别

在检测到文本位置后,我们提取出文本图片,将文本图片转化为同一大小格式,接着我们需要执行将文本图片转化为字符串任务;

文章中使用的是 CNN+RNN+CTC(CRNN+CTC) 架构,具体如下图所示

CTC层

CTC (Connectionist Temporal Classification),其被设计用来解决输入序列和输出序列难以一一对应的问题。

我们在特征图展开为特征序列这一步骤中,将原始特征图切割成不同的小块,理想情况是不同小块分别顺序对应目标字符串中某一字符,由于图片的无规则性以及感受野的存在,这种情况是不现实的,目标字符串中的字符很有可能被不同的块分别对应,这会导致字符串重复的情况出现,因此我们需要对齐预测序列和真实序列,Sequence Modeling with CTC (distill.pub)详细介绍了这一效果;

CTC 本质上是一个 softmax 矩阵,其 row nums 由预测的字符类别数量决定,其 col nums 又特征图切割成不同的小块的数量决定,这里 col nums 又称为时间步 T , 假设我们预测的字符串长度为 true_string_length ,由于每一时间步只能预测一个字符再加上空字符和重复字符的出现,我们必须要保证时间步 T 要大于 true_string_length ;

对重复字符进行删除,如下图1所示,这会导致两个问题:

通常,强制每个输入步骤与某些输出对齐是没有意义的。例如,在语音识别中,输入可能会出现一段沉默而没有相应的输出。

我们无法产生连续多个字符的输出。考虑对齐方式 [h, h, e, l, l, l, o]。折叠重复将产生“helo”而不是“hello”。

这里引入一个空字符: ϵ \epsilon ϵ,利用该字符去间隔重复字符,然后进行删除就可以解决上面两个问题,具体效果如上图2所示;

如何具体实施这一操作呢,这里我们可以对 y 进行处理,对 y 做一个简单的变换: π 0 = [ ϵ , y 1 , ϵ , y 2 , ϵ , … , y n , ϵ ] \pi_0=[\epsilon, y_1,\epsilon,y_2,\epsilon,\dots,y_n,\epsilon] π0​=[ϵ,y1​,ϵ,y2​,ϵ,…,yn​,ϵ] 得到其概率为 p ( π 0 ∣ X ) p(\pi_0|X) p(π0​∣X),由于 y 的变换有很多,如果 y 1 y_1 y1​ 不等于 y 2 y_2 y2​ ,那么有许多的新变换,如 π 1 = [ ϵ , y 1 , y 2 , ϵ , ϵ , … , y n , ϵ ] \pi_1=[\epsilon, y_1,y_2,\epsilon,\epsilon,\dots,y_n,\epsilon] π1​=[ϵ,y1​,y2​,ϵ,ϵ,…,yn​,ϵ] 等等

这里将所有的变换的概率值作为损失,得到损失如下: L = ∑ i − log ⁡ p ( y i ∣ X i ) = ∑ i ∑ j − log ⁡ p ( π i j ∣ X i ) \mathcal{L} = \sum_i -\log p(y_i|X_i)=\sum_i \sum_j-\log p(\pi_{ij}|X_i) L=i∑​−lo

相关推荐

魔兽世界国服直升90只要150!今日商城已上架
365名品汇推荐码多少

魔兽世界国服直升90只要150!今日商城已上架

📅 07-20 👍 493
数字电视十大品牌排行榜
best365官网投注链接

数字电视十大品牌排行榜

📅 09-03 👍 506
Lemon的英文名含义读音来源寓意介绍
best365官网投注链接

Lemon的英文名含义读音来源寓意介绍

📅 09-02 👍 71