基于改进EAST算法的文本检测

article/2025/9/10 14:52:41

这段时间阅读研究了EAST算法以及在EAST算法上的改进并完成了复现运用到其他场景中去。

当今社会已进入图像大数据时代,图像数量庞大种类繁多,包含大量的有用知识。从图像中高效、精准、全面地提取文本和地理信息坐标等有用知识这一课题,也成为图像处理的一个重要方向。

随着近些年来深度学习技术不断进步发展,对于一些特定场景的图像文本定位任务成为国内外计算机视觉、模式识别研究方向相关学者的研究方向之一。解决特定场景图像文本信息提取问题依赖于各种神经网络模型算法。需要考虑到各种因素,一般将场景文本提取拆分为两个主要任务:文本定位和文本识别。特定场景图像文本检测算法的大体框架也基于文本定位和文本识别这两大任务.

其中,文本定位算法主要通过计算机自动框定出文本在图像中的位置,作为后续文本识别过程的先行条件,在图像的知识提取中起着重要作用。目前基于深度学习的文本检测算法主要分为两类,一类是基于预选框的文本检测算法,另一类是使用全卷积神经网络直接预测目标位置。文献中提出的EAST(An Efficient and Accurate Scene Text Detector)算法是直接预测文本字符位置的定位算法,算法运行速度快,在基准数据集上准确率高。核心思想是直接预测单词或文本行的倾斜角度及多边形形状,消除多层神经网络中复杂的运算过程,在各种公开的数据集中取得了良好的成果。

同时,文本识别算法主要是通过文本定位的结果定位到文本的位置,然后通过端到端的转录算法将该位置的信息转换为中文文本。

EAST算法是旷世科技在2017年CVPR上提出的一种十分简洁高效的文本检测模型。论文全称是《 EAST: An Efficient and Accurate Scene Text Detector 》。作者在文中提出,过去的文本检测方法虽然实现了不错的效果,但这些方法基本上都是多阶段、多组件的联合作用。换句话说,就是作者认为以往的方法设计的步骤和组件过多,导致它们在一些具有挑战性的场景中表现不够好,速度也不够快。

因此,作者设计了一种十分简洁高效的方法,可以直接通过一个FCN网络来得到字符级或文本行的预测结果。且不论是精度还是速度,在各大基准数据集上都有杰出的表现(在ICDAR2015上得到了0.782的F值和13.2的fps)。方法的整体思路是通过一个FCN直接得到文本框预测,之后将预测通过NMS得到最终结果(two stage)。下面是这项工作的主要贡献:

1. 提出了一个两阶段的场景文本检测方法,FCN+NMS,不需要其他多余耗时的步骤。
2. 该方法可灵活生成字符级或文本行的预测,几何形状可以是旋转框或者矩形框。
3. 在精度和速度都优于当时其他的方法。


那么该算法的优势在于消除传统算法中间冗余而又慢速的步骤,只包含两个主要流程: 一是使用全卷积网络( fully convolutional networks,FCN) 模型直接生成单词或文本行级别预测; 二是将生成的文本预测( 可以是旋转的矩形或四边形) 输入到非极大值抑制 NMS( non-maximum suppression) 中以产生最终结果。而传统的文本检测方法和一些基于深度神经 网络的文本定位方法由若干组件构成,包含多个步骤且在训练时需要对其分别进行调优,耗费时间较多。

我打算先介绍一下EAST算法,然后再详细讲述基于EAST算法的改进。

https://github.com/argman/EAST

这是原作者参与的一份tensorflow版本代码,网上还有其他的实现。

开源代码一般都是在linux环境下编写、测试、运行。

首先是下载源码:

git clone https://github.com/argman/EAST.git

然后就是下载好模型文件放到指定的位置测试。

第一次运行肯定会报错,windows和Linux毕竟不同。

参考博客:https://www.jianshu.com/p/c5a9e1ecf790

报错:import lanms

File "D:\work\Chepai\License-Plate-Recognition-master1\EAST-master\lanms\__init__.py", line 10, in <module>

解决问题的办法是:

注释掉__init__.py中的下面这两行

   

 # if subprocess.call(['make', '-C', BASE_DIR]) != 0:  # return value# raise RuntimeError('Cannot compile lanms: {}'.format(BASE_DIR))

注释掉这两行还是会报错:

   

