当前位置: 首页 > news >正文

【读点论文】面向识别的长弯曲文本预处理算法,有点局限

面向识别的长弯曲文本预处理算法

摘要

  • 光学字符识别( Optical Character Recognition,OCR)是对文本图片进行扫描,然后对图像进行分析处理,获取到其中的文字内容的过程。但是目前的 OCR算法对于弯曲的长文本普遍识别效果不佳,为此,提出了一种面向识别的长弯曲文本预处理算法,即在文本行识别之前添加长弯曲文本处理模块(Long Curve Text Processing,LCTP),以提升图像中所有文本行识别的准确率。首先,在进行文本区域检测后,获取单条长弯曲文本行并清除干扰信息;其次,根据单条长弯曲文本行的特征计算每条弯曲文本行的关键拐点;进而,使用关键拐点对单条文本行进行切分和融合;最后,将经过切分与融合后的文本行输入文本行识别模型中得到最终识别结果。通过手动采集长弯曲文本图像形成的数据集 Long Curnve Text 与目前主流 OCR 框架 PP-OCR 和 Tesseract OCR 进行对比实验可知,LA、MED、NED指标均有提升,相比于PP-OCR,LA提升49.5%,MED和 NED分别降低了 44 115 和 0.182:相比于 Teseract OCR,LA提升 3.2%,MED和NED分别降低了30 282和0.125。同时,也在LongCurve Text 数据集中进行了消融实验以验证本文提出LCTP 的有效性以及进行了LCTP 各个结构的时间对比实验以验证本文提出LCTP 的高效性。结果表明LCTP 可以提高长弯曲文本识别准确率,总体上可以地获得更加准确,有效的识别结果。
  • 该算法主要针对长弯曲文本的预处理,旨在提升OCR识别准确率。整体流程包括:文本区域检测:使用现有的文本检测算法(如DBNet)获取文本区域。单独文本行获取:通过最小外接矩形方法获取单独文本行,并清除干扰信息。关键拐点获取:计算每条弯曲文本行的关键拐点。文本行切分和融合:使用关键拐点对文本行进行切分和融合,矫正弯曲。文本行识别:将处理后的文本行输入识别模型。该算法主要针对单个关键拐点的弯曲文本进行处理。对于S形状、波浪形状等异形长弯曲文本,可能需要进行扩展和调整。可以递归切分:在检测到拐点后,递归处理子区域。动态拐点检测:使用曲率分析(如角度变化率)检测多个拐点。弹性网格矫正:通过薄板样条变换(Thin Plate Spline)实现非线性矫正。

