Amazon Web Services ブログ

Amazon Kinesis Video Streams および Amazon AI サービスを使用した注意とエンゲージメントを測定するためのボディーランゲージの自動分析の構築

この記事は、Ned T. Sahin 博士 (Brain Power LLC およびハーバード大学)、Runpeng Liu (Brain Power LLC および MIT)、Joseph Salisbury 博士 (Brain Power LLC) と Lillian Bu (Brain Power LLC および MIT) によるゲストブログです。

広告からゲーム、そして教材に及ぶコンテンツの作成者は通常、事後アンケートやテスト、またはクリックスルーやバウンスなどのユーザーアクションによってコンテンツが成功したかどうかを判断します。これらの手法では、コンテンツの作成者が測定したいもの、つまりコンテンツの知覚価値が、客観的、遅発的、略式、事後、および/または相対的な代用物になりがちです。このようなメトリクスは、視聴者がその場で示すボディーランゲージに含まれる可能性がある視聴者の経時的な注意、エンゲージメント、そして快楽に関する継続的で意味のあるデータを見逃します。しかし、ボディーランゲージを数値化する、またはしばしば圧倒的な量になるビデオのデータセット内のパターンや重要なジェスチャーを単一のメトリックに要約するための系統的な手法はありません。

私たちは、落ち着きのない動き (fidgeting) や、その他の身体の動作を行動バイオマーカーとして数値的に要約するために、「Fidgetology」と親しみをこめて呼ばれる手法を発明しました。私たちは当初、自閉症および/または ADHD を持つ子供の拡張現実感システムを使用した後での症状の改善における新しい臨床的評価指標として、これらの子供たちの臨床試験ビデオを分析するために Brain Power (www.Brain-Power.com) で Fidgetology を発明しました。このブログ記事では、より一般化されたアーキテクチャと、目的に応じてすぐに試してみることができるサンプルコードをご提供します。これは、例えばあなたのコンテンツを閲覧している人のビデオなどで身体の動作を自動的に分析するために、アマゾンから新しくリリースされた人工知能製品を使用します。この手法は、映画、広告、テレビ番組、ビデオゲーム、政治運動、スピーチ、オンラインコース、または教室での授業など、様々なコンテンツタイプに応用できます。

この手法を使用することで、視聴者のビデオをストリームまたはアップロードして、視聴者の動作のレベルとパターンのわかりやすい数学的プロットとシングルイメージのサマリーを即座に取得することができます。これらの動作は、注意、焦点、エンゲージメント、不安、または快楽などの要因を推定するために役立ちます。また、これらの要因を確認して分離したり、ユニークなユースケースおよび/または個々のユーザーのためにカスタマイズしたりするために、高度な AWS Lambda 関数や機械学習モデルを追加することもお勧めします。

仕組み

システムアーキテクチャダイアグラム

Kinesis Video Streams インジェスチョン

ビデオストリームを作成するクライアントウェブアプリケーションは、ユーザーが 1) 事前に録画されたビデオをアップロードする、および/または 2) ウェブカムフィードを Amazon Kinesis Video Streams にライブでストリーミングすることを可能にします。このウェブカムストリーミング機能は、WebRTC   getUserMedia API によって補完されており、iOS モバイルを除いたすべての主要ブラウザとプラットフォームでサポートされています。

ブラウザアプリを使用する理由:AWS DeepLens などの IoT デバイスからビデオをストリーミングしたり、Kinesis Video Streams の Android プロデューサー SDK を使用してカスタムモバイルアプリを構築したりすることももちろん可能ですが、どのブラウザでも起動できるシンプルなクロスプラットフォームのウェブアプリなら誰もがより簡単に使用できます。

静的ビデオ (Amazon S3 アップロード経由)、またはウェブカムのバッファされたフレーム (Amazon API Gateway リクエスト経由) がウェブアプリによってアップロードされると、Kinesis Video Streams に対するクラウドプロキシレイヤーとして機能する AWS Lambda 関数がそれらをストリーム可能なメディアフラグメントに変換します。これらのメディアフラグメントは、次に Kinesis Video Stream に置かれます。

