顔認識API


概要

MBSハッカソン2016というイベントに出て、その時に「林家Pay」というWebアプリを作った。

「林家Pay」は、テレビに写った芸人さんを「面白いな」と思ったときに、視聴者がスマホのボタンを押すだけで、芸人さんに簡単に寄付ができるというものである。 この機能を実現するためには、テレビで流れる動画について「どの時刻にどの芸人が画面に写っていたか」を分析し、それと「どの時刻に何円寄付されたか」という情報を照合する事で、「どの芸人に何円寄付されたか」を計算すればよい。

このAPIは、「動画のどの時刻にどの芸人が画面に写っていたか」を検出するAPIである。 動画をアップロードすると、「どの時刻に誰が画面に写っていたか」を一秒刻みで検出し、JSON形式で返却する。

構成

全体的にAWSのサービスを用いて構築されている。

これを作ったときにはServerless Frameworkのことを知らなかったので、各種サービスの連携などは手動で行った。

動作の解説

まず、事前にS3に解析対象の動画をアップロードしておく。これによりAWS Lambda起動のトリガが走る。 Lambdaは、動画を1秒ごとにキャプチャし、生成された画像をAWS Rekognitionに投げ、顔を検出して顔のIDを取得する。 この時、AWS Rekognitionにはその顔が自動で登録される。 また、この顔IDと、その顔が映っていた時刻をDynamoDBに記録しておく。

次に、WebAPIを叩き、「顔のグループ化」を行なう。 「顔のグループ化」とは、つまり同一人物の顔にタグをつけるということである。

顔が既に登録されている状態のAWS Rekognitionに顔IDを投げると、その顔IDに近い顔の顔IDを取得することができる。 この処理をすべての顔IDについて行なうと、顔IDをNodeとしたグラフを作成することができ、近い顔ID同士の間にはEdgeを引くことができる。 こうして生成されたグラフに対してクラスタリングを行なうことで、顔IDを分類することができる。 そして最後に、顔IDのグループに1から順番に番号を振り、その番号をDynamoDBに記録する。

最後に、WebAPIを叩き、「どの時刻に誰が映っているか」という情報を取得する。 これは単にDynamoDBからデータを取得し、それを少し整形してJSONにして返しているだけである。