File "eval.py", line 162, in mainboxes, timer = detect(score_map=score, geo_map=geometry, timer=timer)File "eval.py", line 100, in detectboxes = lanms.merge_quadrangle_n9(boxes.astype('float32'), nms_thres)File "D:\Github\EAST\lanms\__init__.py", line 12, in merge_quadrangle_n9from .adaptor import merge_quadrangle_n9 as nms_impl
ImportError: No module named 'lanms.adaptor'

解决办法是:

结果发现报eval.py中的100行错误,所以把这一行注释掉,换成上一句。

  

  boxes = nms_locality.nms_locality(boxes.astype(np.float64), nms_thres)# boxes = lanms.merge_quadrangle_n9(boxes.astype('float32'), nms_thres)

结果不再报错了。

另外,我自己使用的是windows,所以源码中给出的test方法对我并不适用,会报错找不到模型文件路径。

  

  File "eval.py", line 147, in mainmodel_path = os.path.join(FLAGS.checkpoint_path, os.path.basename(ckpt_state.model_checkpoint_path))AttributeError: 'NoneType' object has no attribute 'model_checkpoint_path'

原因是这个代码在windows下是用不了相对路径,换成绝对路径就可以了。

github 源码中给出的test脚本是:

python eval.py --test_data_path=/tmp/images/ --gpu_list=0 --checkpoint_path=/tmp/east_icdar2015_resnet_v1_50_rbox/ --output_dir=/tmp/

我在windows下使用的脚本是:

(我把下面的脚本写到一个test.bat文件中,这样每次执行就不用敲代码了,双击一下就可以执行)

   

python eval.py --test_data_path=D:/Github/EAST/tmp/images/ --gpu_list=0 --checkpoint_path=D:/Github/EAST/tmp/east_icdar2015_resnet_v1_50_rbox/ --output_dir=D:/Github/EAST/tmp/pause

在windows下的训练脚本train.bat:

   

python multigpu_train.py --gpu_list=0 --input_size=512 --batch_size_per_gpu=8 --checkpoint_path=D:/Github/EAST/tmp/east_icdar2015_resnet_v1_50_rbox/ --text_scale=512 --training_data_path=D:/Github/EAST/data/ocr/icdar2015/ --geometry=RBOX --learning_rate=0.0001 --num_readers=24 --pretrained_model_path=D:/Github/EAST/tmp/resnet_v1_50.ckptpause

第一次跑也是跑不不通,报错:

   

 Generator use 10 batches for buffering, this may take a while, you can tune this yourself.Traceback (most recent call last):File "multigpu_train.py", line 180, in <module>tf.app.run()File "D:\Anaconda3\envs\py35\lib\site-packages\tensorflow\python\platform\app.py", line 126, in run_sys.exit(main(argv))File "multigpu_train.py", line 153, in maindata = next(data_generator)File "D:\Github\EAST\icdar.py", line 726, in get_batchenqueuer.start(max_queue_size=10, workers=num_workers)File "D:\Github\EAST\data_util.py", line 81, in startthread.start()File "D:\Anaconda3\envs\py35\lib\multiprocessing\process.py", line 105, in startself._popen = self._Popen(self)File "D:\Anaconda3\envs\py35\lib\multiprocessing\context.py", line 212, in _Popenreturn _default_context.get_context().Process._Popen(process_obj)File "D:\Anaconda3\envs\py35\lib\multiprocessing\context.py", line 313, in _Popenreturn Popen(process_obj)File "D:\Anaconda3\envs\py35\lib\multiprocessing\popen_spawn_win32.py", line 66, in __init__reduction.dump(process_obj, to_child)File "D:\Anaconda3\envs\py35\lib\multiprocessing\reduction.py", line 59, in dumpForkingPickler(file, protocol).dump(obj)AttributeError: Can't pickle local object 'GeneratorEnqueuer.start.<locals>.data_generator_task'

问题出现在上面的提示  enqueuer.start(max_queue_size=10, workers=num_workers)

参考:https://blog.csdn.net/weixin_41437855/article/details/90259922 的评论stoneboy1211

解决办法:

将icdar.py 724行开始的部分改为(改动部分 True改为False,10改为1,numworks改为1):

    

enqueuer = GeneratorEnqueuer(generator(**kwargs), use_multiprocessing=False)print('Generator use 10 batches for buffering, this may take a while, you can tune this yourself.')enqueuer.start(max_queue_size=1, workers=1)

接着还会报错:

   