引言

  • 近年来,光学字符识别(OCR)取得了巨大的发展,但也面临一些问题。对于书籍扫描场景,由于书籍无法完整展平,因此会出现大量长的弯曲文本,而在长的弯曲文本中干扰信息和文本的弯曲均会影响对该文本识别的准确性,因此,在保证非弯曲文本识别精度不受影响的前提下,提升长的弯曲文本的准确性成为了一项重大挑战。处理长的弯曲文本是一种旨在从文本图像中获取更准确、更全面文本信息的 OCR 算法增强技术,在医疗、教育等领域具有广泛应用

  • 目前主流的文本检测和识别算法包括PP-OCR 和Tesseract OCR 等。PP-0CR 是百度开源的-套面向产业应用的 OCR系统,通过在基础检测和识别模型的基础上推出一系列优化策略,实现了在通用领域的产业级 SOTA 模型,同时支持多种预测部署方案,帮助企业快速应用 OCR 技术。其中,文本检测算法采用了 DBNet ,文本识别算法采用了 CRNN 。PP-0CR已经发布了3个版本,最新的PP-0CRv3 在与 PP-0CRv2 相当速度下,在中文场景下的效果相比PP-0CRv2 提升了5%,在英文场景下提升了11%并且多语言模型平均识别准确率提升了5%以上Tesseract 0CR 是由惠普实验室开发,目前由谷歌维护的一款开源 OCR库。能够识别图片中的文字,并将其转化为可编辑的文本。Tesseract 0CR 可以通过 API接口来使用,无需在本地安装 OCR 软件。该库提供了多种 0CR功能,包括文字检测和文字识别等。其中,文字检测功能可以检测出图片中的文字位置和边界框,而文字识别功能可将图片中的文字识别出来,并以文本的形式返回

  • 现如今,对于处理弯曲文本问题,主要采用基于回归的方法和基于分割的方法。最初采用的是基于回归的方法,其中多数方法使用多点坐标表示弯曲文本的边界多边形,并直接预测这些顶点的坐标。例如,CTD 、ContourNet 、LOMO 、TextBoxes 、TextBoxes++、PCR 等方法。CTD 提出了一种通过将弯曲文本的边界框定义为具有 14 个顶点的多边形,并预测这 14 个顶点坐标的方法。

  • 以此为基础,还使用 Bi-ISTM 来细化预测的 14 个顶点坐标,从而实现基于回归的弯曲文本检测。ContouNet 通过对文本轮廓点进行建模来获取弯曲文本的检测框。由Adaptive-RPN 模块、LOTM 模块和 Point Rescoring Algorithm 模块组成,用于提取候选框特征、学习水平和竖直方向的文字特征,并使用轮廓点表示文本区域,同时滤除预测中的强单向或弱正交激活,最终以一组高精度的坐标点表示文本轮廓。

  • LOMO 则通过3个部分解决弯曲文本问题,包括直接回归器( DR)、迭代优化模块(IRM)和形状表示模块(SEM)。首先,LOMO 使用DR 分支获取文字的大致区域,然后 IRM 利用 DR 得到的区域通过迭代优化使得边界框更接近真实框(GT)。最后,SEM 模块学习文本实例中的几何属性包括文本区域、文本中心线和边界偏移量,以获取弯曲文本的检测结果。

  • TextBoxes 是根据目标检测方法SSD 进行修改的,将默认的文本框更改为适应文本方向和宽高比的矩形框,从而更适应长文本检测。TextBoxes++在 TextBoxes 的基础上进行了改进,可以检测多角度的文本,但这2种方法在弯曲文本的检测效果上并不理想。尽管基于回归的方法在弯曲文本检测方面取得了一定成效,但方法获得的文本包围曲线通常不够平滑,而且这些模型多数比较复杂,在速度等方面也并不占据优势

  • 近年来,基于图像分割的方法在文本检测中得到广泛应用。这种方法借鉴了全卷积神经网络的思想,通过对图像中的每个元素进行分类和判断,将文本图像分割为文字区域和非文字区域,并生成文本图像的概率图。通过前后处理的方法,可以得到文本分割区域的矩形框。一些代表性的方法包括 FCENet、DBNet、DBNet++和 RBox等 。FCENet 通过预测基于傅里叶变换的任意形状的文本包围框,提高了对高度弯曲文本实例的检测精度。然而,对于非弯曲文本的检测,DBNet 表现更加优秀。DBNet 基于分割思想,通常需要使用自定义阈值将获取到的分割概率图转换为二值图像。因此,值的确定变得非常重要。DBNet引人了可微分二值化概念,即对每个像素点进行自适应二值化,二值化阈值由网络学习得到。这种方法完全将二值化步骤与网络一起训练,使得最终输出图像对值非常鲁棒。DBNet++在 DBNet 的基础上增加了一个 ASF 模块,用于处理不同尺度的特征,从而获得更好的特征融合效果。RBox 提出了一种基于 Transformer 的场景文本检测网络,可以在较低语义信息中获取有效的信息,并且无需复杂的后处理步骤,从而提高了检测性能。

  • 上述模型算法都是对检测模型进行优化,以实现更准确的文本行检测和定位。当下,主流的文本检测算法通常基于最小外接矩形或者多边形获取文本行。然而,对于较密集的长弯曲文本来说,仅仅通过文本行的检测和定位,在获取长弯曲文本行的最小外接矩形时会带人其他干扰信息。目前,主流0CR对于长弯曲文本的检测与识别结果如图1所示。图1左侧黑色框内的文本行代表识别正确的文本行,白色框内的文本行代表识别错误的文本行;图1右侧文字为识别文本行的内容和置信度。可以观察到白色框内的文本行识别效果差,置信度较低。此外,通过多边形获取长弯曲文本行时文本行本身的弯曲性质也会导致对其进行识别时效果不佳。

    • 在这里插入图片描述

    • 图 1 目前主流 OCR 对于长弯曲文本的检测与识别结果

  • 本文针对长弯曲文本检测与识别面临的挑战,参考了当前主流的 OCR 框架,并提出了一种面向识别的长弯曲文本预处理算法,即文本行识别之前添加长弯曲文本处理模块(Long Curve Text Processing,LCTP)。本文在 Long Curve Text 数据集上进行了实验,以验证所提算法的有效性和可行性。LCTP通过单独文本行获取和弯曲矫正模块两个方面对现有文本检测与识别算法进行优化。其中,单独文本行获取包含获取单独文本行方法以及清除单独文本行的干扰信息方法,弯曲矫正模块包含文本行关键拐点获取方法以及文本行切分和融合方法。整体流程如图2所示。图2中虚线框内为本文提出的算法模块,同时本文公开了针对于长条弯曲文本的数据 Long CurveText。(数据集地址为:https://drive.google.com/drive/folders/1riydkja4UOaqFdWejsa8VTDclYXsGSSp)

    • 在这里插入图片描述

    • 图 2 嵌入 LCTP 模块的文本行检测与识别流程

长弯曲文本预处理算法

单独文本行获取方法

  • 单独文本行获取方法是通过将文本区域检测获取的结果使用基于最小外接矩形的方法来获取单独文本行,并对单独文本行进行干扰信息的清除(Clear Up)。该方法旨在处理长弯曲文本时,去除干扰信息对于文本行识别的影响,为后续的处理和文字行识别提供更准确的文本行。清除干扰信息算法运用原始单独文本行和其四点坐标以及文本区域检测得到的分割图S,根据本文提出的清除干扰信息算法获得清除干扰信息后的单独文本行。算法步骤如下,算法 1 清除干扰信息算法

    • 输入 原始单独文本行A,A中4个顶点坐标P4,文本区域检测得到的分割图 S
    • 输出 清除干扰信息后的单独文本行 CA 以及经过处理后的掩膜图像 M2
    • Step 1 使用 P4 在 S 中截取,获得截取后的分割图 S,并保存S中每个文字区域的多个轮廓点。
    • Step2 对S1进行细化操作,拟合S1中多条曲线。
      • Step2.1 对S1中每条曲线,获取每条曲线上的多个点 P。
      • Step 2.2 对S1中的每条曲线,使用P进行曲线拟合。
    • Step3 确定最长弧长的曲线对应文字区域的多个轮廓点 P1。
    • Step 4 根据 P1 得到算法输出。
      • Step 4.1 创建与 A相同形状的全黑掩膜图像 M.
      • Step 4.2 在M中画出 P1,并将 P1内部填充为白色,得到 M1。
      • Step 4.3 对 M1 进行膨胀操作,得到 M2。
      • Step 4.4 将A与M2 进行位运算,得到算法输出。
  • 算法中间过程可视化如图3所示。经过单独文本行获取方法获取到的单独文本行清除了文本行周围的干扰信息,消除了干扰信息对文本行识别的影响。

    • 在这里插入图片描述

    • 图 3 单独文本行获取方法中的可视化结果

  • 清除干扰信息:使用文本区域检测得到的分割图S,截取单独文本行区域。对分割图进行细化操作,拟合曲线。确定最长弧长的曲线对应的文字区域的多个轮廓点P1。创建掩膜图像M,填充轮廓点P1内部为白色,进行膨胀操作得到M2。将原始文本行与M2进行位运算,得到清除干扰信息后的文本行CA。

    • import cv2
      import numpy as np
      def clear_up_noise(original_text_line, vertices, segmentation_map):
          # Step 1: 使用顶点在分割图中截取
          x_min, y_min, x_max, y_max = np.min(vertices[:, 0]), np.min(vertices[:, 1]), np.max(vertices[:, 0]), np.max(vertices[:, 1])
          cropped_segmentation = segmentation_map[y_min:y_max, x_min:x_max]
          # Step 2: 细化操作和曲线拟合
          # 这里使用OpenCV的形态学操作进行细化
          kernel = np.ones((3, 3), np.uint8)
          cropped_segmentation = cv2.erode(cropped_segmentation, kernel, iterations=1)
          # Step 3: 确定最长弧长的曲线
          contours, _ = cv2.findContours(cropped_segmentation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
          max_contour = max(contours, key=lambda x: cv2.arcLength(x, True))
          # Step 4: 创建掩膜并填充
          mask = np.zeros_like(original_text_line)
          cv2.drawContours(mask, [max_contour], -1, (255, 255, 255), -1)
          mask = cv2.dilate(mask, kernel, iterations=1)
          # Step 5: 位运算清除干扰信息
          cleared_text_line = cv2.bitwise_and(original_text_line, mask)
          return cleared_text_line
      # 示例调用
      original_text_line = cv2.imread('original_text_line.png')
      vertices = np.array([[x1, y1], [x2, y2], [x3, y3], [x4, y4]])  # 文本行的四个顶点坐标
      segmentation_map = cv2.imread('segmentation_map.png', 0)  # 分割图
      cleared_text_line = clear_up_noise(original_text_line, vertices, segmentation_map)
      cv2.imwrite('cleared_text_line.png', cleared_text_line)
      

文本行关键拐点获取方法

  • 文本行关键拐点获取是将经过单独文本行获取方法处理后得到的消除干扰信息的单独文字行使用获取关键拐点核心算法获取该文字行的关键拐点,即为拐点。该方法旨在处理长弯曲文本时,提高文字区域的定位精度,为后续的处理和文字行识别提供更准确的文本行,

  • 获取关键拐点核心算法借用最小二乘法的思想并运用在清除干扰信息算法中获取到的每个单独文本行的分割图来获取关键拐点算法。算法步骤如下。算法 2 ,获取关键拐点算法

    • 输入 清除干扰信息后的单独文本行 CA 以及经过处理后的掩膜图像 M2
    • 输出 关键拐点 K
    • Step1 对M2进行细化操作,得到S2并获取细化后曲线上的多个点 P。
    • Step2 对P进行去重和排序操作,并记录曲线上最左端点 P1 和最右端点 P2。
    • Step 3 根据 P,P1,P2 获取算法输出。
      • Step 3.1 每次以曲线上除了 P1.P2 之外的 P中某点为端点 P0 构造 P1P0 和 POP2 两条直线。
      • Step 3.2 计算曲线上 P0 和 P1 之间的点到直线 P1P0 的距离以及曲线上 P0 和 P2 之间的点到直线 POP2 的距离的总和。
      • Step 3.3 将总和最小时的 PO 作为 K,若总和小于 P1 到 P2 距离的四分之一,则将 P1 作为 K。
  • 经过大量测试表明,总和阈值取 P1 到 P2 距离的四分之一时,单独文本行本身弯曲程度较小,无需进行文本行切分和融合。算法中间过程可视化如图 4 所示。经过关键点获取方法,单独文本行获取到关键点,为消除文本本身弯曲提供切分文本行时的位置信息

    • 在这里插入图片描述

    • 图 4 关键拐点获取方法中的可视化结果

  • 文本行关键拐点获取方法:细化操作:对掩膜图像M2进行细化操作,获取细化后的曲线S2。获取曲线上的点:从S2中获取多个点P。去重和排序:对P进行去重和排序,记录最左端点P1和最右端点P2。计算关键拐点:对于每个点P0(除了P1和P2),构造两条直线P1P0和P0P2。计算曲线上P0和P1之间的点到直线P1P0的距离,以及P0和P2之间的点到直线P0P2的距离的总和。当总和最小时,P0作为关键拐点K。若总和小于P1到P2距离的四分之一,则将P1作为K。

    • def get_key_inflection_points(cleared_text_line, mask):
          # Step 1: 细化操作
          skeleton = cv2.ximgproc.thinning(mask)
          # Step 2: 获取曲线上的点
          points = np.argwhere(skeleton > 0)
          # Step 3: 去重和排序
          unique_points = np.unique(points, axis=0)
          sorted_points = unique_points[np.argsort(unique_points[:, 1])]  # 按x坐标排序
          p1 = sorted_points[0]  # 最左端点
          p2 = sorted_points[-1]  # 最右端点
          # Step 4: 计算关键拐点
          min_sum = float('inf')
          key_point = None
          for p0 in sorted_points[1:-1]:  # 跳过p1和p2
              # 计算直线P1P0和P0P2
              line_p1p0 = np.cross(p1, p0)
              line_p0p2 = np.cross(p0, p2)
              # 计算距离总和
              sum_distance = 0
              for point in sorted_points:
                  if np.all(point == p1) or np.all(point == p2):
                      continue
                  if np.all(point <= p0):
                      distance = np.abs(np.dot(line_p1p0, point)) / np.linalg.norm(line_p1p0)
                      sum_distance += distance
                  else:
                      distance = np.abs(np.dot(line_p0p2, point)) / np.linalg.norm(line_p0p2)
                      sum_distance += distance
              # 更新最小总和和关键点
              if sum_distance < min_sum:
                  min_sum = sum_distance
                  key_point = p0
          # 如果最小总和小于P1到P2距离的四分之一,则将P1作为关键点
          p1_p2_distance = np.linalg.norm(p2 - p1)
          if min_sum < p1_p2_distance / 4:
              key_point = p1
          return key_point
      # 示例调用
      cleared_text_line = cv2.imread('cleared_text_line.png')
      mask = cv2.imread('mask.png', 0)
      key_point = get_key_inflection_points(cleared_text_line, mask)
      print("关键拐点坐标:", key_point)
      

文本行切分和融合方法

  • 文本行切分和融合方法是通过关键拐点使用文本行切分和融合核心算法实现长弯曲文本的弯曲矫正,最终获取经过 LCTP 处理后的单独文本行。该方法旨在处理长弯曲文本时,去除文本行本身在弯曲上对文本行识别的影响,为文字行识别提供更准确的文本行。文本行切分和融合核心算法利用关键拐点在去除干扰信息后的文本行上进行切分,矫正和融合。算法 3 文本行切分和融合核心算法

    • 输入 关键拐点K以及清除干扰信息后的单独文本行 CA
    • 输出经过 LCTP 处理后的单独文本行
    • Step 1 对CA使用 K 进行文本行切分
      • Step 1.1 判断K是否为 CA 左端点。
      • Step 1.2 若是,则将该单独文本行输入文本行识别:若不是,则利用K对 CA 进行切分,此时.CA被切分为左右两个文本行 CA1 和 CA2。
    • Step 2 对 CA1和 CA2 分别进行透视变换操作。
    • Step 3 对 CA1 和 CA2 进行左右融合操作,得到算法输出。
  • 算法中间过程可视化具体结果如图5所示。经过文本行切分和融合方法,单独文本行清除了由于文本行本身存在弯曲对文本行识别时的影响。

    • 在这里插入图片描述

    • 图 5 文本行切分和融合方法中的可视化结果

  • 使用关键拐点对文本行进行切分和融合,矫正弯曲,得到清晰的长直文本行。文本行切分:判断关键拐点K是否为文本行左端点。若不是,则利用K将文本行切分为左右两个部分CA1和CA2。透视变换:对CA1和CA2分别进行透视变换,矫正弯曲。融合操作:将矫正后的CA1和CA2进行左右融合,得到最终处理后的文本行。

    • def split_and_fusion(cleared_text_line, key_point):
          height, width = cleared_text_line.shape[:2]
          # Step 1: 文本行切分
          if key_point[1] == 0:  # 判断是否为左端点
              ca1 = cleared_text_line
              ca2 = None
          else:
              # 切分为左右两部分
              left_part = cleared_text_line[:, :key_point[1]]
              right_part = cleared_text_line[:, key_point[1]:]
              # Step 2: 透视变换
              # 定义透视变换的四个点
              src_pts = np.float32([[0, 0], [key_point[1], 0], [0, height], [key_point[1], height]])
              dst_pts = np.float32([[0, 0], [width, 0], [0, height], [width, height]])
              # 计算透视变换矩阵
              M = cv2.getPerspectiveTransform(src_pts, dst_pts)
              # 应用透视变换
              ca1 = cv2.warpPerspective(left_part, M, (width, height))
              ca2 = cv2.warpPerspective(right_part, M, (width, height))
          # Step 3: 融合操作
          if ca2 is not None:
              # 将两部分融合
              fused_text_line = cv2.addWeighted(ca1, 0.5, ca2, 0.5, 0)
          else:
              fused_text_line = ca1
          return fused_text_line
      # 示例调用
      cleared_text_line = cv2.imread('cleared_text_line.png')
      key_point = (x, y)  # 关键拐点坐标
      fused_text_line = split_and_fusion(cleared_text_line, key_point)
      cv2.imwrite('fused_text_line.png', fused_text_line)
      

实验与结果分析

实验数据及评价指标

  • 为了验证本文提出算法的可行性,使用手动采集的长条弯曲文本数据集 Long Curve Text 进行对比实验,该数据集包括英文书籍图片和中文书籍图片,如图6所示。英文书籍图片包含 2684 条文本,共有 152 155 个字符,中文书籍图片包含 1 448 条文本,共有 42 984 个字符,中英文字符数为 195 139个字符,平均图片大小为 2 560x1 920 像素,每张图片均包含有需要弯曲处理的文本行和无需弯曲处理的文本行。该数据集中包含3个文件夹:Original images 文件夹中存放的是收集的原图;Preprocessing images 文件夹中存放的是经过图像预处理后的图片;GT 文件夹中存放的是每张图片中需要弯曲处理的文本行的真实标签。

    • 在这里插入图片描述

    • 图 6 长弯曲文本数据集中文和英文样例

  • 为了验证本文提出算法的有效性,在长弯曲文本数据集 Long Curve Text 中分别挑选出 473 条,及 758条存在干扰信息以及本身存在弯曲的中文文本和英文文本来进行消融实验。在这些挑选出的中文文本和英文文本中,中文文本共有 18 142 个字符,英文文本共有 50 692 个字符。将这些数据分别进行如下处理:

    • (1)去除每条数据中的干扰信息而不消除其本身存在的弯曲,如图7(b)所示。

    • (2)对每条数据进行弯曲矫正处理,如图7©所示。

    • 在这里插入图片描述

    • 图 7 单条文本处理可视化结果

  • 文本采用的评价指标为准确率LA(LineAccuracy),计算公式为:

    • L A = C A LA=\frac CA LA=AC

    • 其中,C表示识别正确的行数,A表示所有的行数。LA 的计算方式为识别正确的行数占总识别出来所有的行数的比例,该指标是一个简单的度量方法,当文本行中存在一个字符错误,就将该行视为错误的文本行。字符编辑距离MED(Minimum Edit Distance计算公式为:

    • M E D a , b ( i , j ) = { max ⁡ ( i , j ) , i f min ⁡ ( i , j ) = 0 min ⁡ { M E D a , b ( i − 1 , j ) + 1 M E D a , b ( i , j − 1 ) + 1 M E D a , b ( i − 1 , j − 1 ) + 1 ( a i ≠ b j ) , o t h e r w i s e MED_{a,b}(i,j)= \begin{cases} \max(i,j), \mathrm{if}\min(i,j)=0 \\ \min \begin{cases} MED_{a,b}(i-1,j)+1 \\ MED_{a,b}(i,j-1)+1 \\ MED_{a,b}(i-1,j-1)+1_{(a_{i}\neq b_{j})} & \end{cases},\mathrm{otherwise} & \end{cases} MEDa,b(i,j)= max(i,j),ifmin(i,j)=0min MEDa,b(i1,j)+1MEDa,b(i,j1)+1MEDa,b(i1,j1)+1(ai=bj),otherwise

  • 其中,a,b表示2个字符串;i,j分别表示a中前 i 个字符和 b 中前 j 个字符; 1 a i ≠ b j 1_{a_i\neq b_j} 1ai=bj 表示一个指示函数,表示当 a i = b j a_i=b_j ai=bj,时、取1, 当 a i ≠ b j a_i\neq b_j ai=bj 时、取0。MED表示将一个字符串转换为另一个字符串所需的最小编辑操作数,操作包含插人、删除和替换,该指标用来度量2个字符串之间的相似度,值越小表示2个字符串之间的相似度越大。该指标可以看作为识别错误的字符数量。归一化字符编辑距离 NED(Normalized EditDistance),计算公式为:

    • N E D a , b = M E D a , b m a x ( a , b ) NED_{a,b}=\frac{MED_{a,b}}{max(a,b)} NEDa,b=max(a,b)MEDa,b

    • 其中, M E D a , b MED_{a,b} MEDa,b,表示字符串 a, b 的字符编辑距离,max(a,b)表示字符串a,b中最大长度。NED是在 MED基础上,将其除以2个字符串的最大长度,从而得到一个归一化的距离,这个距离范围是[0,1],值越小表示2个字符串越相似。NED 可以避免字符串的长度对距离的影响

实验设计

  • 本文运用目前2个不同主流 0CR 框架:PP-OCR 和 Tesseract 0CR,分别使用本文提出的 LCTP设置相同的参数并在同一环境下进行实验,依次来验证本文提出算法的有效性和可行性。为了排除图片本身的噪声和阴影问题,使用高斯自适应阈值算法来对图片进行预处理。

实验结果与分析

  • 在消融实验中,验证长弯曲文本干扰信息对文本识别影响的实验结果对比见 表1和表2。分析可知,清除文本干扰信息(Clear Up)与未做任何处理的单独文本行(No Processing)比较,前者在3个指标中均有不同程度的提升。另外分析可知,清除文本干扰信息(Clear Up)与消除长弯曲文本弯曲程度(DeCurve)比较,后者在3个指标中均有大幅度的提升,因此证明了文本的弯曲会影响该文本文本识别的效果。

    • 在这里插入图片描述

    • 表 1 清除干扰信息和弯曲矫正前后中文长弯曲文本结果对比

    • 在这里插入图片描述

    • 表 2 清除干扰信息和弯曲矫正前后英文弯曲文本结果对比

    • 注:NP表示未做处理:CU表示单独文本行获取方法:DC表示弯曲矫正模块;“!”表示值越小越优;“↑”表示值越大越优:黑体表示最优值。

  • 在本文提出的结构时间对比中,结果对比见表3。单独文本行获取占用时间为整体时间的11.6%,弯曲矫正模块占用时间为整体时间的2.7%,本文提出的 LCTP 占用时间为整体时间的14.3%。因此,证明本文提出的 LCTP 算法的高效性

    • 在这里插入图片描述

    • 表 3 在 Baseline 中添加结构后时间对比,注:CU 表示单独文本行获取方法:DC表示弯曲矫正模块:LCTP表示 CU + DC。

  • 在对比实验中,本文所提出的算法在不同 OCR 框架内的实验结果对比见表4。由表4分析可知在 Long Curve Text 数据集中,LA、MED 以及NED指标均有明显提升。其中,在 PP-0CRv3 中 LA 提升了49.5%,MED 下降 44115,NED 下降 0.18;由于Tesseract 0CR 中对于图片质量有较高的要求,本文中所使用的文本行多数带有一些噪点,因此在Tesseract OCR 中LA 仅提升了 3.2%,而 MED 下降30 282、NED 下降0.125。因此可以说明本文所提出的算法在不同的 OCR 框架下,均能提升文本识别的识别效果,证明了本文提出的 LCTP 的有效性。

    • 在这里插入图片描述

    • 表 4 长弯曲文本处理前后不同 OCR 框架结果对比

  • 中英文长弯曲文本经过 LCTP 前后可视化结果对比如图8所示。图8中,0riginal 表示未经过 LCTP处理的单独文本行,Result of Original 表示 Original 文本识别的结果,LCTP 表示经过本文提出算法处理后的单独文本行,Result with LCTP 表示经过本文提出算法处理后的单独文本行文本识别的结果,

    • 在这里插入图片描述

    • 图 8 LCTP 前后可视化结果

总结

  • 在特定场景下、例如书籍扫描时,长文本的弯曲性对于整个文本图像的识别准确率影响较大,因此提升长弯曲文本识别的准确率具有重要的意义。本文提出长弯曲文本处理模块(LCTP),分别从消除干扰信息和降低弯曲程度两个方面来降低对文本识别准确率的影响。将 LCTP 应用在不同的主流 OCR框架,在手动采集的 Long Curve Text 数据集的验证中,均取得了不错的识别效果。但由于图片存在的噪点等问题,导致在一些主流 OCR 框架中的行准确率 LA 提升较低,因此下一步工作尝试解决图片存在的噪点等问题,进一步提升目前主流 OCR框架的识别效果。

  • 使用Piecewise Affine变换矫正异形长弯曲文本条:

  • 关键点提取:从文本区域的轮廓中提取关键点,这些关键点将用于定义Piecewise Affine变换的控制点。

  • 分段处理:将文本区域分为多个段,每段使用一组控制点进行Piecewise Affine变换。

  • 透视变换:对每段进行透视变换,矫正弯曲。

  • 融合操作:将矫正后的段进行融合,得到最终的长直文本条。

相关文章:

  • Java 字符流全解析:核心类实战指南
  • SpringBoot 启动优化 问题
  • 什么是Java序列化?什么情况下需要使用序列化
  • 5. 实现一个中间件
  • S7-1200对V90 PN进行位置控制的三种方法
  • 新能源行业:卓越 UE/UI 设计,引领业务腾飞的新引擎
  • 23种设计模式-命令(Command)设计模式
  • 数据文件误删除,OceanBase中如何重建受影响的节点
  • Axure设计之中继器表格——拖动行排序教程(中继器)
  • 重庆软航NTKO WebOffice控件在谷歌Chrome 133版提示扩展已停用解决方案!
  • 26考研——图_图的应用(6)
  • 如何使用DeepSeek编写测试用例?
  • SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测
  • 搭建Redis哨兵集群
  • 安装DNS(BIND)并部署主域服务
  • 为什么要将项目部署到外部tomcat
  • 【第13届蓝桥杯C/C++B组省赛】顺子日期
  • Brainstorm绘制功能连接图(matlab)
  • Leetcode—242. 有效的字母异位词(字符串算法)
  • 国内 npm 镜像源推荐
  • 新加坡公布新内阁名单,黄循财继续担任总理及财政部长
  • 浙江台州女厅官林虹被决定逮捕,曾因直播带货广受关注
  • 外交部:中巴各领域合作非常密切,不针对第三方
  • 剧场回应脱口秀女演员表演中被猥亵:演出内容符合规定
  • 【社论】鸿蒙破壁,向最难处攻坚
  • 上影节官方海报公布:电影之城,每一帧都是生活