16.4.OCR
Windows 10
Python 3.7.7 @ MSC v.1916 64 bit (AMD64)
Latest build date 2020.09.21
pytesseract version: 0.3.6
Tesseract
Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封。
数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软体业,让其重焕新生——2005年,Tesseract由美国内华达州信息技术研究所获得,并求诸于Google对Tesseract进行改进、消除Bug、优化工作。
Tesseract目前已作为开源项目发布在Google Project,并提供了一个命令行工具。安装Tesseract之后,可以通过以下命令在terminal打印Tesseract的版本信息:
output = subprocess.check_output(
r'"C:\Program Files\Tesseract-OCR\tesseract.exe" -v'
)
print(output.decode("utf-8"))
tesseract v5.0.0-alpha.20200328
leptonica-1.78.0
libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.3) : libpng 1.6.34 :
libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.3.0
Found AVX2
Found AVX
Found FMA
Found SSE
Found libarchive 3.3.2 zlib/1.2.11 liblzma/5.2.3 bz2lib/1.0.6
liblz4/1.7.5
Found libcurl/7.59.0 OpenSSL/1.0.2o (WinSSL) zlib/1.2.11 WinIDN
libssh2/1.7.0 nghttp2/1.31.0
tesseract 的使用方式如下:
单一命令:
tesseract --help # 显示简短的帮助文档
tesseract --help-extra # 显示完整的帮助文档
tesseract --help-psm # 显示-psmk可选命令的参数的说明
tesseract --help-oem # 显示-oem可选命令的参数的说明
tesseract -v, --version # 显示-oem版本信息
tesseract --list-langs # 列出当前tesseract引擎的可用语言
tesseract --print-parameters # 打印tesseract的参数
OCR命令:
tesseract 辨识的图片 输出文档 [可选命令]
可选命令:
--dpi VALUE 指定输入图片的DPI
-l LANG[+LANG] 指定OCR时使用的语言
--psm NUM 指定页面分割模式
--oem NUM 指定OCR引擎模式
--psm
和--oem
相关参数的说明如下:
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. (not implemented)
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.
OCR Engine modes:
0 Legacy engine only.
1 Neural nets LSTM engine only.
2 Legacy + LSTM engines.
3 Default, based on what is available.
tesseract 支持同时识别多种语言,例如以下命令代表同时识别test.png图片中的简体中文和英文:
tesseract -l chi_sim+end test.png
tesseract支持输出可搜索的pdf:
tesseract -l eng test.png test.pdf pdf
这将创建带有图像的pdf文件,其中包含已识别文本的单独可搜索文本层。
pytesseract
pytesseract
是一个Python库,它封装了 Tesseract
,即为Tesseract提供了Python接口。
# If you don't have tesseract executable in your PATH, include the following:
tesseract_path = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
pytesseract.pytesseract.tesseract_cmd = tesseract_path
现在有一张名为ocr_sample.png
的图片如下:
# Simple image to string
print(pytesseract.image_to_string(Image.open("../datasets/file/ocr_sample.png"),
lang="chi_sim+eng"))
为了提高小目标检测的精度,各路学者提出了许多行之有效的方案。
Lin 等[7从损失函数方面出发,提出了 RetinaNet。RetinaNet 主要解决了单阶
段模型正负样本不平衡的问题。通常情况下,一张图仅有几个目标,而产生的候
选框却是成千上百,负样本对 损失函数的影响远远大于正样本。如此一来,
模型便会过分关注负样本,也更容易发生对正样本的漏检现象。RetinaNet 使用的
Focal Loss 提高了对少量样本的关注,很好地解决了正负样本不平衡的问题。
可以设置timeout
参数。
# Timeout/terminate the tesseract job after a period of time
try:
# Timeout after half a second
print(pytesseract.image_to_string('test.jpg', timeout=0.5))
except RuntimeError as timeout_error:
# Tesseract processing is terminated
pass
现在有一个储存着图片路径列表的文本文件:
with open("../datasets/file/ocr_list.txt", "r") as f:
print(f.read())
../datasets/file/ocr_sample.png
../datasets/file/ocr_sample.png
# Batch processing with a single file containing the list of multiple image file paths
print(pytesseract.image_to_string("../datasets/file/ocr_list.txt",
lang="chi_sim"))
为了提高小目标检测的精度,各路学者提出了许多行之有效的方案。
Lin 等[7从损失函数方面出发,提出了 RetinaNet。RetinaNet 主要解决了单阶
段模型正负样本不平衡的问题。通常情况下,一张图仅有几个目标,而产生的候
选框却是成千上百,负样本对 损失函数的影响远远大于正样本。如此一来,
模型便会过分关注负样本,也更容易发生对正样本的漏检现象。RetinaNet 使用的
Focal Loss 提高了对少量样本的关注,很好地解决了正负样本不平衡的问题。
为了提高小目标检测的精度,各路学者提出了许多行之有效的方案。
Lin 等[7从损失函数方面出发,提出了 RetinaNet。RetinaNet 主要解决了单阶
段模型正负样本不平衡的问题。通常情况下,一张图仅有几个目标,而产生的候
选框却是成千上百,负样本对 损失函数的影响远远大于正样本。如此一来,
模型便会过分关注负样本,也更容易发生对正样本的漏检现象。RetinaNet 使用的
Focal Loss 提高了对少量样本的关注,很好地解决了正负样本不平衡的问题。
返回可识别字符和可识别字符的边界。
# Get bounding box estimates
boxes = pytesseract.image_to_boxes(Image.open("../datasets/file/ocr_sample.png"),
lang="chi_sim")
print("\n".join(boxes.split("\n")[:6]))
为 44 162 72 179 0
了 71 153 84 183 0
提 83 162 98 179 0
高 101 162 129 179 0
小 131 167 136 174 0
目 146 162 164 179 0
获取更详细的信息,字符边界、置信度、行数、页数
# Get verbose data including boxes, confidences, line and page numbers
more_info = pytesseract.image_to_data(Image.open("../datasets/file/ocr_sample.png"),
lang="chi_sim")
print("\n".join(more_info.split("\n")[:10]))
level page_num block_num par_num line_num
word_num left top width height conf text
1 1 0 0 0 0 0 0 687
188 -1
2 1 1 0 0 0 10 9 672
171 -1
3 1 1 1 0 0 44 9 557
17 -1
4 1 1 1 1 0 44 9 557
17 -1
5 1 1 1 1 1 44 9 28
17 96 为
5 1 1 1 1 2 71 5 13
30 96 了
5 1 1 1 1 3 83 9 46
17 95 提高
5 1 1 1 1 4 131 14 5
7 96 小
5 1 1 1 1 5 146 9 28
17 96 目标
获取页面文字方向信息。
# Get information about orientation and script detection
print(pytesseract.image_to_osd(Image.open("../datasets/file/ocr_sample.png"),
lang="chi_sim"))
Page number: 0
Orientation in degrees: 270
Rotate: 90
Orientation confidence: 170.00
Script: Latin
Script confidence: 2.00
生成可搜索的PDF。
# Get a searchable PDF
pdf = pytesseract.image_to_pdf_or_hocr("../datasets/file/ocr_sample.png",
lang="chi_sim",
extension="pdf")
with open("../datasets/file/ocr_sample.pdf", "w+b") as f:
f.write(pdf) # pdf type is bytes by default
os.remove("../datasets/file/ocr_sample.pdf")
获取 hocr格式的输出。
hOCR是一种HTML文件,它对每个识别的字词会后一些参数的说明。
# Get HOCR output
hocr = pytesseract.image_to_pdf_or_hocr("../datasets/file/ocr_sample.png",
lang="chi_sim",
extension="hocr")
获取 ALTO XML 格式的输出。
# Get ALTO XML output
xml = pytesseract.image_to_alto_xml("../datasets/file/ocr_sample.png")