Traceback (most recent call last):File "D:\Github\EAST\icdar.py", line 609, in generatortext_polys, text_tags = load_annoataion(txt_fn)File "D:\Github\EAST\icdar.py", line 56, in load_annoataionfor line in reader:UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

解决办法:将icdar.py的54行由

  with open(p, 'r') as f:

改为:

    with open(p, 'r', encoding='utf-8') as f:

接下来训练也可以跑通了。

EAST源码主要包含3个功能模块:

  1. icdar.py此部分主要是对数据进行预处理;
  2. model.model()函数,该函数在model.py中,主要是完成网络结构搭建,特征图的生成;
  3. model.loss()函数,该函数在model.py中,主要是计算损失。
  4. 其他代码说明:

 

下面介绍基于EAST算法的改进。

改进后的EAST算法相比基于候选框的目标检测算法更加准确。对于大比例尺,文本尺度多样的图像中的文本检测更加准确。但仍然存在一些问题。如化学符号等特别密集的区域检测准确率较低。存在改进方向如下:提高更加清晰的训练样本,优化网络结构,进一步提升检测算法的准确性。改进后的EAST算法主要包含5个部分:算法神经网络结构、基于focal-loss[29]优化的损失函数、倾斜的局部感知非极大值抑制网络(NMS)、基于可变尺度的图像分割优化、按比例尺切割训练样本。

改进后的神经网络结构主要由特征提取分支、特征合并分支和输出层三个部分构成。

特征提取分支包含Conv1、Conv2、Conv3、Conv4四组卷积层,使用EAST算法在ImageNet数据集上进行训练,摘取其中部分的卷积神经网络层。其中f1、f2、f3为卷积层中的特征图。大小为原始输入图像的1/32、1/16、1/8、1/4。  

在特征合并分支在每个合并阶段,将特征提取分支f1阶段的特征图输入到反池化层(unpool)中,输出图像为上一阶段输入图像的2倍 ;然后逐步合并,这一步操作会产生一部分计算代价。为提升算法效率,本文通过减少Conv1的通道数,接着合并局部卷积特征,通过Conv3进行操作输出到f3阶段中。在经过所有的特征合并阶段之后,将特征提取分支f4的输入结果输出到输出层当中。

输出层包含置信度、文本区域和文本区域旋转角度、包含8个坐标的矩形文本区域三个部分。最终的输出结果是1×1的卷积提取特征。

 

L为EAST算法的损失函数:

 其中,表示分割图像背景和图像文本的分类损失,文本区域所在的部分表示1,非文本区域的背景部分表示0,即像素点的分类损失。表示对应文本区域的像素点所组成的矩形框和矩形框角度的回归损失。表示两个损失之间的相关性,作者在原EAST算法中将设置为1。

为了简化训练过程,分类损失使用平衡的交叉熵[31],公式如下:

其中表示置信度的预测值,表示置信度的真实值,参数是调制系数,参数是调制系数,主要用来控制正负样本之间的比例。计算公式为:

 表示回归损失,旋转角度损失用表示

其中,预测出来的文本倾斜角度用表示,而文本矩形框真实的倾斜角度则用表示。让AABB表示从像素位置到文本矩形的上下左右4个边界的距离,令为回归损失和旋转角度损失加权和,合称为几何损失,计算公式如下: 

 

非极大值抑制简称NMS,简单理解就是局部最大搜索,主要应用于目标识别、目标检索、回归分析等方向。在图像文本定位过程中,分类器训练结束后会输出多个预测出来的文本矩形框,每个预测框都会有一个分数,但是绝大多数预测框会出现重叠的情况,所以NMS的主要作用就是在文本范围内去输出面积最大的矩形文本框,同时面积较小的文本预测框会收到抑制,得到最终结果。

标准NMS是直接取分数最高的预测框,而局部感知NMS则是基于邻近几个多边形是高度相关的假设,在标准NMS的基础上加了权重覆盖,就是将2个IoU(Intersection Over Union,交并比即重叠区域面积比例)[32]进行比较,首先设定一个面积为S的阈值,然后求两个预测框的交集,如果大于S则合并,反之则删除。经过合并后的预测框,其坐标位置相对于文本区域更加准确,不会浪费每一个预测框的信息,防止误差过大。

由于两个矩形文本框重叠的部分可以是任意多边形,计算重叠区域面积的难度较大。所以局部感知NMS一般采取简化的计算方式,将相交部分近似为一个矩形,每计算一次相当于计算矩形的顶点和坐标轴组成的梯形的面积。图中绿色的面积有四个点的坐标很容易求得。

