![03899ab9be034e87088f15cbd6369c31.png](https://i-blog.csdnimg.cn/blog_migrate/8cf87f91fbf6accc35bbf8ef4bb450d9.jpeg)
原文链接:
OpenCV Text Detection (EAST text detector) - PyImageSearchwww.pyimagesearch.com![1d160bf4419c3007552511d6d6271e69.png](https://i-blog.csdnimg.cn/blog_migrate/dd7b7b2d0704808c941ee6c471381776.jpeg)
在本教程中,您将学习如何在OpenCV中使用EAST文本检测器对自然场景图像和视频中的文本进行检测。
OpenCV 的EAST文本检测器是一个深度学习模型,它能够在 720p 的图像上以13帧/秒的速度实时检测任意方向的文本,并可以获得很好的文本检测精度。
EAST文本检测器需要 OpenCV3.4.2 或更高的版本,有需要的读者可以查看 OpenCV 安装教程。
在今天教程的第一部分,我将讨论为什么在自然场景图像中检测文本会如此具有挑战性。
然后我将简要讨论EAST文本检测器,为什么选择它,以及该算法哪里新颖——并提供原始论文的链接供读者参考。
最后,我将提供我的Python + OpenCV文本检测实现,以便您可以开始在自己的程序中应用文本检测。
为什么自然场景文本检测如此具有挑战性?
![0b74ea7e4bb77bf1fc5eef34c537eb11.png](https://i-blog.csdnimg.cn/blog_migrate/53a643f1b9243756957d7049ecd332a5.jpeg)
在受约束的受控环境中检测文本通常可以使用基于启发式的方法来完成,例如利用梯度信息或者文本通常被分为段落并且字符一般都是成直线排列。这种基于启发式的文本检测器的一个例子可以在我之前的博文中看到。
但是自然场景文本检测是不同的——而且更具挑战性。
由于廉价数码相机和智能手机的普及,我们需要高度关注图像拍摄的条件。Celine Mancas-Thillou和Bernard Gosselin在2017年发布的论文Natural Scene Text Understanding描述了自然场景中的文本检测面对的挑战。
- 图像/传感器噪声:手持相机的传感器噪声通常高于传统扫描仪。此外,廉价相机通常会插入原始传感器的像素来产生真实的颜色。
- 视角:自然场景的文本会与观察视角不平行,这使得文本更难识别。
- 模糊:不受控制的环境下,文本可能会模糊不清,尤其是当用户使用的智能手机不稳定性时。
- 照明条件:我们无法对自然场景图像中的照明条件做出任何假设。天可能很暗,相机上的闪光灯可能亮着,或者太阳可能明亮地照着,使整个图像很饱和。
- 分辨率:并非所有相机的分辨率都是相同的—我们可能正在处理分辨率低的相机拍出的图片。
- 非纸质对象:大多数(但不是所有)纸张都不反光,自然场景中的文本可能是反光的,比如徽标、标志牌等。
- 非平面对象:当文本环绕在瓶子上时,表面上的文本会扭曲变形。虽然人类仍然能够很容易地“检测”和阅读文本,但我们的算法会很困难。我们需要能够处理这样的用例。
- 未知位置:我们不能使用任何先验信息来给算法提供文本所在位置的“线索”。
正如下图所示,OpenCV的EAST文本检测器非常健壮,即使文本模糊、反射或部分遮挡,也能够定位文本:
![132289ae412dc49b9fdd5cd14c340fc7.png](https://i-blog.csdnimg.cn/blog_migrate/eb34f93ecf18d537f241d3d77c7e5c08.jpeg)
EAST深度学习文本检测器
![7902d86c5e7be726b637668cb8e500f7.png](https://i-blog.csdnimg.cn/blog_migrate/8c867ecbf3ee50c5ff2b3db85c3e765e.jpeg)
随着OpenCV 3.4.2和OpenCV 4的发布,我们现在可以使用基于深度学习的文本检测器EAST,它是基于2017年的论文 EAST: An Efficient and Accurate Scene Text Detector。
因为深度学习模型是端到端的,所以可以避开其他文本检测方法用到的计算成本高的子算法,比如候选对象聚合和字符分割等。EAST网络也使用了精心设计的损失函数。
项目结构
首先使用Tree终端命令来浏览项目结构:
$ tree --dirsfirst
.
├── images
│ ├── car_wash.png
│ ├── lebron_james.jpg
│ └── sign.jpg
├── frozen_east_text_detection.pb
├── text_detection.py
└── text_detection_video.py
1 directory, 6 files
我在images目录中提供了三张图片,还提供了两个python脚本: text_detection.py : 检测静态图像中的文本。 text_detection_video.py : 检测网络摄像头或输入视频文件的文本
两个脚本都使用EAST模型(frozen_east_text_detection.pb)。
代码实现说明
文本检测实例是基于 OpenCV’s C++ example 的,我在将其转换为Python时,我遇到了一些麻烦。
首先,在Python中没有 Point2f
和 RotatedRect
函数,因此,我不能 100% 模仿C++程序的实现。C++程序可以产生旋转的边界框,但我们这个python版本的不能做到。
其次,在 Python 中 NMSBoxes 函数(cv2.dnn.NMSBoxes
)不会返回任何值(至少对于OpenCV 4 而言),导致OpenCV抛出一个错误。MSBoxes
函数可能在OpenCV 3.4.2中可能使用,但我无法全面地对其进行测试。
所以我使用基于 imutils 模块的 non-maxima suppression,但是,我也不认为这两个是100%可互换的,因为 NMSBoxes
会接受额外的参数。
用OpenCV实现文本检测
先安装或者升级imutils
:
$ pip install --upgrade imutils
此时,您的系统已经配置好,打开text_detection.py并写入以下代码:
1# import the necessary packages
2from imutils.object_detection import non_max_suppression
3import numpy as np
4import argparse
5import time
6import cv2
7
8# construct the argument parser and parse the arguments
9ap = argparse.ArgumentParser()
10ap.add_argument("-i", "--image", type=str,
11 help="path to input image")
12ap.add_argument("-east", "--east", type=str,
13 help="path to input EAST text detector")
14ap.add_argument("-c", "--min-confidence", type=float, default=0.5,
15 help="minimum probability required to inspect a region")
16ap.add_argument("-w", "--width", type=int, default=320,
17 help="resized im