OCR系列——文本检测任务

1. 简介

文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要解决目标分类问题。

目标检测和文本检测同属于“定位”问题。但是文本检测无需对目标分类,并且文本形状复杂多样。

当前所说的文本检测一般是自然场景文本检测,其难点在于:

  • 自然场景中文本具有多样性:文本检测受到文字颜色、大小、字体、形状、方向、语言、以及文本长度的影响;
  • 复杂的背景和干扰;文本检测受到图像失真,模糊,低分辨率,阴影,亮度等因素的影响;
  • 文本密集甚至重叠会影响文字的检测;
  • 文字存在局部一致性,文本行的一小部分,也可视为是独立的文本;

2. 算法分类

3. 算法详解

3.1 基于回归的文本检测

早期基于深度学习的文本检测算法是从目标检测的方法改进来的,支持水平文本检测。常见方法有TextBoxes、CTRN等,随着数据集的丰富,后期又增加了倾斜文本检测和弯曲文本检测。

(1)水平文本检测

TextBoxes根据SSD改进的,将默认的文本框更改为适应文本方向和宽高比的规格的四边形,特点有

 CTPN是基于Fast-RCNN算法,扩展RPN模块并且设计了基于CRNN的模块让整个网络从卷积特征中检测到文本序列,二阶段的方法通过ROI Pooling获得了更准确的特征定位。

(2)任意角度文本检测

TextBoxes++在TextBoxes基础上进行改进,支持检测任意角度的文本。从结构上来说,TextBoxes++针对多角度文本进行检测,首先修改预选框的宽高比,调整宽高比aspect ratio为1、2、3、5、1/2、1/3、1/5。其次是将1∗51*51∗5的卷积核改为3∗53*53∗5,更好的学习倾斜文本的特征;最后,TextBoxes++的输出旋转框的表示信息。

EAST针对倾斜文本的定位问题,提出了two-stage的文本检测方法,包含 FCN特征提取和NMS部分。EAST提出了一种新的文本检测pipline结构,可以端对端训练并且支持检测任意朝向的文本,并且具有结构简单,性能高的特点。FCN支持输出倾斜的矩形框和水平框,可以自由选择输出格式。

  • 如果输出检测形状为RBox,则输出Box旋转角度以及AABB文本形状信息,AABB表示到文本框上下左右边的偏移。RBox可以旋转矩形的文本。
  • 如果输出检测框为四点框,则输出的最后一个维度为8个数字,表示从四边形的四个角顶点的位置偏移。该输出方式可以预测不规则四边形的文本。

MOST提出TFAM模块动态的调整粗粒度的检测结果的感受野,另外提出PA-NMS根据位置信息合并可靠的检测预测结果。此外,训练中还提出 Instance-wise IoU 损失函数,用于平衡训练,以处理不同尺度的文本实例。该方法可以和EAST方法结合,在检测极端长宽比和不同尺度的文本有更好的检测效果和性能。

(3)弯曲文本检测

简单思路是用多点坐标描述弯曲文本的边界多边形,然后直接预测多边形的顶点坐标。

CTD提出了直接预测弯曲文本14个顶点的边界多边形,网络中利用Bi-LSTM层以细化顶点的预测坐标,实现了基于回归方法的弯曲文本检测。

LOMO针对长文本和弯曲文本问题,提出迭代的优化文本定位特征获取更精细的文本定位,该方法包括三个部分,坐标回归模块DR,迭代优化模块IRM以及任意形状表达模块SEM。分别用于生成文本大致区域,迭代优化文本定位特征,预测文本区域、文本中心线以及文本边界。迭代的优化文本特征可以更好的解决长文本定位问题以及获得更精确的文本区域定位。

Contournet基于提出对文本轮廓点建模获取弯曲文本检测框,该方法首先使用Adaptive-RPN获取文本区域的proposal特征,然后设计了局部正交纹理感知LOTM模块学习水平与竖直方向的纹理特征,并用轮廓点表示,最后,通过同时考虑两个正交方向上的特征响应,利用Point Re-Scoring算法可以有效地滤除强单向或弱正交激活的预测,最终文本轮廓可以用一组高质量的轮廓点表示出来。

PCR提出渐进式的坐标回归处理弯曲文本检测问题,总体分为三个阶段,首先大致检测到文本区域,获得文本框,另外通过所设计的Contour Localization Mechanism预测文本最小包围框的角点坐标,然后通过叠加多个CLM模块和RCLM模块预测得到弯曲文本。该方法利用文本轮廓信息聚合得到丰富的文本轮廓特征表示,不仅能抑制冗余的噪声点对坐标回归的影响,还能更精确的定位文本区域。

3.2 基于分割的文本检测

