Amazon Web Services ブログ

Amazon Kinesis Video StreamsとAmazon Rekognition Videoでハイエンドコンシューマーエクスペリエンスを提供するために顔認識を使用する

これは 1995 年、Amazon.com のウェブサイトが誕生してからわずか 1 か月の頃の画面です。この画面から見てすぐに分かることを 1 つ、もう少しよく見なければならないことを 1 つお話ししましょう。まず、この 23 年間という時の流れを感じさせるのはウェブデザインです。2 つ目は Eyes の広告文のあなたの気に入りそうな本が見つかったら疲れを知らぬ自動検索エージェントがメールを送りますという一節です。

Eyes は Amazon 初のパーソナライズされたオンラインショッピング環境でした。これは昔ながらの、店を訪れる顧客を知り尽くした地元の店のような、最高のサービスを再現するという旅路の、最初の一歩だったわけです。皆がある時期に、私たちのニーズすべてにぴったり合った体験ができるこの種のサービスを受けたことは、だれにとっても大変幸運なことだったと言えます。

そして 23 年後の今に時代を移しましょう。様々なところで、オンライン体験が主流になりました。世界のどこからでも Amazon.com へログオンし、皆さんの日頃のお買い物の仕方と同じ、一貫した体験を受けることができます。それも偏にウェブサイトが私たちのことを「知っている」からです。人によるサービスではこれは容易なことではありません。皆さんのお気に入りの店に行くとしましょう。それも、あなたの住み慣れた町にある店です。そこでは他の一般客と同じような対応を受けるのが普通です。

これを変えるにはどうすればいいと思いますか? たとえば、あなたが服の小売店の店員だとします。もし、店にやってくる顧客のことを知っていて、この情報を賢く活用できたとしたら、あなたはその顧客に素晴らしいサービスを提供できるはずです。たとえば、その顧客が既に購入した商品にぴったりな商品をすすめられます。もし、その商品の在庫に顧客のサイズがなければ、その商品をすすめることはできません。その顧客から前回、なんらかのトラブルや苦情があれば、特に気を配ることができます。顧客の顔とその顧客に関する情報をくまなく記憶できる驚異の記憶力をもった店員がいればいいだけです。

AWS で機械学習について読んだ後、あなたはこれを構築してみることにしました。アーキテクチャの中心となるのは、re:Invent 2017 で発表された 2 つのサービス、Amazon Kinesis Video Streams と Amazon Rekognition Video です。Kinesis Video Streams を使用すると、分析、機械学習のために、接続されたデバイスから AWS へ動画を簡単かつ安全にストリーミングできるようになります。Rekognition Video は簡単に Kinesis Video Streams に統合でき、顔のメタデータを集めたプライベートデータベースに対し、リアルタイムの顔認識を実行できます。あなたのソリューションのアーキテクチャは次のとおりです。

システムのプロトタイプを素早く構築するために、Raspberry Pi でホストされているカメラを使用します。これで店内の様子を撮影し、Amazon Kinesis Video Streams を使用して、AWS にビデオをストリーミングします。このストリームを分析するために、Amazon Rekognition Video を使用します。そこで生成された分析結果を Kinesis Data Stream へ送信します。AWS Lambda の関数がこのストリームを読み込み、AWS IoT Topic へメッセージを送ります。店ではウェブソケット接続を介して AWS IoT Topic にサブスクライブしたタブレットが店員に提供されます。タブレットは店に既知の顧客が入ってきたときに店員に通知することが可能です。タブレットの存在は、このエクスペリエンスをより自然な流れにするのに一役買っています。店に着くなりまるで魔法のように現れる自分のすべてを知り尽くした店員に対応してほしいと思う人はいませんが、情報の出本がはっきりしていれば、顧客もこうした技術を受け入れやすくなります。AWS IoT をアーキテクチャに含めることで、未来のスマートストアの構築に近づけることができるのです。

Raspberry Pi を準備する

Kinesis Video Streams C++ Producer SDK を Raspberry Pi にインストールする方法について詳しくは、AWS ドキュメントを参照してください。  この段階では、Download and Build the Kinesis Video Streams C++ Producer SDK のセクションの終わりまで手順に従ってください。

手順の一部として、Kinesis Video Streams に書き込み権限のある IAM ユーザーが作成されます。  また、複数のカメラとともに、このプロジェクトを本番環境へ移行するには、Amazon Cognito を使用してアイデンティティを管理する方が適しています。しかし、ここでは IAM ユーザーで十分です。

Kinesis Video Stream と Kinesis Data Stream を作成する

インストールスクリプトが完了したら、AWS マネジメントコンソールを使用して新しい Kinesis Video Stream を作成します。Amazon Kinesis Video Streams コンソールに移動し、[Create (作成)] ボタンを選択します。ストリーム my-stream を呼び出し、デフォルト設定を使用するボックスにチェックを入れます。