なお、Kinesis Video Streams のプロデューサー SDK は現在 JavaScript/ウェブブラウザ用には提供されていないため、私たちは AWS クラウド内のストリーミング機能を再現するための次善策をいくつか検討し、最終的に完全なサーバーレスソリューションを追求することに決めました。また、ストリーム変換を処理する WebRTC サーバーとして、カスタム Amazon Machine Image (AMI) をプロビジョニングすることも考えられます。この代替策はおそらく最高パフォーマンスと最低遅延を実現しますが、ここで紹介するサーバーレスアーキテクチャという観点からは外れてしまいます。

事前録画されたビデオのアップロード:

ブラウザウェブカムからのストリーミング

以下は、Amazon Kinesis Video Streams コンソールへのウェブカムストリーミングの比較例です。ウェブカムアプリのライブフィード (左) と、これらのフレームが Kinesis Video Streams コンソールで再生される (右) まで時間差は約 5 秒です。


Amazon Rekognition Video – ストリームプロセッサ

次のステップは、フルスピードのビデオで人を自動的に検知し、その動作をリアルタイムで追跡することです。私たちは、Rekognition ストリームプロセッサを使用して、Amazon Rekognition Video (イメージ内のオブジェクトと人を追跡するための、AWS の Amazon Rekognition 深層学習ツールセットの新しいビデオ対応バージョン) へのインプットとして Kinesis Video Stream をフィードしました。

全体的な目的は数種類の身体の動作を分析することですが、今回 Amazon Rekognition Video は顔に焦点を当てます。これは、目、鼻、および口角などの顔のランドマークの経時的な位置、顔のポリゴン、そして顔の回転を含む豊富な顔データをビデオストリームから提供します。これらの raw レコードは、Kinesis Data Stream にパブリッシュされます。

動作分析

新しいレコードがこの raw データストリームに表示されると、AWS Lambda 関数として実装されている動作分析アルゴリズムがトリガーされます。これは、注意とエンゲージメントを測る特徴として使用できる回転/並進運動速度などの一連のビデオフレーム内の顔における興味深い導出メトリクスのコンピューティングを行います。処理されたメトリクスは、次にダウンストリームアプリケーションとウェブダッシュボードによる取り込みのために別の Kinesis Data Stream にパブリッシュされます。

メトリクスの可視化

このプロジェクトでは、処理された Kinesis Data Stream から身体の動作のメトリクスを直接取り込み、ストリーミングチャートの可視化としてそれらをほとんどリアルタイムでレンダリングするダッシュボードアプリ (ビデオストリーミングアプリと同じインターフェイス内) を提供します。もちろん、システムアーキテクチャダイアグラムで図示されている通り、複数のクライアントとダウンストリームアプリケーションによる処理済メトリクスのスケーラブルな取り込みを可能にするため、Amazon API Gateway エンドポイントで処理されたデータストリームをフロントにすることも検討できます。

お試しください

AWS CloudFormation を使用したデプロイメント

このプロジェクトは、AWS CloudFormation新規スタック用の変更セットとして使用して全体をデプロイすることができます (まずサーバーレスアプリケーション変換をテンプレート定義に適用する必要があります)。設定オプションと AWS のリソースコンポーネント、およびカスタムコマンドラインデプロイメントオプションについては、本プロジェクトの GitHub リポジトリをご覧ください。

まず、このボタンを使ってスタック作成プロセスを開始します。

ステップ 1.[次へ] を選択し、[スタックの名前] と [変更セット名] の両方に brain-power-fidgetology-demo を指定します。すべてのデフォルトパラメーターを受け入れて、[次へ] を選択します。

ステップ 2.もう一度 [次へ] を選択して、最後の確認ページに移動します。Capabilities で新しい IAM リソースが作成されることを承認します。次に [変更セットの作成] を選択します。

ステップ 3.次のページで、スタックが「Computing changes」を完了するまで待ちます。次に [実行] (ページの右上隅) を選択してスタックのデプロイメントを開始します。確認してから CloudFormation ページをリフレッシュし、新しく作成されたスタックを見つけます。これを選択して、デプロイメントプロセスを監視します。これは 3 分以内で終わるはずです。

 

