这篇博客将介绍如何 使用Amazon Rekognition API 进行文本检测和 OCR,包括如何创建 Amazon Rekognition密钥、安装boto3(用于调用AWS接口的Python程序包)以及如何实现Python 脚本来调用 Amazon Rekognition API。
Amazon Rekognition OCR API 结果不仅正确,而且还可以在行和单词级别解析结果,提供了比 EAST文本检测模型和 Tesseract OCR引擎更精细的粒度(至少无需微调多个选项)。
逐行OCR 效果图如下:
可以看到对输入飞机图像进行了逐行OCR,从而证明 Amazon Rekognition API 能够:
在输入图像中查找每个文本块、OCR 每个文本的投资回报率、将文本块分组为行。
逐单词OCR 效果图如下:
适用于Python的Amazon Web Services(AWS)软件开发工具包(SDK)
pip install boto3
到目前为止主要专注于使用Tesseract OCR引擎。但是还有其他光学字符识别(OCR)引擎可用,其中一些引擎比Tesseract更准确,并且即使在复杂,不受约束的条件下也能准确地OCR文本。
通常,这些OCR引擎位于云中。为了保持这些模型和相关数据集的专有性,这些公司不会公开模型,而是将它们放在REST API中。调用这些云API的主要原因是准确性。 首先考虑谷歌和微软通过运行各自的搜索引擎获得的数据量。然后考虑亚马逊每天通过简单地打印运输标签产生的数据量。这些公司拥有令人难以置信的图像数据量 。当在数据上训练新颖,最先进的OCR模型时,结果是一个非常强大和准确的OCR模型。
虽然这些模型确实比Tesseract更准确,但也有一些缺点,包括:
# 使用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)