跳转至

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

参考

  1. [ 實用心得 ] Tesseract-OCR
  2. 本地转换中英文扫描版PDF为可搜索文件