Amazon Rekognitionのテキスト検出を利用して、新しいアーキテクチャアイコンのサービス名を取得してみた

はじめに

AWSチームのすずきです。

Amazon Rekognition、AWSの画像認識サービスでは、画像ファイルに含まれるテキスト文字を抽出する事が可能です。

当機能を利用して、新しいAWSアーキテクチャアイコンの画像データからAWSサービス名のテキスト情報の取得を試みる機会がありましたので、紹介させて頂きます。

【新機能】Amazon Rekognitionで画像からのテキスト検出が出来るようになりました

対象画像

AWSアーキテクチャアイコンの画像ファイルを対象としました。

AWS Architecture Icons、新しいAWS製品アイコンがリリースされました

今回、弊社デザインチームにより用意されたファイルの仕様は、以下の通り。 Web掲載用のアイコンとして利用するにあたり、半角英数字へのファイル名の変更と、アイコンが示すAWSサービス名を反映させる必要がありました。

  • <マルチバイト文字の共通名>_<画像サイズ>.<連番>.jpeg
  • ブログアイキャッチ_1200x630.013.jpeg

デモ確認

  • AWSコンソール、Rekognitionダッシュボードを利用して、テキスト検出が可能な事を確認しました。

  • 画像ファイルのアイコンに含まれるテキスト、Rekognitionにより文字列として認識する事を確認しました。

CLI

実行環境

  • AWSCLIのバージョン
    aws --version
    aws-cli/1.16.26 Python/3.7.0 Darwin/18.2.0 botocore/1.12.16
    

  • IAMは、管理ポリシー「arn:aws:iam::aws:policy/AmazonRekognitionFullAccess」を付与して利用しました。

detect-text

  • AWSCLIを利用して「detect-text」、ローカルの処理対象ファイルを指定した処理を試みました。

FILE=`ls -1 *.jpeg | head -n1 ` 
aws rekognition detect-text --image-bytes fileb://./${FILE} 
  • JSON結果(2レコード分のみ抜粋)
    {
        "TextDetections": [
            {
                "DetectedText": "Amazon",
                "Type": "LINE",
                "Id": 0,
                "Confidence": 99.94586944580078,
                "Geometry": {
                    "BoundingBox": {
                        "Width": 0.25083333253860474,
                        "Height": 0.10634920746088028,
                        "Left": 0.4716666638851166,
                        "Top": 0.20000000298023224
                    },
                    "Polygon": [
                        {
                            "X": 0.4716666638851166,
                            "Y": 0.20000000298023224
                        },
                        {
                            "X": 0.7225000262260437,
                            "Y": 0.20000000298023224
                        },
                        {
                            "X": 0.7225000262260437,
                            "Y": 0.3063492178916931
                        },
                        {
                            "X": 0.4716666638851166,
                            "Y": 0.3063492178916931
                        }
                    ]
                }
            },
            {
                "DetectedText": "Kinesis",
                "Type": "LINE",
                "Id": 1,
                "Confidence": 99.91385650634766,
                "Geometry": {
                    "BoundingBox": {
                        "Width": 0.21833333373069763,
                        "Height": 0.10952381044626236,
                        "Left": 0.4724999964237213,
                        "Top": 0.3571428656578064
                    },
                    "Polygon": [
                        {
                            "X": 0.4724999964237213,
                            "Y": 0.3571428656578064
                        },
                        {
                            "X": 0.690833330154419,
                            "Y": 0.3571428656578064
                        },
                        {
                            "X": 0.690833330154419,
                            "Y": 0.46666666865348816
                        },
                        {
                            "X": 0.4724999964237213,
                            "Y": 0.46666666865348816
                        }
                    ]
                }
            }
        ]
    }
    

テキスト抽出

以下の条件を満たすレコードを抽出する事で、求めるテキストを抽出する事が出来ました。

  • 「Type」が「WORD」
  • 「Height」が0.1〜0.14
  • 「Confidence」(検出されたテキストと境界ボックスの精度)が99
echo ${TMP} | jq  '.TextDetections[]|select(.Type == "WORD")|select(.Confidence >99)|select(.Geometry.BoundingBox.Height > 0.1)|select(.Geometry.BoundingBox.Height < 0.15)|{DetectedText: .DetectedText, Confidence: .Confidence, Height: .Geometry.BoundingBox.Height}'
{
  "DetectedText": "Amazon",
  "Confidence": 99.94586944580078,
  "Height": 0.10634920746088028
}
{
  "DetectedText": "Kinesis",
  "Confidence": 99.91385650634766,
  "Height": 0.10952381044626236
}
{
  "DetectedText": "Data",
  "Confidence": 99.9675064086914,
  "Height": 0.11269841343164444
}
{
  "DetectedText": "Analytics",
  "Confidence": 99.94580841064453,
  "Height": 0.13650794327259064
}

ファイル名生成

  • DetectedText で得られた内容を「-」区切りに変換し、新しいファイル名となる文字列を得る事が出来ました。
TMP2=`echo ${TMP} | jq -r '.TextDetections[]|select(.Type == "WORD")|select(.Confidence >99)|select(.Geometry.BoundingBox.Height > 0.1)|select(.Geometry.BoundingBox.Height < 0.15)| .DetectedText'`
NEWFILE="`echo $TMP2| sed 's/ /-/g' | sed 's/\///g'`.jpeg"
echo ${NEWFILE}
Amazon-Kinesis-Data-Analytics.jpeg

まとめ

Amazon Rekognitionのテキスト検出(DetectText)と、簡単なシェルスクリプトの利用により、 約200個のファイルのリネーム処理を数分、約0.2$のAWS利用費で実施する事ができました。

2018年11月時点では、Rekognitionのテキスト検出が対応する文字種はアルファベットのみとなりますが、 今後の日本語を含む多言語対応の機能強化が楽しみなサービスでした。