基于回归的方法虽然在文本检测上取得了很好的效果,但是对解决弯曲文本还存在问题,且模型复杂。因此,提供了基于分割的文本检测方法,先从像素层面做分类,判别每一个像素点是否属于一个文本目标,得到文本区域的概率图,通过后处理方式(opencv,polygon等后处理)得到文本分割区域的包围曲线。

Pixellink采用分割的方法解决文本检测问题,分割对象为文本区域,将同属于一个文本行(单词)中的像素链接在一起来分割文本,直接从分割结果中提取文本边界框,无需位置回归就能达到基于回归的文本检测的效果。但是基于分割的方法存在一个问题,对于位置相近的文本,文本分割区域容易出现“粘连“问题。Wu, Yue等人[8]提出分割文本的同时,学习文本的边界位置,用于更好的区分文本区域。另外Tian等人[9]提出将同一文本的像素映射到映射空间,在映射空间中令统一文本的映射向量距离相近,不同文本的映射向量距离变远。

MSR针对文本检测的多尺度问题,提出提取相同图像的多个scale的特征,然后将这些特征融合并上采样到原图尺寸,网络最后预测文本中心区域、文本中心区域每个点到最近的边界点的x坐标偏移和y坐标偏移,最终可以得到文本区域的轮廓坐标集合。

针对基于分割的文本算法难以区分相邻文本的问题,PSENet提出渐进式的尺度扩张网络学习文本分割区域,预测不同收缩比例的文本区域,并逐个扩大检测到的文本区域,该方法本质上是边界学习方法的变体,可以有效解决任意形状相邻文本的检测问题。

假设用了PSENet后处理用了3个不同尺度的kernel,如上图s1,s2,s3所示。首先,从最小kernel s1开始,计算文本分割区域的连通域,得到(b),然后,对连通域沿着上下左右做尺度扩张,对于扩张区域属于s2但不属于s1的像素,进行归类,遇到冲突点时,采用“先到先得”原则,重复尺度扩张的操作,最终可以得到不同文本行的独立的分割区域。

Seglink++针对弯曲文本和密集文本问题,提出了一种文本块单元之间的吸引关系和排斥关系的表征,然后设计了一种最小生成树算法进行单元组合得到最终的文本检测框,并提出instance-aware 损失函数使Seglink++方法可以端对端训练。

PAN针对文本检测预测速度慢的问题,从网络设计和后处理方面进行改进,提升算法性能。首先,PAN使用了轻量级的ResNet18作为Backbone,另外设计了轻量级的特征增强模块FPEM和特征融合模块FFM增强Backbone提取的特征。在后处理方面,采用像素聚类方法,沿着预测的文本中心(kernel)四周合并与kernel的距离小于阈值d的像素。PAN保证高精度的同时具有更快的预测速度。

FCENet提出将文本包围曲线用傅立叶变换的参数表示,由于傅里叶系数表示在理论上可以拟合任意的封闭曲线,通过设计合适的模型预测基于傅里叶变换的任意形状文本包围框表示,从而实现了自然场景文本检测中对于高度弯曲文本实例的检测精度的提升。

DBNet提出可微分阈值(Differenttiable Binarization module)采用动态的阈值区分文本区域和背景。通过网络去预测图片每个位置处的阈值,而不是采用一个固定的值,更好的分离文本背景与前景。

 在传统的图像分割算法中,获取概率图后,会使用标准二值化(Standard Binarize)处理,但是二值化的方法是不可微的(可微的定义:左右极限存在,且相等),无法进行end to end 训练,公式为

 可微二值化将标准二值化中的阶跃函数进行了近似,公式为

 其中,P是上下文获得的概率图(Probability Map),T是上下文获得的阈值图(Threshold Map),k是增益因子,然后得到近似二值图(Approximate Binary Map),当损失函数为交叉熵损失函数时,正负样本的loss是

 对x求偏导:

 DB模型主要分为三个部分:

  • Backbone网络,负责提取图像的特征

DB文本检测网络的Backbone部分采用的是图像分类网络,可以是ResNet,MobileNetV3等模型,,DB的Backbone用于提取图像的多尺度特征,如下代码所示,假设输入的形状为[640, 640],backbone网络的输出有四个特征,其形状分别是 [1, 16, 160, 160],[1, 24, 80, 80], [1, 56, 40, 40],[1, 480, 20, 20],使用方法:

from ppocr.modeling.backbones.det_mobilenet_v3 import MobileNetV3model_backbone = MobileNetV3()
model_backbone.eval()#打印网络结构
print(model_backbone)
  • FPN网络,特征金字塔结构增强特征,FPN网络的输入为Backbone部分的输出,输出特征图的高度和宽度为原图的四分之一。

