完整的文本检测与识别 | 附源码
完整的文本检测与识别 | 附源码
本文将介绍如何使用CRAFT和Clova AI的四阶段场景文本识别框架进行文本检测和识别。
当你读取横幅上的文字时,你会怎么做?你的眼睛首先会检测到文本的存在,找出每个字符的位置,然后识别这些字符。这正是一个深度学习模型需要做的!最近,OCR在深度学习中成为热门话题,其中每个新架构都在努力超越其他架构。
流行的基于深度学习的OCR模块Tesseract在结构化文本(如文件)上表现出色,但在花哨字体的曲线、不规则形状的文本方面却表现不佳。幸运的是,我们有Clova AI提供的这些出色的网络,它们在真实世界中出现的各种文本外观方面胜过了Tesseract。在本博客中,我们将简要讨论这些架构并学习如何将它们整合起来。
使用CRAFT进行文本检测
场景文本检测是在复杂背景中检测文本区域并用边界框标记它们的任务。CRAFT是一项2019年提出的主要目标是定位单个字符区域并将检测到的字符链接到文本实例的全称:Character-Region Awareness For Text detection。
CRAFT采用了基于VGG-16的全卷积网络架构。简单来说,VGG16本质上是特征提取架构,用于将网络的输入编码成某种特征表示。CRAFT网络的解码段类似于UNet。它具有聚合低级特征的跳跃连接。CRAFT为每个字符预测两个分数:
- 区域分数:顾名思义,它给出了字符的区域。它定位字符。
- 亲和力分数:'亲和力'是指物质倾向于与另一种物质结合的程度。
因此,亲和力分数将字符合并为单个实例(一个词)。CRAFT生成两个地图作为输出:区域级地图和亲和力地图。让我们通过示例来理解它们的含义:
输入图像
存在字符的区域在区域地图中标记出来:
区域地图
亲和力地图以图形方式表示相关字符。红色表示字符具有较高的亲和力,必须合并为一个词:
亲和力地图
最后,将亲和力分数和区域分数组合起来,给出每个单词的边界框。坐标的顺序是:(左上)、(右上)、(右下)、(左下),其中每个坐标都是一个(x,y)对。
文本识别:四阶段场景文本识别框架
2019年,Clova AI发表了一篇关于现有场景文本识别(STR)数据集的不一致性,并提出了一个大多数现有STR模型都适用的统一框架的研究论文。
让我们讨论这四个阶段:
转换:记住我们正在处理的是景观文本,它是任意形状和曲线的。如果我们直接进行特征提取,那么它需要学习输入文本的几何形状,这对于特征提取模块来说是额外的工作。因此,STR网络应用了薄板样条(TPS)变换,并将输入文本规范化为矩形形状。
特征提取:将变换后的图像映射到与字符识别相关的一组特征上。字体、颜色、大小和背景都被丢弃了。作者对不同的骨干网络进行了实验,包括ResNet、VGG和RCNN。
序列建模:如果我写下'ba_',你很可能猜到填在空格处的字母可能是'd'、'g'、't',而不是'u'、'p'。我们如何教网络捕捉上下文信息?使用BiLSTMs!但是,BiLSTMs会占用内存,因此用户可以根据需要选择或取消这个阶段。
预测:这个阶段从图像的已识别特征中估计输出字符序列。
作者进行了几个实验。他们为每个阶段选择了不同的网络。准确性总结在下表中:
代码实现
CRAFT预测每个单词的边界框。四阶段STR将单个单词(作为图像)作为输入,并预测字母。如果你正在处理单个字的图像(如CUTE80),使用这些DL模块的OCR将会很轻松。
以下是代码实现的主要步骤:
- 安装要求
- 克隆代码库
- 修改以返回检测框分数
- 从CRAFT中删除参数解析器
- 编写一个单独的脚本,将图像名称和检测框坐标保存到CSV文件中
- 裁剪单词
- 识别(最后一步)
结论
我们已经集成了两个准确的模型,创建了一个单一的检测和识别模块。现在你有了预测的单词和它们的边界框在一个单独的列中,你可以以任何你想要的方式对齐文本!