こんにちは!AIサービス開発室の鈴木生雄です。12月にもなるとさすがに寒さが厳しくなってきますね。私は四季のある日本に生まれて本当によかったなと思います。なぜならば、旬の物を食べたり、気候に合った装いをしたり、季節に応じた生活を楽しめるからです。冬の寒さは得意ではありませんが、スーパーに行って里芋や春菊が出てきたなという発見をしたり、今日は気温が低いから厚手のコートにブーツを合わせようと考えたりするのはやはりとても楽しいです。人の暮らしを楽しくするためのサービスを開発していくわけですから、そのためにも自分自身の生活を楽しむことも忘れないでいようと思います。
さて、今回は久しぶりに技術のエントリーとして、顔認証のDNN(Deep Neural Network)に自前のデータを用いて学習させた経緯についてご紹介したいと思います。以前の投稿「顔を照合する」では、InsightFaceという顔分析用のOSSツールを用いて顔照合を試した結果をお伝えしていました。その際にはInsightFaceで提供されている学習済AIモデルを用いていました。しかし、InsightFaceで提供されている学習済AIモデルは商用目的での利用がライセンス上で認められていませんので、このままでは自社のサービスに組み込んで使うことができません。そのため、今回は自前データでInsightFaceのDNNを学習させることにしたというわけです。
ところで、顔認証のDNNに自前データを学習させるためには、次のようなステップが必要です。
- 顔認証の仕組みについて理解する
- 顔認証を担うDNNの学習に必要な学習用データについて理解する
- 学習用データを準備(収集・加工)する
- 学習をおこない結果を評価する
一つのエントリーでこの全てを記載すると長くなってしまうため、本エントリーでは1.と2.について記載することにします。
用語について
本エントリーには、顔検出や顔照合、顔認証という用語が出てきますがそれぞれ以下の意味で使います。
- 顔検出 … 任意の画像から顔の位置を特定すること。
- 顔照合 … 登録済の顔(登録画像という)と照合先の顔(照合画像という)が同一人物であるかを判定すること。
- 顔認証 … 顔検出した結果を用いて顔照合すること。
顔認証の仕組み
最初に顔認証の仕組みについて説明します。顔認証は大別すると①顔検出、②特徴量抽出、③顔照合という三つの機能によって構成されます。
第一の機能である顔検出は、登録画像や照合画像に写っている顔を探し出し、顔の位置を特定します。第二の機能である特徴量抽出は、登録画像や照合画像に写っているバラエティに富む個人の顔の違いを数値列として取り出します。この数値列を「特徴量」と言います。画像を画像のままコンピュータが扱うと「同一人物か否かの判定」に多大な時間を要してしまいます。そのため情報量を圧縮し判定を容易にするために、顔画像を数値データとして特徴量に置き換えるのです。第三の機能である顔照合は、照合画像から抽出された特徴量と、登録画像から抽出された特徴量を比較して、同一人物であるか否かを最終判定します。特徴量同士の比較結果は照合スコアと呼ばれ0~100%で表現されます。照合スコアが何点以上ならば同一人物と判定するかはシステムの特性に合わせて人間が決定すべきことです。
顔認証を担うDNN
前述の顔認証を構成する機能のうち、顔検出と特徴量抽出をDNNが担っています。すなわち、顔検出のDNNと特徴量抽出のDNNの二つが存在しているということですので、それぞれのDNNに対して学習用データを準備する必要があります。
顔検出に必要なデータ
顔検出に必要なデータは顔が写っているスナップ写真とそれに対応するアノテーション情報(顔の位置を表す矩形座標と五つの特徴点(右目、左目、鼻、右口尻、左口尻)の座標を記したテキストのこと)のセットです。もちろんこのデータのセットはできるだけ多い数があった方がよいです。今回はInsightFaceが提供する学習用プログラムを実行することによってDNNを学習するため、スナップ写真の配置場所とアノテーション情報は同プログラムが求める形にする必要があります。ちなみに、これらの点を含む実行手順はInsightFaceのREADMEに記載されているのですが、私たちにとっては記載がシンプル過ぎて試行錯誤が必要でした。
特徴量抽出に必要なデータ
特徴量抽出に必要なデータは同一人物の顔画像複数枚とそれが誰であるかを示す識別子のセットです。なぜ特徴量を抽出するのに誰であるかを示す識別子が必要になるかというと、同一人物を特定するために意味のある特徴量だけを選択できるようにするためです。例えば、表情や顔の向きといった特徴に関わらず同一人物を特定するためには、どんな表情であってもどこを向いていても同じ人物だと判定するための拠り所となる正解ラベルが必要です。つまり、ここでいう誰であるかを示す識別子は正解ラベルの意味を持ちます。もちろんこのデータのセットはできるだけ多くの人物についてあった方がよいです。ちなみに、これらの点を含む実行手順は、顔検出の際と同様に、InsightFaceのREADMEに記載されているのですが、やはり読み解くのが難解でした。ソースコードやサンプルデータを見ながら、Try&Errorで何とか動かせるようになったというところです。
まとめ
本エントリーでは、顔認証のDNNに学習させるための事前知識について説明しました。顔認証をおこなうために複数のDNNが連携していること、そして、それぞれのDNNを学習させるためにはDNNごとに異なる学習用データを準備しなければならないことがわかりました。次回のエントリーでは学習用データの準備と学習の実行および結果の評価について、私たちがやったことをご紹介したいと思います。ぜひ楽しみにしていてください。