【计算机视觉】文本识别

发布于:2025-02-16 ⋅ 阅读:(31) ⋅ 点赞:(0)

计算机视觉,广义的文本识别是指对输入的图像进行分析处理,识别出图像中的文字信息,这里的图像可以使传统的文档图像,也可以是现实世界中的场景图像。在这里插入图片描述

简介

无论是传统方法还是基于深度深度学习的方法,完整的文本识别流程都由文本检测和文本识别两个阶段串联组成。文本检测是在图像/视频帧中寻找出文字区域,然后用边界框将单词或文本行标识出来;文本识别则是对此文字区域进行分析,然后获得文字信息。

文本检测

文本检测是计算机视觉与图像处理领域的重要任务之一,其目标是在自然场景图像中定位和标注文本区域。随着技术的进步,文本检测经历了从传统方法到深度学习驱动的现代方法的演变。以下是文本检测的发展历程及主流算法的简要概述:

1. 传统方法阶段(2000年代-2015年左右)

在深度学习兴起之前,文本检测主要依赖手工设计的特征与传统机器学习算法。
特点

  • 注重低级视觉特征,如颜色、边缘、纹理等。
  • 偏向于规则文本(如文档或票据)检测。
代表方法
  1. 基于边缘特征的方法
    • 使用图像梯度和边缘信息(如Sobel算子或Canny边缘检测)检测文本边界。
  2. 基于连接组件的方法
    • 例如极大稳定极值区域(MSER),通过寻找图像中的稳定区域来检测可能的字符块。
  3. 基于滑动窗口的方法
    • 滑动窗口逐像素扫描,通过分类器(如SVM)检测文本区域。
2. 深度学习引领阶段(2015年至今)

随着深度学习的爆发性发展,文本检测性能显著提升。深度卷积神经网络(CNN)的引入使得复杂背景中的文本检测成为可能。
特点

  • 自动学习特征,减少了手工设计特征的依赖。
  • 更适应自然场景中的多样化文本。
代表方法

基于目标检测的文本检测框架:

  • CTPN(2016)
    • 基于RNN和CNN联合的自然场景文本检测算法。
    • 能检测水平和部分倾斜的文本。
  • EAST(2017)
    • 提供高效且准确的文本检测,通过回归预测文本区域。
    • 能处理水平和任意方向的文本。
  • TextBoxes/TextBoxes++(2017)
    • 改进的SSD结构,适用于检测长条形文本区域。

基于分割的文本检测框架:

  • PSENet(2019)
    • 逐步扩展文本区域的方法,适用于检测不规则文本形状。
  • PAN(2020)
    • 基于邻域传播的方法,显著提升检测速度和对小文本区域的性能。
      基于Transformer的现代方法
  • 近年来,Transformer被引入文本检测任务,如DETR改进版本和自适应分割方法。

文本识别

文本识别包括单字符识别和文本行识别。
文本识别是将检测到的文本区域转化为可编辑文本的过程。基于深度学习的文本识别方法通常采用以下模型:

  • CRNN(Convolutional Recurrent Neural Network)
    结合CNN提取特征、RNN捕获序列信息,以及CTC(Connectionist Temporal Classification)解码。适合处理不规则文本。

  • Attention-based Encoder-Decoder
    使用注意力机制对文本序列进行逐步解码,适合复杂场景下的长文本识别。

  • Transformer-based Models
    利用Transformer架构(如Vision Transformer、Swin Transformer)提取图像序列特征,具有高精度和鲁棒性。

  • SAR(Show, Attend and Read)
    一种专注于场景文本识别的端到端模型,能够处理复杂的字体和背景。

实例-基于PPOCR-V3

import cv2
import os
import matplotlib.pyplot as plt
from paddleocr import PaddleOCR, draw_ocr

# PaddleOCR目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换
# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。
ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=False)  # need to run only once to download and load model into memory
save_results = []
img_path = 'images/003.jpg'
save_dir = 'ocr_result'
result = ocr.ocr(img_path, cls=True)[0]
# 将结果写入文件
with open(
        os.path.join(save_dir, "003_result.txt"),
        'w',
        encoding='utf-8') as f:
    for line in result:
        f.writelines(str(line)+'\n')
        print(line)

# 显示结果
from PIL import Image

image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./fonts/simfang.ttf')
cv2.imwrite(os.path.join(save_dir, "003_result.jpg"), im_show)
plt.figure(figsize=(15, 8))
plt.imshow(im_show)
plt.show()


网站公告

今日签到

点亮在社区的每一天
去签到