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

【计算机视觉】文本识别

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

简介

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

文本检测

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

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()

相关文章:

  • 【Java】实现后端请求接口
  • 组合的输出(信息学奥赛一本通-1317)
  • 关于防火墙运维面试题2
  • DirectShow基类文件和帮助文档
  • 【无标题】基于AIX的DB2 10.1安装配置规范
  • Qt的QTreeWidget样式设置
  • Linux进阶——防火墙
  • 【鸿蒙开发】第三十章 应用稳定性-检测、分析、优化、运维汇总
  • 数据结构——二叉树(2025.2.12)
  • 用大模型学大模型04-模型与网络
  • 负载测试和压力测试的原理分别是什么
  • 代码实践——准备阶段
  • Linux 系统上以 root 用户身份运行 ./mysql.server start 命令,但仍然收到 “Permission denied” 错误
  • Spring Cloud微服务
  • 【CS61A 2024秋】Python入门课,全过程记录P7(Week13 Macros至完结)【完结撒花!】
  • 新一代高性能无线传输模块M-GATEWAY3
  • 玩转观察者模式
  • 【Linux】进程间关系与守护进程
  • MySQL 记录
  • c# textbox 设置不获取光标
  • 张国清将赴俄罗斯举行中俄“长江—伏尔加河”地方合作理事会第五次会议和“东北—远东”政府间合作委员会双方主席会晤
  • 铁路端午假期运输火车票今日开售,12306提升应对超大规模并发访问需求能力
  • 蒋圣龙突遭伤病出战世预赛存疑,国足生死战后防线严重减员
  • 辽宁盘山县一乡镇幼儿园四名老师被指多次殴打一女童,均被行拘
  • 科普|男性这个器官晚到岗,可能影响生育能力
  • 中日东三省问题的源起——《1905年东三省事宜谈判笔记》解题