Kinesis コンソールを使用する一方で、Rekognition Video が結果を出力する場所では、Kinesis Data Stream も作成します。Amazon Kinesis コンソールに移動し、右側の Data Streams リンクを選択し、Create Kinesis stream ボタンを選択します。この AmazonRekogntionResults ストリームを呼び出します。このストリームのデータフローが巨大化することはないため、単独のシャードで十分です。

AWS マネジメントコンソールを使用して、ビデオストリームとデータストリームの両方の Amazon リソースネーム (ARN) を見つけ、メモします。

ビデオストリーミングを開始する

Raspberry Pi に戻り、ホームディレクトリで次のコマンドを実行し、AWS へのカメラのデータストリーミングを開始します。

export AWS_ACCESS_KEY_ID=<your access key>
export AWS_SECRET_ACCESS_KEY=<your secret access key>
export AWS_DEFAULT_REGION=<your region>

./amazon-kinesis-video-streams-producer-sdk-cpp/kinesis-video-native-build/kinesis_video_gstreamer_sample_app -w 640 -h 480 my-stream

サンプル app (-w 640 -h 480) に送信された 1 つ目と 2 つ目のパラメーターはビデオストリームの解像度を判別します。3 つ目のパラメーター (my-stream) は、先に作成した Kinesis Video Stream の名前です。

上記のコマンドが、ライブラリーを見つけられないというエラーで失敗する場合は、プロジェクトがオープンソースライブラリーに正しくリンクされていることを確認するために以下のコマンドを入力してください。

rm -rf ./kinesis-video-native-build/CMakeCache.txt ./kinesis-video-native-build/CMakeFiles
./kinesis-video-native-build/install-script

数秒後、AWS マネジメントコンソールに Kinesis Video Stream のカメラの画像が表示されます。Raspberry Pi カメラのビデオをクラウドで取得することができました!  次はこれを分析する必要があります。

Amazon Rekognition Video

Rekognition Video サービスは Kinesis Video Stream からのデータの解析を管理するために使用できるストリームプロセッサを提供します。これを実行するために、プロセッサには許可が必要なので、IAM コンソールに移動し、新しい IAM ロールを作成します。ロールを使用するサービスとして Rekognition を選択し、AmazonRekognitionServiceRole マネージドポリシーをアタッチします。このロールは、Rekognition に対し、Kinesis Video Stream から読み取り、AmazonRekognition のプレフィックスが付いた Kinesis Data Stream を書き込む権限を与えます。ロールが作成されたら、ARN をメモしておいてください。

ストリームプロセッサを作成する前にもう 1 つのタスクを実行しましょう。顔情報のコレクションを作成する必要があります。これは Rekognition Video に検出させたい既知の顧客の顔情報を保存したプライベートデータベースです。AWS コマンドラインインターフェース (CLI) から次のコマンドを入力し、my-customers という名前の顔情報コレクションを作成します。

aws rekognition create-collection --collection-id my-customers  

顧客があなたのパイロットプロジェクトに参加することを承知したら、顧客の写真を撮り、イメージを Amazon S3 へアップロードし、CLI コマンドで顔情報のコレクションを追加していきます。

aws rekognition index-faces --collection-id my-customers --image '{"S3Object":{"Bucket":"<bucket>","Name":"<key>"}}' --external-image-id <name>

次の情報はご使用の環境に合わせて書き換えてください。

  • <bucket> – Amazon S3 バケットの名前
  • <key> – Amazon S3 オブジェクトへのキー (PNG または JPEG ファイル)
  • <name> 顧客の名前

Amazon Rekognition はコレクションに実際の顔情報を保存しません。代わりに、顔の特徴を抽出し、この情報をデータベースに保存します。この情報はコレクションの検索や、顔情報の照合など、その後の操作に使用されます。

続いて、次の CLI コマンドを使用してストリームプロセッサを作成します。

aws rekognition create-stream-processor --input '{"KinesisVideoStream":{"Arn":"<video stream ARN>"}}' --name store-processor --role-arn <role ARN> --stream-processor-output '{"KinesisDataStream":{"Arn":"<data stream ARN>"}}' --settings '{"FaceSearch":{"CollectionId":"my-customers", "FaceMatchThreshold": 85.5}}'

次の置き換え情報を使用して記述を書き換えてください。

  • <video stream ARN> – Kinesis Video Stream の ARN
  • <role ARN> – 作成した IAM ロールの ARN
  • <data stream ARN> – Kinesis Data Stream の ARN

この CLI コマンドを実行すると新しく作成されたストリームプロセッサの ARN が返されます。これは次のコマンドを実行することで開始できます。

aws rekognition start-stream-processor --name store-processor

素晴らしいサービスを提供する