ステップ 4.デプロイメントが完了したら、出力にリストされている WebAppSecureURL リンクにアクセスしてウェブアプリのデモを起動します。

デフォルトで、CloudFormation テンプレートがプロジェクトに必要なすべての AWS リソース (Kinesis Video Stream、Amazon Rekognition ストリームプロセッサ、Kinesis Data Streams、サーバーレス Lambda 関数、および API Gateway エンドポイント) を作成します。これは、ダッシュボードウェブアプリケーションを Amazon S3 バケットにコピーし、ウェブアプリへのアクセスのためのセキュア URL (API Gateway がフロントとなります) を出力します。

ウェブカムのライブストリームのテスト

ウェブアプリを開いたら、[Stream Webcam] ボタンを選択して、カメラにアクセスすることをアプリに許可します。次に、外部にリンクされたボタンに従って、別のブラウザウィンドウに Kinesis Video Streams ウェブコンソールを開きます。

Kinesis Video Streams コンソールでの適切な同期を確実にするため、[プロデューサーのタイムスタンプ] を選択します。数秒の遅延後、Kinesis Video Streams コンソールにウェブカムのライブフィードが再生されるはずです。

 

ライブストリーミングが上手く機能しているかどうかについてご意見をお聞かせください!再生遅延を改善する方法に関する提案については、プロジェクトの GitHub リポジトリを参照してください。

動作分析 Lambda 関数のカスタマイズ

ここでは、皆さんにお使いいただける基本的な動作分析関数をご提供します。この関数は、連続するフレーム内の顔の回転および並進運動速度を推定します。このようなメトリクスを使用して、身体の動作パターンに基づいた注意とエンゲージメントの測定のための特徴セットを構築できます。

私たちは、自閉症および ADHD に関する特定のユースケースのために、そして社外の臨床試験をサポートするサービスとして、追加の高度なメトリクスを使って実験を行いました。これらは、医療研究ジャーナルで発表されることになってます。

brain-power-fidgetology-demo-StreamAnalyzer.js

const aws = require('aws-sdk'); 
aws.config.update({ region: process.env.AWS_REGION }); 
const kinesis = new aws.Kinesis(); 
 
// This function is triggered when new raw records are available 
// from the output of Rekognition stream processor. 
// For data specification, see: https://docs.aws.amazon.com/rekognition/latest/dg/streaming-video-kinesis-output.html 
exports.handler = (event, context, callback) => { 
    var records = event.Records; 
    records.forEach((record) => { 
        // Kinesis data is base64 encoded so decode here 
        const payload = new Buffer(record.kinesis.data, 'base64').toString('ascii'); 
        var data = JSON.parse(payload); 
        record.data = data; 
    }); 
    // Filter for records that contain a detected face. 
    var faceRecords = records.filter((record) => { 
        return record.data.FaceSearchResponse && record.data.FaceSearchResponse.length; 
    }); 
    if (faceRecords.length < 2) { 
        return callback(null, `Not enough records to process.`); 
    } 
    // Do post-processing on detected faces. 
    faceRecords.forEach((record, index) => { 
        var detectedFace = record.data.FaceSearchResponse[0].DetectedFace; 
        detectedFace.RecordIndex = index; 
        processDetectedFace(detectedFace, record.data.InputInformation.KinesisVideo); 
    }); 
 
    // Estimate rotational and translational velocities 
    // of faces in successive frames using basic first-order derivative approximation. 
    var previousFace = faceRecords[0].data.FaceSearchResponse[0].DetectedFace; 
    faceRecords.forEach((faceRecord, index) => { 
      var currentFace = faceRecord.data.FaceSearchResponse[0].DetectedFace; 
      var deltaTime = currentFace.Timestamp - previousFace.Timestamp; 
      if (deltaTime === 0) return; 
      var deltaPosition = Math.sqrt( 
        Math.pow(currentFace.BoundingBox.Center[0] - previousFace.BoundingBox.Center[0], 2) +  
        Math.pow(currentFace.BoundingBox.Center[1] - previousFace.BoundingBox.Center[1], 2) 
      ); 
      var faceLength = Math.sqrt(Math.pow(currentFace.BoundingBox.Height, 2) + Math.pow(currentFace.BoundingBox.Width, 2));
      currentFace.TranslationalVelocity = (deltaPosition / faceLength) / deltaTime; 
      var deltaRotation = Math.sqrt( 
        Math.pow(currentFace.Pose.Pitch - previousFace.Pose.Pitch, 2) +  
        Math.pow(currentFace.Pose.Roll  - previousFace.Pose.Roll,  2) + 
        Math.pow(currentFace.Pose.Yaw   - previousFace.Pose.Yaw,   2) 
      ); 
      currentFace.RotationalVelocity = deltaRotation / deltaTime; 
      previousFace = currentFace;
    }); 
    
    faceRecords.shift();
     
    putRecordsIntoProcessedStream(faceRecords).then(function() { 
        var firstFace = faceRecords[0]; 
        var lastFace = faceRecords[faceRecords.length - 1]; 
        console.log(`Processed ${faceRecords.length} face records. Start: ${firstFace.data.FaceSearchResponse[0].DetectedFace.Timestamp}; End: ${lastFace.data.FaceSearchResponse[0].DetectedFace.Timestamp}`); 
        callback(null, `Processing complete.`); 
    }).catch(callback); 
}; 
 
