当前位置: 首页 > news >正文

使用 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)

参考

  • https://pyimagesearch.com/2022/03/21/text-detection-and-ocr-with-amazon-rekognition-api/
  • Amazon keys获取:https://customers.pyimagesearch.com/aws-keys/

相关文章:

  • 内核驱动踩坑记录
  • 半导体中的杂质和缺陷能级
  • SSM毕设项目大学生心理咨询系统792l6(java+VUE+Mybatis+Maven+Mysql)
  • 嵌入式学习的第二天
  • R语言(4) plot函数介绍
  • JVM -- 垃圾回收器7种(四)
  • 模型调优:验证集的作用(就是为了调整超参数)
  • PyQt5之消息对话框
  • java计算机毕业设计校友闲置书籍管理平台源代码+数据库+系统+lw文档
  • Interactron | 体现自适应的目标检测器
  • javaEE---CSS
  • PCIE操作基础原理
  • Windows系统SVG图片预览插件
  • 2022.10.1模拟赛
  • 西瓜书研读——第三章 线性模型: 线性判别分析 LDA
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • JavaScript创建对象的四种方式
  • Java方法详解
  • js
  • js 实现textarea输入字数提示
  • JWT究竟是什么呢?
  • Lucene解析 - 基本概念
  • springMvc学习笔记(2)
  • Web Storage相关
  • zookeeper系列(七)实战分布式命名服务
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端面试题总结
  • 前端面试总结(at, md)
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 通过git安装npm私有模块
  • 我建了一个叫Hello World的项目
  • 小程序button引导用户授权
  • 走向全栈之MongoDB的使用
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 白色的风信子
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Java总结 - String - 这篇请使劲喷我
  • Python 之网络式编程
  • 湖北分布式智能数据采集方法有哪些?
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​io --- 处理流的核心工具​
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #pragma once与条件编译
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (一)Dubbo快速入门、介绍、使用
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)为C# Windows服务添加安装程序
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查