计算机视觉,广义的文本识别是指对输入的图像进行分析处理,识别出图像中的文字信息,这里的图像可以使传统的文档图像,也可以是现实世界中的场景图像。
简介
无论是传统方法还是基于深度深度学习的方法,完整的文本识别流程都由文本检测和文本识别两个阶段串联组成。文本检测是在图像/视频帧中寻找出文字区域,然后用边界框将单词或文本行标识出来;文本识别则是对此文字区域进行分析,然后获得文字信息。
文本检测
文本检测是计算机视觉与图像处理领域的重要任务之一,其目标是在自然场景图像中定位和标注文本区域。随着技术的进步,文本检测经历了从传统方法到深度学习驱动的现代方法的演变。以下是文本检测的发展历程及主流算法的简要概述:
1. 传统方法阶段(2000年代-2015年左右)
在深度学习兴起之前,文本检测主要依赖手工设计的特征与传统机器学习算法。
特点:
- 注重低级视觉特征,如颜色、边缘、纹理等。
- 偏向于规则文本(如文档或票据)检测。
代表方法
- 基于边缘特征的方法:
- 使用图像梯度和边缘信息(如Sobel算子或Canny边缘检测)检测文本边界。
- 基于连接组件的方法:
- 例如极大稳定极值区域(MSER),通过寻找图像中的稳定区域来检测可能的字符块。
- 基于滑动窗口的方法:
- 滑动窗口逐像素扫描,通过分类器(如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 Imageimage = 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()