// Computes the position of face center based on BoundingBox data. 
// Modify for custom use case. 
function processDetectedFace(face, inputInfo) { 
    var centerX = face.BoundingBox.Left + face.BoundingBox.Width / 2; 
    var centerY = face.BoundingBox.Top + face.BoundingBox.Height / 2; 
    face.BoundingBox.Center = [centerX, centerY]; 
    face.Timestamp = Math.min(inputInfo.ProducerTimestamp + inputInfo.FrameOffsetInSeconds, inputInfo.ProducerTimestamp + face.RecordIndex);
} 
 
// Put processed body motion metrics into downstream KDS 
function putRecordsIntoProcessedStream(records) { 
    var packagedRecords = records.map((record) => { 
        return { 
            Data: JSON.stringify(record.data), 
            PartitionKey: 'shard-0' 
        }; 
    }); 
    return new Promise(function(resolve, reject) { 
        kinesis.putRecords({ 
            Records: packagedRecords, 
            StreamName: process.env.KDS_PROCESSED_STREAM_NAME 
        }, function(err, data) { 
            return err ? reject(err) : resolve(data); 
        }); 
    }); 
} 

独自のユースケースのためにこのストリーム処理関数をカスタマイズするには、AWS Lambda コンソールにアクセスして、このプロジェクトスタックに関連する brain-power-fidgetology-demo-StreamAnalyzer 関数を見つけてください。

この関数は、プロジェクトの GitHub リポジトリをクローンし、CloudFormation テンプレートを再パッケージ化してスタックを更新する手順に従うことによって変更することもできます。

本アーキテクチャの拡張または改善箇所

Amazon Kinesis Data Analytics (AI) または Amazon SageMaker (ML) の統合

興味深いと考えられるものには、Amazon Rekognition ビデオストリームプロセッサの raw 出力を取り込む、教師なし異常検知機能を備えた Kinesis Data Analytics アプリケーションを構築する可能性があります。これにより、1 秒未満の処理遅延でアラートをリアルタイムに作成でき、この即時的なフィードバックは、苦痛の合図に直ちに対応する可能性を提供します。臨床試験という観点において、医師は治療を処方するときに、患者の反応と、それに対する準備度を評価するために、このフィードバック機能を活用することができます。ゲーム、広告、またはスピーチという観点においては、コンテンツへの視聴者のエンゲージメントが失われることを予測する兆候が驚きの要素をトリガーできます。

複数の身体の追跡

brain-power-fidgetology-demo-StreamAnalyzer 関数を変更して、ビデオフィード内での複数の顔/身体の追跡を可能にすることもできます。Amazon Rekognition Video は、ビデオストリーム内で複数の個人を検知し、誰の個人認識情報も必要とすることなく、それぞれに固有の ID を割り当てます。この機能を活用して、多人数のグループ (教室または映画上映など) での複数の身体の動作パターンを測定し、部屋の中の全体的なエンゲージメントを測定することができます。