使用的图像数据集中包含有大量的倾斜文本(文本与水平形成夹角),所以本文在局部感知NMS的基础上增加了倾斜的NMS来处理这些倾斜文本,其基本步骤如下:

(1)对网络输出的旋转矩形文本检测框按照得分进行降序排列,并存储到一个降序列表里。

(2)依次遍历上述的降序列表,将当前的文本框和剩余的其它文本框进行交集计算的到相应的相交点集合。

(3)根据判断相交点集合组成的凸多边形的面积,计算每两个文本检测框的IOU(重叠区域面积比例);对于大于阈值的文本框进行过滤,保留小于阈值的文本框,并得到最终的文本矩形检测框。

 

 

最近实在疲惫不堪了 对于这两天发的博客 会进行完完全全认认真真地重新修改 复现代码也会展示最后如何运用到火车证身份证等新的场景。之后我会在此补充关于EAST和基于改进的EAST的文本检测的代码解释。

参考:https://blog.csdn.net/juluwangriyue/article/details/107295393


http://chatgpt.dhexx.cn/article/nNqlXZVp.shtml

相关文章

自然文本检测主要模型

自然文本检测主要模型 CTPN模型 CTPN是目前流传最广、影响最大的开源文本检测模型&#xff0c;可以检测水平或微斜的文本行。文本行可以被看成一个字符sequence&#xff0c;而不是一般物体检测中单个独立的目标。同一文本行上各个字符图像间可以互为上下文&#xff0c;在训练…

深度学习:多场景多尺度的文本检测

《Fused Text Segmentation Networks for Multi-oriented Scene Text Detection》 用于多场景文本检测的融合文本分割网络。&#xff08;2018.5.7&#xff09; 文章笔记 摘要 - 本文从实例感知语义分割的角度介绍了一种新的面向多向场景文本检测的端到端框架。 我们提出了融…

FOTS:自然场景的文本检测与识别

在这篇文章里&#xff0c;我将分享我实现这篇论文的方法。 问题描述数据集关于数据使用的损失函数准备检测数据准备识别数据训练检测模型和识别模型代码整合显示结果引用 问题描述 我们需要从任何图像(包含文本)检测文本区域&#xff0c;这个图像可以是任何具有不同背景的东…

【文本检测】DBNet

目录 论文正文概述细节整体流程二值化自适应的门限可变形卷积标注损失计算推理 感悟 论文正文 链接&#xff1a;链接&#xff0c;提取码&#xff1a;7fmj 概述 文本检测主流的两个方法就是基于回归的方法和基于分割的方法。 基于回归的方法指的是迁移一些经典的目标检测算法…

openCV实践项目:图片文本检测

上一期我们通过对实验&#xff1a;银行卡卡号识别 加深了对前面所学openCV图像处理的一些理解 openCV实践项目&#xff1a;银行卡卡号识别_老师我作业忘带了的博客-CSDN博客 本次图片文本检测相对于要容易一些&#xff0c;内容如下&#xff1a; 一、流程说明 把一个这样的图片…

TextSnake文本检测

论文《TextSnake: A Flexible Representation for Detecting Text of Arbitrary Shapes》 (1) 数据集 文章中提到了4个数据集&#xff1a; 1) Total-Text&#xff1b;(新开源曲线文本数据集) 2) SCUT-CTW1500; (新开源曲线文本数据集) 3) ICDAR 2015;(经典数据集) 4) MSRA…

值得一看的文本检测方法

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 前 言 目前深度学习方法做文本检测比较普遍&#xff0c;但是也存在一些时候GPU资源不够&#xff0c;这时候就需要一些其他的方法来检测文本信息&#xff0c;本文主要介…

文本检测与识别

基于Advanced_EAST的文本检测算法 Advanced_EAST算法使用全卷积网络结构&#xff0c;输入图像通过全卷积神经网络后直接获得候选文本的位置&#xff0c;再通过非极大值抑制算法&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;获得最后的文本检测结果。 网络…

OCR文本检测模型—EAST

文章目录 一、EAST模型简介二、EAST模型网络结构三、EAST模型效果四、Advanced EAST 典型的文本检测模型一般是会分多个阶段&#xff08;multi-stage&#xff09;进行&#xff0c;在训练时需要把文本检测切割成多个阶段&#xff08;stage&#xff09;来进行学习&#xff0c;这种…

文本检测算法新思路:基于区域重组的文本检测

