• 使用 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
    
    • 1

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105

    参考

  • 相关阅读:
    Kubernetes那点事儿——集群搭建1.22(kubeadm部署)
    GoLong的学习之路(十)语法之函数
    深圳保诚后端Java社招面试
    中断机制-通过volatile实现线程中断停止
    基于深度学习网络的烟雾检测算法matlab仿真
    React学习笔记三
    软件测试之编写用例的重要性
    自定义容器控件之C#设计笔记(十五)
    ChatGPT提示词Prompts
    计算机网络复习——数据链路层
  • 原文地址:https://blog.csdn.net/qq_40985985/article/details/125873086