例を挙げると、教師は、レッスンプランの品質または成功度を評価する、または集中力に欠けており、より多くのサポートが必要となるかもしれない生徒を見つけることに役立てるために、このようなフィードバックを使用することができます。広告作成者は、そのコンテンツまたは製品に対する平均的な関心度、そして時間全体、多様なグループのメンバー全体、および/またはその他コンテンツとの比較した場合における関心の一貫性さえも要約する単一のスナップショットを生成することができます。

さらに、集団の中の各メンバーの細かい表情、つまり微表情に基づいた分析とは異なり、Brain Power の Fidgetology 分析は、顔それぞれを分析するために必要な非常にきめ細かな詳細と十分な照明がないカメラフィードに基づいて実行することができます。これにより、カメラのハードウェアおよびストレージ/ストリーミング帯域幅の妥当な制約を考えると、追跡がはるかに簡単になります。

プライバシー

単一人物の分析と同様に、この手法は集団の中のどの顔の個人認識情報も明らかにすることなく実行でき、個人認識情報を明らかにするために必要なカメラ解像度での集団の調査も必要ありません。これは、コンテンツに対する集合体および個人レベルでの注意、焦点、および快楽を推測しながら、視聴者の個人のプライバシーを守ることを可能にします。

追加の改善箇所

このアーキテクチャを拡張するためのアイデアは、付随する Github リポジトリの Potential Improvements セクションで説明されています。

BRAIN POWER のユースケース – 背景

これまでは、新しい手法と共に、この手法の幅広い導入のきっかけとするためのコードと汎用例を紹介してきました。以下は、自閉症および/または ADHD を持つ子供における注意の行動信号を測定し、訓練するというこの手法の当初の応用例です。

この背景として、アメリカでは 350 万の人々が自閉症を持ち、驚くことに、子供の 11 パーセントが ADHD を持っています。これらの人々の多くが注意と集中という点で苦労しています。作業中でさえも、他人の気を散らさせ、不注意を示唆する行動と兆候が多くの人に見られ、学校、職場、そして恋愛関係での成功を妨げています。私たちは、他の人との交流をゲーム化し、視線を合わること、会話、移行の成功、感情の解読などに対してポイントを与える神経科学ベースの拡張現実感システムを開発しました。

以前私たちは、これが自閉症および/または ADHD と診断された子供と大人において耐容性が良く、興味をそそるものであり、かつ実行可能であること、そして安全学校での使用が望ましいものであることを証明する臨床試験を発表しました。また、自閉症ADHD の確立された権威ある臨床基準に基づいて、このシステムがそれらの症状を改善したことも証明しました。

しかし、臨床試験セッションのビデオでは参加者がシステムを使ったときと使わなかったときに大きな違いがあり、これは視覚的には明白ではあったものの、それを数値化できる方法はありませんでした。これが、ここで紹介した Fidgetology 手法の考案につながりました。

BRAIN POWER のユースケース – 結果例

私たちは、臨床試験セッションのひとつのビデオ録画から 2 つの 比較セグメントを抽出し、それらを本ブログ記事で説明した Fidgetology 分析ストリームを通じて投入しました。すべての実験は Asentral Inc (治験審査委員会) による審査および承認を受けており、イメージとビデオの公開については親権者からの同意を得ています。

リアルタイムでの Fidgetology 分析: 自閉症のために Brain Power の AR システムを使用する子供

リアルタイムでの Fidgetology 分析: 自閉症のために Brain Power の AR システムを使用していない子供

上記の例はどちらも、臨床参加者は参加者が好むトピックについて母親と会話をしており、カメラは母親の肩越しに録画しています。ここで報告されている Fidget 指数は、経時的な顔のピッチ、ヨウ、およびロール回転における平均的な変化として計算されています。

グラフが表しているように、計算された顔の回転速度は、子供が Brain Power ソフトウェア (この場合、Google Glass ヘッドセットで実行) を使用している時間全体において安定しており、かつ第 1 しきい値を下回っていますが、ヘッドセットを装着していない間は多数のしきい値間隔を振動しています。これらの数値的結果は、シングルイメージのサマリーに一致しており (画像ぶれの量)、子供が拡張現実感システムを使用しているときの「活発状態」中におけるビデオ内での動作の数値的減少が容易に観測できます。

