文章目录

  • 一、背景与环境搭建
  • 二、文本检测与识别

一、背景与环境搭建

OpenCV的文本识别流程:

  1. OpenCV EAST 文本检测器执行文本检测,
  2. 我们提取出每个文本 ROI 并将其输入 Tesseract,从而构建完整的 OpenCV OCR 流程!
  • 环境搭建
    Tesseract (v4) 最新版本支持基于深度学习的 OCR,准确率显著提高。底层的 OCR 引擎使用的是一种循环神经网络(RNN)——LSTM 网络。
pip install tesseract
pip install opencv-python
pip install pillow
pip install pytesseract
pip install imutils

安装 tesseract-ocr 下载地址:https://digi.bib.uni-mannheim.de/tesseract/

由于 tesseract-ocr安装地址(如下左):

故添加环境变量(如上右):C:\Program Files (x86)\Tesseract-OCR
故需改 pytesseract.py :tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'

  • OpenCV OCR 文本识别流程图

    我们使用 OpenCV 的 EAST 文本检测器来检测图像中的文本。

    • EAST 文本检测器将提供文本 ROI 的边界框坐标。
    • 我们将提取每个文本 ROI,将其输入到 Tesseract v4 的 LSTM 深度学习文本识别算法。LSTM 的输出将提供实际 OCR 结果。
    • 我们将在输出图像上绘制 OpenCV OCR 结果。

整个过程中使用到的 Tesseract 命令必须在 pytesseract 库下调用。在调用 tessarct 库时,我们需要提供大量 flag。(tessarct --help)
最重要的三个 flag 是 -l、–oem 和 --ism。

$ tesseract --help-oem
OCR Engine modes:0    Legacy engine only.1    Neural nets LSTM engine only.2    Legacy + LSTM engines.3    Default, based on what is available.

-l flag 控制输入文本的语言,本教程示例中使用的是 eng(英语),在这里你可以看到 Tesseract 支持的所有语言:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files。
–oem(OCR 引擎模式)控制 Tesseract 使用的算法类型。执行以下命令即可看到可用的 OCR 引擎模式:
–psm 控制 Tesseract 使用的自动页面分割模式:

$ tesseract --help-psm
Page segmentation modes:0    Orientation and script detection (OSD) only.1    Automatic page segmentation with OSD.2    Automatic page segmentation, but no OSD, or OCR.3    Fully automatic page segmentation, but no OSD. (Default)4    Assume a single column of text of variable sizes.5    Assume a single uniform block of vertically aligned text.6    Assume a single uniform block of text.7    Treat the image as a single text line.8    Treat the image as a single word.9    Treat the image as a single word in a circle.
10    Treat the image as a single character.
11    Sparse text. Find as much text as possible in no particular order.
12    Sparse text with OSD.
13    Raw line. Treat the image as a single text line,bypassing hacks that are Tesseract-specific.

对文本 ROI 执行 OCR,我发现模式 6 和 7 性能较好,但是如果你对大量文本执行 OCR,那么你可以试试 3(默认模式)。
如果你得到的 OCR 结果不正确,那么我强烈推荐调整 --psm,它可以对你的输出 OCR 结果产生极大的影响。

$ tree --dirsfirst
.
├── images
│   ├── example_01.jpg
│   ├── example_02.jpg
│   ├── example_03.jpg
│   ├── example_04.jpg
│   └── example_05.jpg
├── frozen_east_text_detection.pb
└── text_recognition.py1 directory, 7 files

项目包含一个目录和两个重要文件:

  • images/:该目录包含六个含有场景文本的测试图像。我们将使用这些图像进行 OpenCV OCR 操作。
  • frozen_east_text_detection.pb:EAST 文本检测器。该 CNN 已经经过预训练,可用于文本检测。它是由 OpenCV 提供的,你也可以在「Downloads」部分下载它。
  • text_recognition.py:我们的 OCR 脚本。我们将逐行 review 该脚本。它使用 EAST 文本检测器找到图像中的文本区域,然后利用 Tesseract v4 执行文本识别。
  • EAST 文本检测器生成两个变量:
    scores:文本区域的概率。
    geometry:文本区域的边界框位置。

