使用 Amazon Rekognition API 进行文本检测和 OCR

Posted 程序媛一枚~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用 Amazon Rekognition API 进行文本检测和 OCR相关的知识,希望对你有一定的参考价值。

使用 Amazon Rekognition API 进行文本检测和 OCR

这篇博客将介绍如何 使用Amazon Rekognition API 进行文本检测和 OCR,包括如何创建 Amazon Rekognition密钥、安装boto3(用于调用AWS接口的Python程序包)以及如何实现Python 脚本来调用 Amazon Rekognition API。

Amazon Rekognition OCR API 结果不仅正确,而且还可以在行和单词级别解析结果,提供了比 EAST文本检测模型和 Tesseract OCR引擎更精细的粒度(至少无需微调多个选项)。

1. 效果图

逐行OCR 效果图如下:

可以看到对输入飞机图像进行了逐行OCR,从而证明 Amazon Rekognition API 能够:
在输入图像中查找每个文本块、OCR 每个文本的投资回报率、将文本块分组为行。

逐单词OCR 效果图如下:

2. 原理

适用于Python的Amazon Web Services(AWS)软件开发工具包(SDK)

pip install boto3

2.1 步骤

  1. 了解 Amazon Rekognition API
  2. 如何获取 AWS Rekognition 密钥。这些密钥将包括公共访问密钥和密钥,类似于SSH,SFTP等。
  3. 如何将 Amazon Rekognition API 用于 OCR
  4. 获取 Amazon Web Services (AWS) Rekognition Keys
  5. 安装 Amazon 的 boto3 软件包以调用OCR API 接口
  6. 实现与 Amazon Rekognition API 接口的 Python 脚本,以 OCR 图像

2.2 云OCR API优缺点

到目前为止主要专注于使用Tesseract OCR引擎。但是还有其他光学字符识别(OCR)引擎可用,其中一些引擎比Tesseract更准确,并且即使在复杂,不受约束的条件下也能准确地OCR文本。

通常,这些OCR引擎位于云中。为了保持这些模型和相关数据集的专有性,这些公司不会公开模型,而是将它们放在REST API中。调用这些云API的主要原因是准确性。 首先考虑谷歌和微软通过运行各自的搜索引擎获得的数据量。然后考虑亚马逊每天通过简单地打印运输标签产生的数据量。这些公司拥有令人难以置信的图像数据量 。当在数据上训练新颖,最先进的OCR模型时,结果是一个非常强大和准确的OCR模型。

虽然这些模型确实比Tesseract更准确,但也有一些缺点,包括:

  • OCR图像需要互联网连接 - 对于大多数笔记本电脑/台式机来说,这不是一个问题,但如果您在边缘工作,则可能无法进行互联网连接;
  • 如果使用的是边缘设备,则可能不希望将功耗花在网络连接上;
  • 网络连接会带来延迟;
  • 更耗时,因为图像需要打包到API请求中并上传到OCR API。API需要解析图像并对其进行OCR,然后最终将结果返回给客户端;
  • 由于OCR每个图像的延迟和时间,可能不能够实时运行;
  • 收费的(但通常提供免费试用或每月最多免费获得多个API请求)

3. 源代码

# 使用AWS Rekognition Keys API进行图片ocr(逐行或者逐单词)
# 需要事先注册亚马逊拿到key
# USAGE
# python amazon_ocr.py --image images/aircraft.png
# python amazon_ocr.py --image images/aircraft.png --type word
# python amazon_ocr.py --image images/aircraft.png --type line

# 导入必要的包
import argparse

import boto3
import cv2
from config import aws_config as config  # 导入AWS 访问密钥、私有密钥和区域


# image:我们正在绘制 OCR 文本的输入图像
# text:OCR 文本本身
# poly:Amazon Rekognition API 返回的文本边界框的多边形对象/坐标
# color:边界框的颜色
def draw_ocr_results(image, text, poly, color=(0, 255, 0)):
    # 解包边界框坐标,注意缩放坐标
    # 相对于输入图像大小
    (h, w) = image.shape[:2]
    tlX = int(poly[0]["X"] * w)
    tlY = int(poly[0]["Y"] * h)
    trX = int(poly[1]["X"] * w)
    trY = int(poly[1]["Y"] * h)
    brX = int(poly[2]["X"] * w)
    brY = int(poly[2]["Y"] * h)
    blX = int(poly[3]["X"] * w)
    blY = int(poly[3]["Y"] * h)

    # 构建一个顶点list,构建边界框的每一个向量
    pts = ((tlX, tlY), (trX, trY), (brX, brY), (blX, blY))
    topLeft = pts[0]
    topRight = pts[1]
    bottomRight = pts[2]
    bottomLeft = pts[3]

    # 为文本绘制边界框
    cv2.line(image, topLeft, topRight, color, 2)
    cv2.line(image, topRight, bottomRight, color, 2)
    cv2.line(image, bottomRight, bottomLeft, color, 2)
    cv2.line(image, bottomLeft, topLeft, color, 2)

    # 绘制文本
    cv2.putText(image, text, (topLeft[0], topLeft[1] - 10),
                cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2)

    # 返回图像
    return image


# 构建命令行参数及解析
# --image 要ocr的图像路径
# --type 参数可以是行或单词,指示希望 Amazon Rekognition API 返回分组为行或单个单词的 OCR 结果。
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
                help="path to input image that we'll submit to AWS Rekognition")
ap.add_argument("-t", "--type", type=str, default="line",
                choices=["line", "word"],
                help="output text type (either 'line' or 'word')")
args = vars(ap.parse_args())

# 使用密钥连接到AWS,以使用Amazon Rekognition OCR API
client = boto3.client(
    "rekognition",
    aws_access_key_id=config.ACCESS_KEY,
    aws_secret_access_key=config.SECRET_KEY,
    region_name=config.REGION)

# 加载图像为原始二进制文件,请求Amazon Rekognition OCR API
print("[INFO] making request to AWS Rekognition API...")
image = open(args["image"], "rb").read()
response = client.detect_text(Image="Bytes": image)

# 获取文本检测结果返回值,加载图像为opencv的Numpy格式以进行绘制
detections = response["TextDetections"]
image = cv2.imread(args["image"])

# 复制图像
final = image.copy()

# 遍历检测的边界框坐标
for detection in detections:
    # 提取OCR的文本,类型(单词”或“行”)及文本边界框坐标
    text = detection["DetectedText"]
    textType = detection["Type"]
    poly = detection["Geometry"]["Polygon"]

    # 仅绘制文本类型与请求类型相同的文本
    if args["type"] == textType.lower():
        # 按行绘制ocr文本
        output = image.copy()
        output = draw_ocr_results(output, text, poly)
        final = draw_ocr_results(final, text, poly)

        # 展示ocr的文本
        print(text)
        cv2.imshow("Output", output)
        cv2.waitKey(0)

# 展示最终输出
cv2.imshow("Final Output", final)
cv2.waitKey(0)

参考

以上是关于使用 Amazon Rekognition API 进行文本检测和 OCR的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amazon Rekognition API 进行文本检测和 OCR

是否可以使用 Google 的 Vision API 或 Amazon 的 Rekognition 来获取对象的数量?

基于Amazon KVS 与 Amazon Rekognition Streaming Video Events实时视频检测方案

用户无权执行:rekognition:RecognizeCelebrities with a explicit deny

使用字节的 AWS Rekognition JavaScript 开发工具包

text AWS Rekognition示例