このような情報は、子供に興味を持たせ、集中力を増してそれを示す動機を与えることにおけるヘッドセットとゲームコンテンツの有益性を評価するために、従来の多動性測定値と組み合わせる、またはそれを補完することができます。

現行のアマゾンのツールセットのため、現時点では顔しか追跡できないとう制限があり、他の身体的側面の落ち着きのない動きを見逃していることと、顔が検知できないときの最も劇的な動きの一部を失っていることも述べておきます。このため、この顔ベースの指標は対照条件における全身の動作を過小評価する結果となっています。他の指標もすでに考案していますが、それぞれには独自のメリットがあります。私たちは、さらなる探究を奨励しています。Brain-Power.com/research/fidgetology で、ぜひあなたの見解をお聞かせください。

本ブログ記事で説明したバージョンの Fidgetology 手法から得たサマリーメトリクスの例。結果として得たシングルイメージのサマリーは、4D 以上のとなることも考えられる非常に大きなデータセットの、小型ファイルサイズのダイジェスト可能なデータです。グラフは、経時的な身体/顔の動き、空間、および回転位置の範囲とパターンのいくつかを簡潔に表しています。

まとめ

ブラウザからのウェブカムフィードを Amazon Kinesis Video Streams と Amazon Rekognition Video にストリーミングするためのウェブアプリケーションと、それに伴うサーバーレスアーキテクチャについて提供しました。身体動作のメトリクスは、その後最小限の遅延でウェブアプリ内で可視化できます。

Brain Power はこうして問題行動医療のための新しいバイオマーカーと臨床的評価指標に向けて「Fidgetology」を開発しました。このブログ記事では、コンテンツに対する反応における視聴者のボディーランゲージを素早くかつ数値的に要約する方法を紹介しています。これは、映画、広告、テレビ番組、ビデオゲーム、政治運動、スピーチ、オンラインコース、または教室での授業などのエンゲージメントと快楽の素早い推定など、さまざまなビジネスユースケースに応用できます。

謝辞

Brain Power は、アマゾン ウェブ サービスプロフェッショナルサービスチームの Bob Strahan が提供してくださったすべての励ましと援助について、Bob に心から感謝しています。

また、コミュニティの他の人々を助ける取り組みにおいて私たちの研究に参加してくださったすべての家族にも厚く御礼申し上げます。

この研究の一部は、保健対策担当国防次官補室による議会指定医学研究プログラムの自閉症研究プログラムによってサポートされています (award W81XWH-17-1-0449)。

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

Ned Sahin 博士は、Brain Power の創立者です。Sahin 博士は、ウィリアムズ大学、オックスフォード、MIT、およびハーバードで教育を受けた受賞神経科学者であり、ニューロテクノロジー企業家でもあります。数ある肩書の中でも、Sahin 博士は脳に関連する様々な問題を持つ人々に力を与えるために私たちが使用する、ウェアラブル技術の科学的研究と臨床試験のスーパーバイザーを務めました。Fidgetology コンセプトを発明したのは Sahin 博士です。

Runpeng Liu は、Brain Power のリードウェブシステムエンジニアです。Runpeng は、自閉症向けのウェアラブルアプリとクラウド用の分析ソフトウェアをスケールするための Brain Power による AWS テクノロジーの導入を監督しました。彼は、アマゾンの最新サービスを使って Fidgetology コンセプトを実装し、本ブログ記事の技術的な内容のすべてを執筆して、ビジュアルを作成しました。

Joseph (Joey) Salisbury 博士は Brain Power のソフトウェア開発部長および主任研究員で、神経科学の博士号を取得しています。Salisbury 博士の研究では、モバイル/VR/AR ゲームの治療的応用に焦点が当てられています。

Lillian Bu は Brain Power – Amazon リレーションシップのプログラムマネージャーです。Lillian は、新しい Amazon テクノロジーのユースケースの可能性について開発チームとコミュニケーションを取っています。