图像处理的两种方式:上采样(upsample)和下采样(downsample),上采样是增大图像,下采样是缩小图案。这里的upsample是获取将较小特征上采样和大特征进行累加。

  • Head网络,计算文本区域概率图,文本区域阈值图以及文本区域二值图。

import math
import paddle
from paddle import nn
import paddle.nn.functional as F
from paddle import ParamAttrclass DBHead(nn.Layer):"""Differentiable Binarization (DB) for text detection:see https://arxiv.org/abs/1911.08947args:params(dict): super parameters for build DB network"""def __init__(self, in_channels, k=50, **kwargs):super(DBHead, self).__init__()self.k = k# DBHead详细实现参考 https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.4/ppocr/modeling/heads/det_db_head.pydef step_function(self, x, y):# 可微二值化实现,通过概率图和阈值图计算文本分割二值图return paddle.reciprocal(1 + paddle.exp(-self.k * (x - y)))def forward(self, x, targets=None):shrink_maps = self.binarize(x)if not self.training:return {'maps': shrink_maps}threshold_maps = self.thresh(x)binary_maps = self.step_function(shrink_maps, threshold_maps)y = paddle.concat([shrink_maps, threshold_maps, binary_maps], axis=1)return {'maps': y}

其他模块:

  • DB模型后处理

DB后处理函数根据概率图中文本区域的响应计算出包围文本响应区域的文本框坐标。由于网络预测的概率图是经过收缩后的结果,所以在后处理步骤中,使用相同的偏移值将预测的多边形区域进行扩张,即可得到最终的文本框。

DB的输出结果是文本区域的二值图,属于文本区域的响应更高,非文本的背景区域响应值低。DB的后处理即是求这些响应区域的最小包围框,进而得到每个文本区域的坐标。 另外,通过修改后处理参数可以调整文本框的大小,或者过滤检测效果差的文本框。

DB后处理有四个参数,分别是:

  • thresh: DBPostProcess中分割图进行二值化的阈值,默认值为0.3
  • box_thresh: DBPostProcess中对输出框进行过滤的阈值,低于此阈值的框不会输出
  • unclip_ratio: DBPostProcess中对文本框进行放大的比例
  • max_candidates: DBPostProcess中输出的最大文本框数量,默认1000
  • 损失函数定义

模型输出是3个预测图,则总得损失函数是

 其中,L是总损失函数,Lb是文本二值图的损失函数,Ls是概率图损失,Lt是阈值图损失,是权重系数。

 Lb是Dice Loss,比较文本二值图和标签之间的相似度,常用于二值图分割。

 Ls是Dice Loss(OHEM),采用带OHEM的Dice Loss,目的是为了改善正负样本不均衡的问题。OHEM为一种特殊的自动采样方式,可以自动的选择难样本进行loss的计算,从而提升模型的训练效果。这里将正负样本的采样比率设为1:3。

Lt是Mask L1 Loss,计算预测的文本阈值图和标签间的L1距离。

  • 评估指标

文本检测的计算指标有三个,分别是Precision,Recall和Hmean,三个指标的计算逻辑为:

  • 创建[n, m]大小的一个矩阵叫做iouMat,其中n为GT(ground truth)box的个数,m为检测到的框数量;其中n,m为除去了文本标定为###的框数量;
  • 在iouMat中,统计IOU大于阈值0.5的个数,将这个值除以gt个数n得到Recall;
  • 在iouMat中,统计IOU大于阈值0.5的个数,将这个值除以检测框m的个数得到Precision;
  • Hmean的指标计算方式同F1-score的计算方式,公式如下:

4.存在问题

(1)文字漏检

 原因,GT和预测框的重叠部分小,则可以增加IOU阈值,缩小GT和预测框的差距。另外,漏检测的本质原因在于,一部分文字的特征没有响应,归根结底是网络没有学习到漏检测部分文字的特征。建议具体问题具体分析,可视化预测结果分析漏检测的原因,是否是因为光照,形变,文字较长等因素导致的,然后针对性的使用数据增强、调整网络、或者调整后处理等方法优化检测结果。

参考:

飞桨AI Studio - 人工智能学习与实训社区集开放数据、开源算法、免费算力三位一体,为开发者提供高效学习和开发环境、高价值高奖金竞赛项目,支撑高校老师轻松实现AI教学,并助力开发者学习交流,加速落地AI业务场景https://aistudio.baidu.com/aistudio/projectdetail/3335972

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于ORACLE 语句中,IN 超过1000个的解决方法

在ORACLE SELECT 语句中 IN 的数据如果超过 1000,就会出错,解决方法也很简单,以C#代码为例: 1、先写一个方法,接收2个参数 参数1:接收 IN里面的数据,如:a1,a2,...a2000 ;…

9个提高代码运行效率的小技巧你知道几个?

