2
1

More than 1 year has passed since last update.

Lambda, Amazon Textractを利用してS3に保存した画像からテキストを抽出する(Golang)

Last updated at Posted at 2021-10-03

はじめに

S3に画像を追加すると、自動的にその画像内のテキストを抽出し、テキストファイルとして保存する、というシステムをLambdaAmazon Textract・Golangを利用して作りました。

作成手順を共有します。

完成イメージ

ocr.drawio.png

Textractとは

Amazon TextractはAWSが提供するクラウドOCRサービスです。詳しくは以下の記事を参照してください。

料金

利用料金はこちらのページにまとまっています。無料枠で使用可能です。

注意点

  • 日本リージョンに対応していない
  • 日本語には対応していない

ブラウザで試す

こちらのページでかんたんに試すことができます。

実装手順

S3バケットを作成する

手順は割愛しますが、入力用のバケットと出力用のバケットを作成します。
参考: https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/create-bucket-overview.html

Lambdaを作成する

入力用のバケットへの画像ファイル(今回はpngファイルのみとします)書き込みをトリガーとするLambdaを作成します。
今回はランタイムにGolangを指定しました。

lambda.png

実行ロールには以下の権限を持つものを指定してください。

  • 入力用のS3バケットの読み込み権限
  • 出力用のS3バケットの書き込み権限
  • TextractのAPIへのアクセス権限(AmazonTextractFullAccess?)

トリガーを設定

trigger.png

コード

コードは以下です。

package main

import (
    "context"
    "strings"
    "time"

    "github.com/aws/aws-lambda-go/lambda"

    "github.com/aws/aws-sdk-go/service/s3/s3manager"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/textract"
)

func lambdaHandler(ctx context.Context, event events.S3Event) {
    // S3から画像オブジェクト取得
    sess := session.Must(session.NewSession(&aws.Config{
        Region: aws.String("us-east-1"),
    }))
    inputBucket := event.Records[0].S3.Bucket.Name
    inputKey := event.Records[0].S3.Object.Key

    // Textract API呼び出し
    textractSession := textract.New(sess)
    input := &textract.DetectDocumentTextInput{
        Document: &textract.Document{
            S3Object: &textract.S3Object{
                Bucket: aws.String(inputBucket),
                Name:   aws.String(inputKey),
            },
        },
    }
    resp, err := textractSession.DetectDocumentText(input)
    if err != nil {
        panic(err)
    }

    // レスポンスからテキストデータを抽出
    var output string
    for _, w := range resp.Blocks {
        if *w.BlockType == "LINE" { // PAGE, WORD, LINEから指定できる
            output += *w.Text
            output += "\n"
        }
    }

    // S3に書き込み
    outputBucket := // 出力用バケット名
    outputObjectKey := inputKey + time.Now().String() + ".txt"
    uploader := s3manager.NewUploader(sess)
    _, err = uploader.Upload(&s3manager.UploadInput{
        Bucket: aws.String(outputBucket),
        Key:    aws.String(outputObjectKey),
        Body:   strings.NewReader(output),
    })
    if err != nil {
        panic(err)
    }
}

func main() {
    lambda.Start(lambdaHandler)
}

コードをアップロード

ビルドしてzipファイルを作成します。

% GOOS=linux go build -o lambda
% zip lambda.zip lambda 

zipファイルを作成したらアップロードします。
zip-upload.png

動かしてみる

以下の画像で試してみます(参考)。
textract-test.jpg

上記の画像を入力用のバケットに保存します。
s3-upload.png

すると出力用のバケットにテキストファイルが保存されます。
s3-output.png

出力されたテキストファイルの中身は以下。

Amazon.com, Inc. is located in Seattle, WA
It was founded July 5th, 1994 by Jeff Bezos
Amazon.com allows customers to buy everything from books to blenders
Seattle is north of Portland and south of Vancouver, BC.

上記をすべてコードで定義する

(まだやってないのでやり次第追記します)

おわりに

今回は抽出したテキストをテキストファイルとして保存しましたが、CSVファイルとして出力する等、様々な方法で活用することが可能です。
間違い等あればご指摘お願いいたします。

参考文献

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1