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

2023-10-29

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

参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Amazon Rekognition API 进行文本检测和 OCR 的相关文章

随机推荐

  • 华为OD机试真题 Java 实现【机房布局】【2023Q1 200分】

    一 题目描述 小明正在规划一个大型数据中心机房 为了使得机柜上的机器都能正常满负荷工作 需要确保在每个机柜边上至少要有一个电箱 为了简化题目 假设这个机房是一整排 M表示机柜 I表示间隔 请你返回这整排机柜 至少需要多少个电箱 如果无解请返
  • termux-x11教程

    小粉丝已经求稿两个星期了 不写是不行了 termux x11 是Termux的一个图形化项目 官方是这么介绍的 A Termux add on app providing Android frontend for Xwayland 安装工具
  • MacBook【m1】创建django虚拟环境

    1 为什么使用虚拟环境 cd miniforge3我们在做开发时可能会同时开发多个项目 这些项目可能会依赖于不同的python环境 比如有的用到3 6有的用到3 7 这时我们创建不同版本的python 放到虚拟环境中给不同的项目分别提供其所
  • ReactJs实现树形结构的数据显示的组件

    1 该组件树形显示数据 2 组件中数据的请求方式为fetch方式 3 点击对应的数据前面的小三角 fetch请求改数据下对应的子数据 并展开该节点 4 将该组件的js less文件放到kpiTree目录下 在kpiTree目录下创建imag
  • Vue 路由

    1 vue router的理解 vue router是vue的一个插件 专门用来实现SPA应用 SPA也就是单页Web应用 特点是 整个应 用只有一个完整的页面 点击页面中的导航链接不会刷新页面 只会做页面的局部更新 数据需要 通过ajax
  • printf打印浮点数,%e %f %g的区别

    打印浮点数有 e f g三种格式 它们的区别如下 e 以科学计数法表示 小数点左边只有一位 小数点右边保留6位 过长则截去 不够则补零 接着是符号e 再接着就是10的多少次幂 f 要求小数点右边保留6位 过长则截去 不够则补零 g 没有上面
  • pandas学习笔记—agg()函数详解

    目录 1 agg 函数定义 2 举例 2 1 简单的列或行统计 2 2 自定义统计函数 2 3 先groupby 再agg 1 agg 函数定义 agg 函数是聚合函数 DataFrame agg func axis 0 args kwar
  • sprintf格式化字符串

    可以利用sprintf对字符串进行格式化 sprintf 目标字符串 格式 占位参数 格式化字符串 void test01 char buf 1024 memset buf 0 1024 sprintf buf 今天是 d年 d月 d 日
  • Failed to start docker.service: Unit not found(Docker服务起不来)

    原文https blog csdn net qq 34508530 article details 84989990 linux部署Docker出现 Failed to start docker service Unit not found
  • 多种方案教你实现iframe嵌套页面相互传参(父子通信)

    文章目录 需求描述 开始上手 上代码 父向子传值 方法一 通过URL传参 方法二 通过window postMessage 方法 注意事项 子向父传值 方法一 通过通过全局变量方式处理 方法二 通过通过window parent postM
  • DVWA-BruteFoce高级安全

    DVWA security high GET包结构 比起来之前low medium等级 可以看到这里多了一个参数 user token 为了防止重放攻击 但是明显能看出来user token就是用户输入密码的md5形式 直接用burpsut
  • 用ChatGPT生成openAI全景报告

    云孚科技基于业内领先的自然语言处理 知识图谱 语义匹配 智能写作等技术 打造了云孚开源情报系统YFINT 并结合ChatGPT模型成果 重磅推出OpenAI调研报告 ChatGPT简介 2022年11月30日 总部位于旧金山的OpenAI推
  • 【13届蓝桥杯复盘】九进制转十进制 顺子日期

    问题描述 九进制正整数 2022 下标9 转换成十进制等于多少 方法 权值展开 2 93 2 9 2 9 0 1478 如果 一定要用代码来实现 C 代码如下所示 include
  • python+selenium实现cookie登录,并抓取指定类class下的html内容

    个人研究学习研究用 1 首先通过链接手动登录 https www educity cn 获取cookie信息 2 再使用站点cookie登录 跳转到https uc educity cn tiku testReport html id 80
  • Hadoop组件的一些总结

    前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 用户可以在不了解分布式底层细节的情况下 开发分布式程序 充分利用集群的威力进行高速运算和存储 提示 以下是本篇文章正文内容 下面案例可供参考 一 Hadoop的组成 H
  • [转]为什么未来不需要我们?

    为什么未来不需要我们 在21世纪 我们威力无比的三种科技 机器人 基因工程和纳米技术正在使人类成为濒危物种 作者 比尔 乔伊 自从我从事科技创造的那一刻起 我就关注其在伦理上的问题 但直到1998年秋天我才认识到我们在21世纪面临着多大的危
  • python3+flask 开发web(一)

    1 环境准备 1 安装Python https www python org 2 安装python ide pycharm https www jetbrains com pycharm 3 安装flask 安装好了python 电脑就自动
  • 如何使用gdb调试java虚拟机_GDB入门教程之如何使用GDB启动调试

    GDB The GNU Project Debugger 是 Linux 系统下调试 C 和 C 程序的主要神兵 Vim教程网 https vimjc com 介绍多种方式下使用 GDB 启动进程调试的方法和命令 要使得 C 和 C 程序能
  • varchar和char的区别

    1 char n 和varchar n 中括号中n代表字符的个数 并不代表字节个数 所以当使用了中文的时候 UTF8 意味着可以插入m个中文 但是实际会占用m 3个字节 即 n限制了存储多长的值 但是所占用的空间大小不一致 例如varcha
  • 使用 Amazon Rekognition API 进行文本检测和 OCR

    使用 Amazon Rekognition API 进行文本检测和 OCR 这篇博客将介绍如何 使用Amazon Rekognition API 进行文本检测和 OCR 包括如何创建 Amazon Rekognition密钥 安装boto3