摘要&#xff1a;文本检测是文本读取识别的第一步&#xff0c;对后续的文本识别有着重大的影响。本文主要介绍基于区域重组的文本检测算法。 本文分享自华为云社区《技术综述十三&#xff1a;弯曲文本检测算法(一&#xff09;》&#xff0c;作者&#xff1a; 我想静静 。 背景…

OCR文本检测模型—CTPN

文章目录 一、CTPN简介二、CTPN检测流程三、小结 一、CTPN简介 一个简单的文字识别流程如下&#xff1a; Step 1. 通过手机、摄像机、扫描仪等设备采集含有待识别字符的图像&#xff0c;作为输入&#xff1b; Step 2. 对图像进行尺寸缩放、明暗调整、去噪等预处理操作&#…

OpenCV实战——文本检测

OpenCV实战——文本检测 tesseract的安装代码实践将图片中的内容识别打印&#xff0c;并绘制边框单词&#xff08;word&#xff09;检测只进行数字识别 tesseract的安装 首先说一下下官网的地址&#xff1a;下载地址 大家根据自己的操作系统&#xff08;是32位还是64位&#…

【文本检测与识别白皮书-3.1】第一节:常用的文本检测与识别方法

点击领取AI产品100元体验金&#xff1a;https://www.textin.com/coupon_redemption/index.htmlhttps://www.textin.com/coupon_redemption/index.html # 3.常用的文本检测与识别方法 ## 3.1文本检测方法 随着深度学习的快速发展&#xff0c;图像分类、目标检测、语义分割以及实…

paddleocr文本检测模型的训练

1、环境的安装和开源项目的下载 首先我个人建议&#xff0c;玩深度学习的话&#xff0c;不管是工作还是学习&#xff0c;最起码要配一个有GPU的电脑。我个人有着血淋淋的教训&#xff0c;我本人是电气工程的一名学生&#xff0c;本科期间一点深度学习和机器学习的基础都没有&am…

文本检测实战:使用OpenCV实现文本检测(EAST 文本检测器)

在本教程中&#xff0c;您将学习如何使用 OpenCV 使用 EAST 文本检测器检测图像中的文本。 EAST 文本检测器要求我们在我们的系统上运行 OpenCV 3.4.2 或 OpenCV 4 。 论文原文&#xff1a;https://arxiv.org/abs/1704.03155 代码地址&#xff1a;https://github.com/argman/…

脏话文本检测方案

目录 1. 场景2. 方案3. 数据增强4. 代码 1. 场景 在问答系统中用户问题可能存在违规情况&#xff0c;包含涉政、色情、辱骂文字的文本视为违规文本。本文提出一种违规文本检测方案&#xff0c; 本方案仅限于判断文本是否包含违规内容&#xff0c;属于文本分类问题。 2. 方案 方…

OCR文本检测模型:FCENet论文阅读笔记

文章目录 前言摘要&#xff08;Abstract)1. 介绍&#xff08;Introduction)2. 相关工作&#xff08;Related Work)3. 方法&#xff08;Approach&#xff09;3.1 傅里叶轮廓嵌入&#xff08;Fourier Contour Embedding)3.2 FCENet 4.实验&#xff08;Experiments)总结 前言 最近…

文本检测数据集标注

工具链接&#xff1a;Curve-Text-Detector/data at master Yuliang-Liu/Curve-Text-Detector GitHub 目录 前言 一、工具介绍 1.标注格式 2.工具使用 二、标注步骤 1.数据准备 2.数据标注 3.数据集label可视化 总结 前言 本次介绍的标注方式和标注工具均为2017年华南…

AI实战:2019、2020最新的中文文本检测检测模型

2019、2020最新的中文文本检测检测模型 1、DBNet&#xff08;Real-time Scene Text Detection with Differentiable Binarization&#xff09; 论文地址&#xff1a;https://arxiv.org/pdf/1911.08947.pdf 作者&#xff1a;华中科技大学 Minghui Liao 1∗ , Zhaoyi Wan 2∗ ,…

人工智能学习--文本检测初探

一、相关概念和综述&#xff1a; 转自知乎热心网友 燕小花女士的内容&#xff0c;供学习使用&#xff0c;若侵权则删。貌似写于2018年12月&#xff0c;之后这几年的流行方法更新&#xff0c;自行搜索sci顶刊和会议论文。 https://zhuanlan.zhihu.com/p/52335619 文本检测的难…