Rekognition はこれで Raspberry Pi からのビデオストリームを分析し、その分析結果を Kinesis Data Stream へ供給できるようになりました。このサービスは Kinesis Video Stream で検出した顔情報を、顔情報コレクションに含まれる顧客の顔情報と照合します。Rekognition Video がサービスで分析される各フレームで、多くの顔情報を検出し、一致情報が多数見つかる可能性があります。この情報は Rekognition Video が Kinesis Data Stream に供給する JSON ドキュメントに詳しく記載されています。以下はそうしたドキュメントの一例です。

{
  "InputInformation": {
    "KinesisVideo": {
      "StreamArn": "arn:aws:kinesisvideo:eu-west-1:xxxxxxxxxxxxx:stream/my-stream",
      "FragmentNumber": "91343852333289682796718532614445757584843717598",
      "ServerTimestamp": 1521903783.723,
      "ProducerTimestamp": 1521903783.589,
      "FrameOffsetInSeconds": 2
    }
  },
  "StreamProcessorInformation": {
    "Status": "RUNNING"
  },
  "FaceSearchResponse": [
    {
      "DetectedFace": {
        "BoundingBox": {
          "Height": 0.075,
          "Width": 0.05625,
          "Left": 0.428125,
          "Top": 0.40833333
        },
        "Confidence": 99.975174,
        "Landmarks": [
          {
            "X": 0.4452057,
            "Y": 0.4395594,
            "Type": "eyeLeft"
          },
          {
            "X": 0.46340984,
            "Y": 0.43744427,
            "Type": "eyeRight"
          },
          {
            "X": 0.45960626,
            "Y": 0.4526856,
            "Type": "nose"
          },
          {
            "X": 0.44958648,
            "Y": 0.4696949,
            "Type": "mouthLeft"
          },
          {
            "X": 0.46409217,
            "Y": 0.46704912,
            "Type": "mouthRight"
          }
        ],
        "Pose": {
          "Pitch": 2.9691637,
          "Roll": -6.8904796,
          "Yaw": 23.84388
        },
        "Quality": {
          "Brightness": 40.592964,
          "Sharpness": 96.09616
        }
      },
      "MatchedFaces": [
        {
          "Similarity": 88.863960,
          "Face": {
            "BoundingBox": {
              "Height": 0.557692,
              "Width": 0.749838,
              "Left": 0.103426,
              "Top": 0.206731
            },
            "FaceId": "ed1b560f-d6af-5158-989a-ff586c931545",
            "Confidence": 99.999201,
            "ImageId": "70e09693-2114-57e1-807c-50b6d61fa4dc",
            "ExternalImageId": "nick.jpeg"
          }
        }
      ]
    }
  ]
}

ストリームから取得したこうした JSON ドキュメントを処理する AWS Lambda 関数を設定します。Rekognition Video は店舗内で特定した顔情報のみでなく、検出したすべての顔情報を通知します。この情報はあなたの店舗でのショッピングエクスペリエンスをさらに拡張するために使用できます。客が店に滞在する時間はどの程度か? 客が特定の陳列棚を見る時間はどの程度か? 客が店舗の入り口から店内の陳列棚へ移動していくうえで、その流れの順調さはどの程度か?

Rekognition Video の結果にはまた、サービスで検出された顔情報のいずれかが、顔情報コレクションのものと一致するかどうかも表示されます。Lambda 関数はこの情報を使用して、AWS IoT にトピックを発行します。店員にはこのトピックにサブスクライブしたタブレットが提供されています。  ストア内で既知の客が検出されるとすぐに、タブレットには店員が素晴らしいサービスを提供するために使用できる関連情報の取得を開始することができます。

まとめ

ユーザーのユースケースがどのようなものであれ、Kinesis Video Streams と Rekognition Video を使ったリアルタイムの顔情報認識は、セットアップが容易で、高価なハードウェアを必要としません。ここで構築されたシステム自体はサーバーレスで、Rekognition Video は AWS Free Tier に含まれます。この投稿を読みながら実際にソリューションを構築された場合は、不要なコストが発生しないように作成したアイテムを削除するのをお忘れなく。特に次の点をご確認ください。

  • Rekognition Stream プロセッサを停止および削除する
  • Kinesis Video Stream を削除する
  • Kinesis Data Stream を削除する
  • Lambda 関数を削除する
  • Lambda 関数と Stream プロセッサ用の IAM ロールを削除する
  • Raspberry Pi がアクセス用に使用する IAM ユーザーを削除する

同時に、Amazon Kinesis または Amazon Rekognition については AWS ウェブサイトで詳しくご覧になれます。


今回のブログ投稿者について

Nick Corbett は、AWS プロフェッショナルサービスのシニアコンサルタントです。彼は、お客様と連携し、ビッグデータプロジェクトをリードすることにより、AWS を使用して価値を生み出すまでの時間を短縮するお手伝いをしています。余暇にはユルゲン・クロップの大活躍を追っています。