我们写程序的目的就是使它在任何情况下都可以稳定工作。一个运行的很快但是结果错误的程序并没有任何用处。在程序开发和优化的过程中,我们必须考虑代码使用的方式,以及影响它的关键因素。通常,我们必须在程序的简洁性与它的运行速度之间做出…

STM32——按键

STM32——按键 宗旨:技术的学习是有限的,分享的精神是无限的。 一、GPIO工作模式 1、当I/O端口配置为输入时: 输出缓冲器被禁止 施密特触发输入被激活 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接 …

深度学习——模型的压缩和加速

1. 简介 随着深度学习发展,越来越多的模型被发现和应用,模型的体量也越来越大,出现了模型过于庞大和参数冗余的问题。同时,移动端对模型的需求也是越轻量越好,因此,模型压缩和加速技术应运而生。 模型压缩…

干货,记一次解决录音杂音问题

最近在项目上遇到一个问题,也不能说是最近项目上的问题了,是之前一直存在的问题,但是对项目没什么影响,所以我就不怎么理会,直到最近,同事说这个杂音已经影响到了项目的开发,所以今天花了一天时…

3.5.2 冒泡排序类

那么,我们就以冒泡排序为例,把它改造成一个类。首先,单击菜单,“项目”-“添加类”,添加一个BubbleSort.cs类文件。IDE自动为我们创建如下代码: usingSystem;usingSystem.Collections.Generic;u…

STM32——串口通信

STM32——串口通信 宗旨:技术的学习是有限的,分享的精神是无限的。 一、异步串口通信协议 STM32 的串口非常强大,它不仅支持最基本的通用串口同步、异步通信,还具有 LIN 总线功能(局域互联网)、IRDA 功能&…

操作系统——死锁(银行家算法)

1、概述 1.1 死锁 死锁是多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。 1.2 死锁产生的原因和条件 原因:(1)竞争资源;(2&…

操作系统——内存管理

1、内存基本概念 1.1 主要功能 内存空间的分配与回收;地址转换内存保护:使用上下限寄存器或者重定位寄存器和界地址寄存器内存扩充:交换和覆盖内容共享 2、内存的分配与回收 2.1 连续分配方式 连续分配方式是指为一个用户程序分配一个连续…

解决一个驱动代码解耦合问题

之前解决的项目LCD设备兼容问题,在 a.c 文件里面定义了一个变量,然后在 b.c 里面使用 extern声明引用这个变量,通过这种方法可以在b.c中使用在a.c 里面初始化的变量。但是这中情况就会引起一个问题,就是驱动代码之间耦合了&#x…

STM32——DMA

STM32——DMA 宗旨:技术的学习是有限的,分享的精神是无限的。 DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来,它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断,大大提高效率。 1、DMA工作分析 数据传…

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

搭建Servlet在线视频

这个视频flash上传及在线播放,搞了我一天了,总算有点成果,但还有一些疑问没有解决,现在发这篇随笔,为的就是交流视频在线上传和观看的一些问题。 在线编辑器使用FCKEditor,首先是修改FCKEditor的配置文件&a…

操作系统——内存管理例题

1、关于分配策略例题 case1:某系统的空闲分区见下表,如有下列作业:96KB,20KB,200KB,分别采用首次适应算法和最佳适应算法来处理这些作业序列,哪种算法能满足该作业序列请求? 分区号…

STM32中C语言知识点:初学者必看,老鸟复习(长文总结)

说在前面的话一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,再去学单片机,我以前刚学单片机的时候也有这样子的想法。其实C语言是可以边学单片机边学的,学单片机的一些例程中&…

STM32——ADC

STM32——ADC 宗旨:技术的学习是有限的,分享的精神是无限的。 一、ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 ;ADC的结果可以左对齐或右对齐方式存储在 16…

时间复杂度和空间复杂度,一看就懂,面试前必过一遍

一、定义时间和空间是程序的一个硬性指标,一个用来衡量 代码执行的速度 ,一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度:就是执行程序的快慢,速度越快,时间复杂度就越好。空间复杂度:就是执…

数据结构——排序【仅用于考试】

1、简介 排序&#xff0c;是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程 稳定性&#xff1a;选取两个元素Ri<Rj&#xff0c;经过排序算法之后&#xff0c;仍为Ri<Rj 不稳定的排序&#xff1a;【简单选择排序&#xff0c;快速排序&#xff0c;堆…

[UWP]做个调皮的BusyIndicator

1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生&#xff0c;Extended WPF Toolkit 提供了BusyIndicator的开源实现&#xff0c;Silverlight Toolkit也有一个&#xff0c;这次想要把这个控件移植到UWP中。 2. 先说点正经的 2.1 BusyIndica…