AWS

AWS Rekognition で初めての画像解析(人物判定)してみた

sekky

最近はモバイルアプリ開発に打ち込んでいる sekky です。
今回は 9 月に行われた合宿でシングルボードコンピュータを利用したハッカソンをやるチームだったので、その中で利用した AWS Rekognition を利用した人物判定を取り上げたいと思います。

AWS Rekognition とは?

AWS が提供する機械学習を使用した画像認識とビデオ分析を自動化するためのサービスです。
画像・映像解析ライブラリを利用することでボード上でも実現できる機能ではありますが、AWS Rekognition を利用することで画像解析ライブラリの仕様等を知らなくてもやりたいことベースで機能を構築することができます。

AWS Rekognition は画像データからの人物(顔)の検出、判定のみならず、画像からの視線の分析、映像からの人物の動線検出、テキスト分析をはじめとする画像、映像の解析に関する様々な機能を持っています。

作ろうとしたもの

ハッカソンメンバーでアイディア出しをした際に、私は中々良いアイディアが出なかったのですが、ボードに接続するカメラモジュールで写真撮って顔判定した上で、特定の誰かを検出したら何らかのアラートを出す仕組みとか面白そうじゃない?というアイディアが上がりました。

そのアイディアを頂いた形ですが、せっかくなので AWS サービスと組み合わせて作ったら面白そうということで、AWS IoT Core を利用して画像を送信し、AWS Rekognition で顔検出、判定を行う仕組みを作ることにしました。

人物判定の大きな流れ

今回は画像データを用いて、顔の登録と検出・判定を行いました。

  1. 顔の登録

    • AWS Rekognition 上に顔の属性データを登録するコレクション作成 (CreateCollection)
      最初に、顔の属性データを登録するコレクションを作成します。判定時はこのコレクションから検索します。
    • 画像データ上の顔の検出 (DetectFaces)
      画像データを AWS Rekognition に読み込ませ、映り込んだ顔の数などを解析します。今回は、AWS IoT 経由で送信した画像を S3 に格納し、EventBridge をトリガーとして起動する Lambda から Rekognition の API を利用しました。
      画像上に複数の顔が映り込んでいると、次の工程で払い出す顔 ID とユーザーの関連付けが煩雑になるため、今回は 1 つだけ検出した場合に次の処理を行うようにしました。
    • 検出した顔のコレクションへの登録 (IndexFaces)
      顔の属性データをコレクションに登録し、識別するための ID を払い出します。
    • ID の登録 (DynamoDB を利用しました)
      払出した ID と、それが誰の顔なのかを関連付ける情報(名前など)を登録します。ここを登録する仕組みも作りたかったのですが、今回は手作業で関連づけを行いました。
  2. 顔の検出・判定

    • 画像データ上の顔の検出 (DetectFaces)
      前述の仕組みと同じ仕組みで画像データ上の顔の検出を行います。複数の顔が含まれていても検出はできますが、画像上の顔の位置等を利用した ID との関連付けが煩雑化しそうなので、今回は 1 つだけ検出した場合に次の処理を行うようにしました。
    • コレクション内の検索 (SearchFacesByImage)
      画像データを利用してコレクション内を検索し、類似する顔の ID を返します。あくまで「類似する」顔の ID です。どの程度一致しているかは Similarity として返されます。
    • ID に対応する名前の取得 (DynamoDB を利用しました)
      ID では誰なのか分からないため、事前に登録した情報を取得します。

今回は準備時間の都合上、実際に作ったものは顔の検出・判定を行った際に、未登録の顔 ID を片っ端からコレクションに登録する仕組みとしてしまったのですが、事前に登録しておいた上での一致率を見る仕組みとすることも簡単にできそうです。

file

Rekognition の良いところ

  • 非常に簡単
    私は画像解析に携わったことはまるでなかったのですが、その道に詳しくなくとも顔判定の仕組みを簡単に構築できました。
  • 多少粗い画像でも OK
    今回は 800x600 の jpeg データと、現代にしてはかなり粗めの画像にせざるを得なかったのですが、思った以上に顔を検出しました。
  • 顔検出の精度が高い
    前述の通り、粗めの画像だったのですが、画像に映った顔が正面でなくても、また、一部が隠れていても顔として検出しました。角度が違う顔データを検索した場合、Similarity は下がりますが、それでも十分な精度だと感じました。
    合宿場のオープンスペースでデモを動かした際は、検出しようとしたメンバーから 5M くらい離れた場所でほぼ横向きで作業していた別のメンバーを顔として検出してしまうほどでした。
  • 解析が速い
    今回構築した仕組みは、IoT 経由で S3 に格納した画像をトリガーに Lambda を起動して Rekognition の解析を行い、判定結果を IoT 経由でデバイスに返す仕組みとしましたが、Lambda は 300ms 前後で検出、検索を行えていました。
    デバイスでの写真撮影から IoT 経由で送信して、デバイスに判定結果が返ってくるまでおよそ 2〜3 秒ほどで返ってきていました。
    他の画像解析ライブラリを使用したことはないので比較はできないのですが、待たされる感覚はなく、非常に高速であると感じました。
  • 端末のスペックに依存しない
    大部分で AWS を利用しているので当然ですが、端末の役割は写真撮影と送信、あとは結果を受信するだけになります。利用したボードは OpenCV 等の解析ライブラリを動かすことも十分に可能な性能を持っていましたが、IoT や Rekognition を利用する形であれば、もっと性能の低いマシンでも同じことを実現可能だと思います。

苦労した点や反省点

  • 画像サイズが大きすぎると IoT のペイロードサイズに収まらない
    Rekognition ではないのですが、画像サイズが大きいと IoT MQTT で送信できない問題に直面しました。撮影時の画像サイズを 800x600 に抑えることで 128KB に収まるようにしました。
  • 全ての画像データを送信する仕組みとしてしまった
    今回は、数秒間隔で撮影した画像データを毎回 AWS に送信し解析する形としたため、その分の利用料が発生する形になってしまいました。顔検出までをマシン上で行った上で送信するデータを選別すれば AWS 利用料を抑えつつ、ボードに搭載された CPU 性能を活かす形にできたのではないかと反省しています。

終わりに

今時は顔認証もスマホ端末上で行えてしまう時代ですが、画像からの顔の検出や、検出した顔同士の比較などが行えるので Rekognition は面白いサービスです。
これ以外にも様々な画像、映像の解析が行えるサービスなので機会を見て他の機能も試してみたいと思います。

AUTHOR
sekky
sekky
記事URLをコピーしました