Amazon Textractで画像内の文字列を検出

1. はじめに

今回は、LambdaからTextractを呼び出し、S3に保存されている画像内の文字列を検出してみます。



2. 目次



3. 各種AWSリソースのセットアップ


3.1. Amazon Textract


3.1.1. Amazon Textractとは

Amazon Textractとは、ドキュメントからテキストやデータを簡単に自動抽出してくれるサービスです。 2023/10/13時点での対応言語は以下となっており、日本語には対応していません。

英語、ドイツ語、フランス語、スペイン語、イタリア語、ポルトガル語

また、2023/10/13時点では東京リージョンで利用できません。


3.1.2. Amazon Textractの設定

本記事ではSDKを用いて使用するため、AWSマネジメントコンソール上の「Amazon Textract」のページでの設定は不要です。


3.2. Amazon S3


3.2.1. 今回使用する画像ファイルについて

今回は以下の画像(text.jpg)を使用します。

text.jpg(出典:photoAC

3.2.2. Amazon S3の設定
項目 設定値
バケット 任意のバケット
AWSリージョン Amazon Textract」が利用可能な米国東部 (バージニア北部) us-east-1を選択
その他項目 デフォルトのまま

バケット作成後、3.2.1で示した画像ファイルを作成したバケット内にアップロードします。


3.3. AWS Lambda


3.3.1. AWS Lambdaの設定

Amazon Textract」が利用可能な米国東部 (バージニア北部) us-east-1リージョンにて、以下設定値でAWS Lambdaを設定します。

項目 設定値
関数名 任意の関数名
ランタイム Python 3.11」を選択
その他項目 「デフォルトのまま

デフォルトの設定だと基本的なLambdaアクセス権限で新しいロールが作成されますが、その状態だとS3へのアクセス、およびAmazon Textractの呼び出しが行えないため、以下のポリシーをアタッチします。

  • AmazonS3ReadOnlyAccess
  • AmazonTextractFullAccess


※Textractについては、簡略化のためにFullAcessを使用しています。本来であれば、FullAccessをむやみに使用すべきではありません。

Python

import json
import boto3

textract = boto3.client('textract', region_name='us-east-1')
s3 = boto3.client('s3')

# バケット名,テキストファイル名
BUCKET_NAME = 'kaneyama-sample-bucket'
TEXT_NAME = 'text.jpg'

def lambda_handler(event, context):

    obj = s3.get_object(Bucket=BUCKET_NAME, Key=TEXT_NAME)
    body = obj['Body'].read()

    response = textract.analyze_document(
        Document={'Bytes': body},
        FeatureTypes=['FORMS']
    )
    
    print(json.dumps(response, indent=2))



4. 検証

以下、出力結果を一部抜粋しています。

........
........
{
      "BlockType": "LINE",
      "Confidence": 99.9324951171875,
      "Text": "Pick up",
      "Geometry": {
........
........
},
{
      "BlockType": "LINE",
      "Confidence": 99.98697662353516,
      "Text": "&",
      "Geometry": {
........
........
},
{
      "BlockType": "LINE",
      "Confidence": 99.95753479003906,
      "Text": "Drop off",
      "Geometry": {
........
........
},
{
      "BlockType": "WORD",
      "Confidence": 99.95877075195312,
      "Text": "Pick",
      "Geometry": {
.......
.......
},
{
      "BlockType": "WORD",
      "Confidence": 99.9062271118164,
      "Text": "up",
      "Geometry": {
.......
.......
},
.......
.......

ここで、一部抜粋した結果のキーとバリューについて簡単に説明したいと思います。

キー バリュー
BlockType テキスト行 (LINE) または単語 (WORD) のどちらであるかを表す
Confidence 特定の予測が正しい確率を示す 0 ~ 100 の数値
Text 検出されたテキスト

結果を見ると、行単位および単語単位でテキストを検出することができていることがわかります。



5.おわりに

今回はAmazon Textractを使用して画像ファイルからテキストを検出しました。 紙文書でのやり取りはいまだにいろんなところで残っているかと思うので、日本語に対応されると利用場面が増えるのではないかと思います。 早く日本語に対応してほしいですね。