关于脚本参数

  • 我们的脚本需要两个命令行参数:
    –image:输入图像的路径。
    –east:预训练 EAST 文本检测器的路径。
  • 下列命令行参数是可选的:
    –min-confidence:检测到的文本区域的最小概率。
    –width:图像输入 EAST 文本检测器之前需要重新调整的宽度,我们的检测器要求宽度是 32 的倍数。
    –height:与宽度类似。检测器要求调整后的高度是 32 的倍数。
    –padding:添加到每个 ROI 边框的(可选)填充数量。如果你发现 OCR 结果不正确,那么你可以尝试 0.05、0.10 等值。

二、文本检测与识别

from imutils.object_detection import non_max_suppression
import numpy as np
import pytesseract
import argparse
import cv2"""EAST 文本检测器生成两个变量:scores:文本区域的概率。geometry:文本区域的边界框位置。
"""def decode_predictions(scores, geometry):# grab the number of rows and columns from the scores volume, then# initialize our set of bounding box rectangles and corresponding# confidence scores(numRows, numCols) = scores.shape[2:4]rects = []confidences = []for y in range(0, numRows):#提取分数(概率),然后是几何数据,用于导出围绕文本的潜在边界框坐标scoresData = scores[0, 0, y]xData0 = geometry[0, 0, y]xData1 = geometry[0, 1, y]xData2 = geometry[0, 2, y]xData3 = geometry[0, 3, y]anglesData = geometry[0, 4, y]for x in range(0, numCols):                       # 循环列数if scoresData[x] < args["min_confidence"]:    # 忽略低置信度continue# 计算偏移因子作为我们的结果特征 # maps will be 4x smaller than the input image(offsetX, offsetY) = (x * 4.0, y * 4.0)# 提取预测的旋转角并计算angle = anglesData[x]cos = np.cos(angle)sin = np.sin(angle)# 使用几何体来推导bounding box的宽度和高度h = xData0[x] + xData2[x]w = xData1[x] + xData3[x]# 计算文本预测bounding box的起始和结束(x,y)坐标endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))startX = int(endX - w)startY = int(endY - h)# 将 bounding box坐标和概率得分添加到各自的列表中rects.append((startX, startY, endX, endY))confidences.append(scoresData[x])return (rects, confidences)  #返回bounding boxes的元组及其置信度"""
构造参数分析器并解析参数
"""
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str,help="path to input image")
ap.add_argument("-east", "--east", type=str,help="path to input EAST text detector")
ap.add_argument("-c", "--min-confidence", type=float, default=0.5,help="minimum probability required to inspect a region")
ap.add_argument("-w", "--width", type=int, default=320,help="nearest multiple of 32 for resized width")
ap.add_argument("-e", "--height", type=int, default=320,help="nearest multiple of 32 for resized height")
ap.add_argument("-p", "--padding", type=float, default=0.0,help="amount of padding to add to each border of ROI")
args = vars(ap.parse_args())"""加载+预处理我们的图像并初始化关键变量
"""
image = cv2.imread(args["image"])
orig = image.copy()
(origH, origW) = image.shape[:2]# 设置新的宽度和高度,然后确定宽度和高度的变化比。
(newW, newH) = (args["width"], args["height"])
rW = origW / float(newW)
rH = origH / float(newH)# 调整图像大小并获取新的图像尺寸
image = cv2.resize(image, (newW, newH))
(H, W) = image.shape[:2]"""EAST文本检测器:EAST检测器模型定义两个输出层名称:第一个是输出概率,第二个可以用来导出文本的边框坐标
"""
layerNames = ["feature_fusion/Conv_7/Sigmoid","feature_fusion/concat_3"]# 加载预训练的EAST文本检测器
print("[INFO] loading EAST text detector...")
net = cv2.dnn.readNet(args["east"])"""至少 OpenCV 3.4.2 才能调用  cv2.dnn.readNet见证【奇迹】的第一步:确定文本位置从图像中构建一个BLOB(团),然后执行模型的前向传递以获得两个输出层集合。
"""blob = cv2.dnn.blobFromImage(image, 1.0, (W, H),(123.68, 116.78, 103.94), swapRB=True, crop=False)
net.setInput(blob)
(scores, geometry) = net.forward(layerNames)# 解码预测,然后应用非极大值抑制来抑制弱重叠的 bounding boxes(包围盒)。
(rects, confidences) = decode_predictions(scores, geometry)
boxes = non_max_suppression(np.array(rects), probs=confidences)'''识别文本遍历边界框,并处理结果
'''results = []for (startX, startY, endX, endY) in boxes:   # 遍历 bounding box# 根据相应比例缩放 bounding box 坐标startX = int(startX * rW)startY = int(startY * rH)endX = int(endX * rW)endY = int(endY * rH)# 填充边界框:同时计算x和y方向的增量dX = int((endX - startX) * args["padding"])dY = int((endY - startY) * args["padding"])# 将边界分别填充到边界框的每一侧。startX = max(0, startX - dX)startY = max(0, startY - dY)endX = min(origW, endX + (dX * 2))endY = min(origH, endY + (dY * 2))# 提取被填充的 ROIroi = orig[startY:endY, startX:endX]# 设置 Tesseract config 参数(英语、LSTM神经网络和单行文本)。config = ("-l eng --oem 1 --psm 7")text = pytesseract.image_to_string(roi, config=config)# 将边界框坐标和OCR文本添加到结果列表中results.append(((startX, startY, endX, endY), text))"""输出结果:
"""
# 将结果框的坐标从上到下排序
results = sorted(results, key=lambda r:r[0][1])for ((startX, startY, endX, endY), text) in results:print("OCR TEXT")print("========")print("{}\n".format(text))# 剥离非ASCII文本,利用OpenCV的图像绘制文本,然后绘制文本和bounding box边框text = "".join([c if ord(c) < 128 else "" for c in text]).strip()output = orig.copy()cv2.rectangle(output, (startX, startY), (endX, endY),(0, 0, 255), 2)cv2.putText(output, text, (startX, startY - 20),cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 255), 3)cv2.imshow("Text Detection", output)cv2.waitKey(0)cv2.destroyAllWindows()
 python text_recognition.py --east frozen_east_text_detection.pb \--image images/example_01.jpg
[INFO] loading EAST text detector...
OCR TEXT
========
OH OK

关于代码运行:Anaconda | python3.6 | OpenCV_tf
我的OpenCV有关的库全都安装在OpenCV_tf 环境中,故我需要在此环境运行代码。

权重及完整代码:https://download.csdn.net/download/wsp_1138886114/10724564
该代码运行可能会因为依赖而报错,请安装完整依赖
关于文本位置确定:请查看https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/

特别鸣谢
https://www.pyimagesearch.com/2018/09/17/opencv-ocr-and-text-recognition-with-tesseract/
https://www.cnblogs.com/wzben/p/5930538.html

机器视觉 OpenCV—python 基于LSTM网络的OCR文本检测与识别相关推荐

  1. Python基于CRNN&CTPN的文本检测系统(源码&教程)

    1.背景 文本是人类最伟大和最具影响力的发明之一,是人类智慧的结晶,是人类文化.思想传承的一种基本的表达方式和不可或缺的载体.在21世纪,文本与日常生活密切相关.描述.理解万事万物,表达情感,与他人交 ...

  2. 基于EAST和Tesseract的文本检测与识别

    目录 导言 现实世界问题 说明 问题陈述 业务目标和约束条件 可用于文本检测和识别的数据集 数据集概述和说明 探索性数据分析(EDA) 深度学习时代之前的文本检测方法 EAST(高效精确的场景文本检测 ...

  3. 基于深度学习的场景文本检测和识别(Scene Text Detection and Recognition)综述

    1. 引言 文字是人类最重要的创作之一,它使人们在时空上可以有效地.可靠的传播或获取信息. 场景中的文字的检测和识别对我们理解世界很有帮助,它应用在图像搜索.即时翻译.机器人导航.工业自动化等领域. ...

  4. OCR文本检测模型:FCENet论文阅读笔记

    文章目录 前言 摘要(Abstract) 1. 介绍(Introduction) 2. 相关工作(Related Work) 3. 方法(Approach) 3.1 傅里叶轮廓嵌入(Fourier C ...

  5. 【LSTM】基于LSTM网络的人脸识别算法的MATLAB仿真

    1.软件版本 matlab2021a 2.本算法理论知识 长短时记忆模型LSTM是由Hochreiter等人在1997年首次提出的,其主要原理是通过一种特殊的神经元结构用来长时间存储信息.LSTM网络 ...

  6. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

    基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...

  7. Python基于改进YOLOv5的烟叶病害检测系统(附带源码)

    Python基于改进YOLOv5的烟叶病害检测系统(附带源码) 1.背景 2.前言 3.烟叶数据集的采集 4.烟叶数据集的标注 5.烟叶检测训练&识别效果 6.病害数据集的采集 7.病害数据集 ...

  8. opencv OCR 端到端场景文本检测与识别(webcam_demo) vs2015

    版权声明:技术分享,csdn longji https://blog.csdn.net/longji/article/details/78274842 01 资源 OpenCV自带的端到端场景文本检测 ...

  9. OpenVINO+OpenCV 文本检测与识别

    本文转载自OpenCV学堂. 1 模型介绍 文本检测模型 OpenVINO支持场景文字检测是基于MobileNet的PixelLink模型,该模型有两个输出,分别是分割输出与bounding Boxe ...

最新文章

  1. 今天你(L)China了吗?
  2. 【SQLAlchemy】简单整理filter和filter_by的区别
  3. 有趣的Web版Ubuntu Linux
  4. MYSQL BENCHMARK函数的使用
  5. wordpresd免登录发布接口php_屏蔽修改wp-login.php登录入口确保WordPress网站后台安全...
  6. 机器学习:提升算法之Adaboost
  7. java认证考试(java认证考试报名)
  8. 【新技术】 移动支付过程中的NFC技术
  9. 使用3CDaemon 进行ftp 传输文件 (linux-开发板) 的方法
  10. ssm mysql项目实战_ssm项目实战_ssm项目实战教程_ssm项目实战视频教程 _课课家
  11. Orange:一个基于 Python 的数据挖掘和机器学习平台
  12. 计算机 审计追踪功能,第 讲 审计追踪技术与Windows安全审计功能
  13. Banner 图片轮播
  14. 订单系统:订单拆单规则与流程详解
  15. 电脑会不定时的突然黑屏加显卡风扇狂转,记录一次排查过程
  16. 【小程序源码】同名在线查询系统
  17. 中学生学习心理01认知过程
  18. 偏态分布(Skewed distribution)
  19. CSP认证:行车路线
  20. vc.net matlab,基于Excel、Matlab和VC net实现立体天线方向图的重构和电平估算_

热门文章

  1. lpoj5576 hongrock的柠檬树
  2. FaceBoxes: A CPU Real-time Face Detector with High Accuracy(论文解析)
  3. 如何只用逻辑运算实现算术加减乘除运算
  4. c语言四舍五入任意位,js四舍五入及任意保留小数位
  5. windows 2003 server 搭建php环境,windows server 2003 php 环境搭建
  6. python解决数学问题的实例_用python解决简单的数学问题
  7. C#控制textbox只能输入数字
  8. 【天下手游】游戏角色分析
  9. 计算机硬盘是什么材质的钢材,现在千万别装机了:CPU/内存/硬盘/机箱/电源齐涨价...
  10. plain framework 1 pak插件说明(资源压缩加密)