Amazon Augmented AI (Amazon A2I) のチュートリアル
2025/06/28
Amazon Augmented AI (Amazon A2I)を使ったことがありませんでしたので、チュートリアルをやってみました。
チュートリアル: Amazon A2I コンソールの使用を開始するに公開されている手順です。
目次
準備
A2IはTextract向け、Rekognition向け、カスタムの3種類があって、チュートリアルではTextractとRekognitionそれぞれにサンプルの画像が用意されていました。
一応両方S3バケットを作ってアップロードしました。
リージョンはバージニア北部で実行しました。
ワークチームの作成
A2Iは機械学習モデルの評価を人が行うために、モデル作成のワークフロー(MLOps)に組み込むためのサービスです。
作業する人のチームを先に設定します。
チームはプライベートで作成することもできますし、Amazon Mechanical Turkを使用してアウトソースしたりベンダーチームに依頼することもできます。
チュートリアルではプライベートチームを作成しました。
SageMaker AIの[Ground Truth]-[ラベリングワークフォース]でプライベートチームの作成をしました。
プライベートチームの認証はCognitoを使用しました。
ワーカーはEメールによる招待を設定しました。
イベントのSNSトピックへの通知もできましたが、今回は設定しませんでした。
Textract向けの人間によるレビューワークフローの作成
SageMaker AIの[Argumented AI]-[人間によるレビューワークフロー]で[Create human review workflow]を押下しました。
サンプル画像をアップロードしたS3バケットとプレフィックスのURIを設定しました。
IAMロールは新規作成もできます。
私は少し前に作っていたS3バケットへの権限があるIAMロールを選択しました。
ロールの許可ポリシーには、AWS管理ポリシーのAmazonSageMakerFullAccessと、S3のGetObject、PutObject、DeleteObject、ListBucketが設定されていました。
信頼ポリシーはPrincipalにsagemaker.amazonaws.comが設定されていました。
Task typeでは、Textractを選択しました。
チュートリアルにならって「Amazon Textract によって識別され、信頼スコアが指定範囲にあるすべてのフォームキーについて、人間によるレビューをトリガーします」を有効にしました。
識別信頼度しきい値: 「フォーム内で検出されたキーと値のペアについて、信頼スコアが次の範囲にある場合、人間によるレビューをトリガーします」では0~98を設定しました。
適格信頼度しきい値: 「フォーム内のキーと値のペアに含まれるテキストの信頼スコアが次の範囲にある場合、人間によるレビューをトリガーします」では0~98を設定しました。
これでほとんどの場合は人間によるレビューが必要になります。
他のオプションは「フォーム キーの信頼スコアに基づいて、または特定のフォーム キーが欠落している場合に、特定のフォーム キーの人間によるレビューをトリガーします。」と「フォームのサンプルをランダムに人間に送信してレビューしてもらいます。」でした。
今回はこれらは使用していません。
Worker task template creationではCreate from default templateを選択してテンプレート名を入力しました。
Task descriptionに説明を入力しました。
ここは日本語は使用できませんでした。
WorkersではPrivateで作成しておいたワークチームを選択しました。
ヒューマンループの開始
チュートリアルではPython boto3のサンプルコードがありましたが、CloudShellで簡単に実行したいので、CLIで実行しました。
次のコマンドからdocumentとFlowDefinitionArnを変更して実行しました。
1 2 3 4 5 6 7 8 9 10 11 12 |
aws textract analyze-document \ --document '{"S3Object":{"Bucket":"amzn-s3-demo-bucket","Name":"document-name.pdf"}}' \ --feature-types TABLES FORMS \ --human-loop-config '{ "FlowDefinitionArn":"arn:aws:sagemaker:east-1:111122223333:flow-definition/flow-definition-name", "HumanLoopName":"human-loop-name", "DataAttributes":{ "ContentClassifiers":["FreeOfPersonallyIdentifiableInformation","FreeOfAdultContent"] } }' \ --region us-east-1 |
開始後の確認
コンソールで人間によるレビューワークフローのHuman loopsを見に行くと、StatusがFailedになってました。
名前をクリックして、詳細を確認すると次のエラーメッセージがありました。
Task failed to render: [ MisconfiguredResource: ‘CORS is not correctly enabled on this object’s S3 bucket: s3://bucketname/a2i/sample-document-final.png’ ].
手順にはなかったように思いましたが、S3バケットのCORS設定が必要なんでしょうか。
設定して再度やってみましょう。
1 2 3 4 5 6 7 8 9 10 |
[ { "AllowedHeaders": ["*"], "AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"], "AllowedOrigins": ["*"], "ExposeHeaders": ["ETag"], "MaxAgeSeconds": 3000 } ] |
CORSを設定して、HumanLoopNameを別の名前にしてaws textract analyze-documentコマンドをもう一度実行しました。
In progressになりました!!
CORS設定が必要だったんですね。
人によるレビュー
ワークチームに設定したワーカーの受信メールを確認したら、メールが届いていました。
ジョブが作成されているので、[Start working]を押下してみました。
Textractによる抽出結果が表示されています。
すべてきれいに抽出されているようです。
Mail addressの最初のTownだけ不要そうなのでそれを削除線としてハイフンに書き換えて、Submitしました。
ジョブがなくなりました。
Human loopsを見に行くとそちらもCompletedになっていました。
出力データを確認する
Human loopsの名前をクリックして、Output locationにあるS3に保存されたoutput.jsonをダウンロードしてみます。
大きなJSONなので部分的に確認しました。
1 2 3 4 5 6 |
"inputContent":{ "aiServiceResponse":{ "blocks":[...] } } |
Textractがもともと抽出した情報がinputContentのaiServiceResponseのblocksにあります。
1 2 3 4 5 6 7 8 |
"humanAnswers":[{ "answerContent":{ "AWS/Textract/AnalyzeDocument/Forms/V1":{ "blocks":[...] } } }] |
humanAnswersのblocksに人がチェックした後に送信した情報があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "blockType": "WORD", "confidence": 35.44533, "geometry": { "boundingBox": { "height": 0.032385655, "left": 0.24622095, "top": 0.6879775, "width": 0.06227806 }, "polygon": [ {"x": 0.308499, "y": 0.6879808}, {"x": 0.30849743, "y": 0.72036314}, {"x": 0.24622095, "y": 0.72035974}, {"x": 0.2462226, "y": 0.6879775} ], "rotationAngle": 270 }, "id": "83f2f801-e4c2-4902-8413-cc5d2e9aec92", "text": "Town,", "textType": "PRINTED" } |
元の該当箇所では、”Town”となっていました。
信頼度のconfidenceは35.44533とかなり低い値です。
1 2 3 4 5 6 |
{ "blockType": "WORD", "id": "83f2f801-e4c2-4902-8413-cc5d2e9aec92", "text": "--" } |
同じid値の箇所を”–“と修正したことがわかります。
モデルの推論結果に対して、人が関わって正しかったのか、正しくないのか、何がどう正しくなかったのかを送信できました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
Lambdaでちょっとしたコードを試すときに便利なエディタのフルスクリーン機能
Lambda歴6年で、はじめて使いました。 この存在に気がついてなかったです。 …
-
-
EC2スケジュールリザーブドインスタンスって終わりましたん?
ユーザーガイドのScheduled Reserved Instancesを見ると …
-
-
AWS IAMのMFA「エンティティは既に存在しています」に対応しました
エンティティは既に存在しています MFA Device entity at th …
-
-
Amazon EC2のスクリーンショットとは
ドキュメント見てたらAmazon EC2でスクリーンショットって機能があったので …
-
-
cfn-signalの認証とネットワーク
AWS CloudFormationヘルパースクリプトのcfn-signalがC …
-
-
AWS LambdaのSQSへの自前ポーリングをやめてSQSイベントソーストリガーに変更した
以前は、LambdaがSQSからメッセージを受信するには、キューをポーリングして …
-
-
Amazon Q Developer for CLIでAWS Diagram MCP Serverを使ってAWSアイコンを使った図を書いてもらいました
MacにインストールしているAmazon Q Developer for CLI …
-
-
WordPressで画像アップロードができなくなった(AWS WAFでブロックしていた)
WordPressで画像がアップロードできなくなりました。 こんなメッセージです …
-
-
Pandocサーバーのコンテナイメージを作成する
マークダウンからEPUBへの変換をAWS Batchで行いたく、ECRにアップロ …
-
-
Route 53のホストゾーンにサブドメインを登録する
親ドメインを移行しないでサブドメインの DNS サービスを Amazon Rou …