2023.1.4

顔認証のDNNに学習させる②

技術

SCROLL DOWN SCROLL DOWN SCROLL DOWN

こんにちは!AIサービス開発室の鈴木生雄です。さて、みなさま年末年始はどのように過ごされたでしょうか。私は、娘と長い時間話すとか、早朝サウナで心身を整えるとか、メルカリで買った古着を繕うとか、とても贅沢な時間を過ごせたと思います。近年、私には休暇の過ごし方で気を付けていることがあります。それは極力シングルタスクで物事をおこなうということです。私が過去に見た印象深いTEDトークにマット・キリングワース「幸せになりたい?目の前のことに集中しましょう」があります。キリングワース氏は目前の事に集中した方が幸福度が上がることを統計的に証明しようと試みています。興味のある方はぜひ視聴してみてください。私はこの論を支持しています。そのため、仕事においてはマルチタスクを駆使してスループットを増やすように努める一方で、生活においてはスループットよりも営み自体を味わうことに重きを置くようにしています。そして、実際その方が幸福度は高いというふうに感じています。おそらく多くの現代人は休暇中であっても、無意識にマルチタスクで物事を行ってしまいがちだと思います。私としては、幸福度を最大化する時間の使い方の要点が「マルチタスクとシングルタスクの使い分け」にあると思います。一つの意見として参考になれば幸いです。

さて、今回は前回の続きで、顔認証をおこなうDNN(Deep Neural Network)に自前のデータを用いて学習させた経緯についてご紹介したいと思います。前回のエントリーでは、顔認証には、顔検出のDNNと特徴量抽出のDNNの二つが必要であること、そして、DNNごとに学習をさせる必要があることを説明しました。今回のエントリーでは、学習用データの準備と学習の実行および結果の評価について、私たちがやったことをご紹介したいと思います。

はじめに

これ以降、顔検出DNNと特徴量抽出DNNのぞれぞれについて、学習データの作成、学習の実行、学習結果の評価の三つの項目に沿って説明していきます。なお、本エントリーの説明で使っている写真は私のプライベートな写真となっていますが、実際には当社の写真旅行の画像379枚 顔24,003個を用いて学習をさせました。学習結果についても同データによるものとなっていますのでご留意ください。

また、(これまでのエントリーもそうですが、)今回のエントリーは実施したことの大雑把な流れを説明するもので、詳細な手順を示すものではありません。その点はご容赦ください。

顔検出DNN

学習データの作成

顔検出DNNの学習データには以下が必要です。

  • 入力画像(顔が写っているスナップ写真)
  • 正解ラベル(アノテーション情報(顔の位置を表す矩形座標と五つの特徴点(右目、左目、鼻、右口尻、左口尻)の座標を記したテキスト)

このうち入力画像の方は(数が少ないという問題はあるものの)集められましたが、それぞれの画像の正解ラベルをどのようにして作るのかが課題となりました。正解ラベルを作るアノテーションという作業は手作業で行うことも可能ですが、データの数が多いとそれだけ工数がかかってしまいます。私たちは現時点でこの作業にそんなに多くの工数はかけられないと考えていたので、どうすれば工数をかけずにアノテーションができるかに頭を悩ませていました。そんな中、InsightFaceの顔検出の推論結果には正解ラベルを作るのに必要なデータが全て含まれていること気付いたため、InsightFaceの推論結果を正解ラベルとして用いる方法を試してみることにしました。要するにInsightFaceを自動アノテーションツールとして利用することにしたのです。結果的には、これによって人手をかけずに正解ラベルを作成することができました。

学習の実行

学習はInsightFaceのREADMEに記載されているとおりに学習データを配置した上で、同じく記載されているとおりにコマンドを実行することで行うことができました。

学習結果の評価

学習結果の評価については、WIDER FACEと呼ばれる顔検出用の公開データセット(画像32,203枚 顔393,703個)を用いることにしました。InsightFaceにはWIDER FACEを用いて評価を行うためのスクリプトが用意されています。これを使うことで評価用のプログラムを書かなくても学習させたAIモデルの精度を計測することができます。今回学習した結果の評価指標は以下のとおりです。下表の数字についてはmAP(顔を漏れなく指摘した時の正解率)となっています。

難易度

現状

目標

Easy

0.9068655470187391

0.95以上

Medium

0.8846172223074247

0.90以上

Hard

0.6996248958487544

0.85以上

学習データの数が少ない割には難易度Easyは0.90というそこそこ高い正解率で検出できているように思いました。今後は、各難易度において、上の表に記載した目標値にまで精度を高めていきたいと考えています。

特徴量抽出DNN

学習データの作成

特徴量抽出DNNの学習データには以下が必要です。

  • 入力画像(人物の顔画像)
  • 正解ラベル(入力画像が誰であるかを示す識別子)

これらのデータを社員旅行のスナップ写真から作成するにあたっては、大きく三つの手順が必要でした。一つ目はスナップ写真から顔画像だけを抽出すること、二つ目は抽出した顔画像を同一人物の顔で分別すること、三つ目は分別した顔画像をフォルダに仕分けして格納することです。このうち三つ目はInsightFaceの学習用スクリプトが求める形に学習データを配置するための手続きというだけで大きな課題ではありません。一つ目と二つ目をどのようにして行うかが課題となりましたが、ここでも顔検出の時と同様にInsightFaceの推論結果を利用することで解決することができました。以降では図を交えながら三つの手順をSTEP1~STEP3として説明していきます。

まずSTEP1として、InsightFaceの顔検出の推論結果を用いて顔画像を抽出します。次にSTEP2-1として、InsightFaceの特徴量抽出の推論結果を用いて各顔ごとの特徴量をデータベース化します。

それから、別画像でも顔検出と顔ごとの特徴量抽出をおこなった上で、STEP2-2として、求めた特徴量をデータベースに保存しておいた特徴量と1:Nで照合していきます。1:N照合した結果の最も高い照合スコアがあらかじめ設定した閾値以上の場合には同一人物として同じ顔IDを割り当てて特徴量とともにデータベースに保存します。逆にそうでない場合は別人物として新たに顔IDを割り当てて特徴量とともにデータベースに保存します。STEP1とSTEP2を顔の数だけ繰り返すことで顔IDで同一の顔をグルーピング可能なデータベースが完成します。

最後にSTEP3として、完成したデータベースを基に、顔写真をフォルダによって同一人物の顔のグループに分別します。

学習の実行

学習に際しては以下の三つの手順を行いました。

  1. InsightFaceのprepare_webface42m.mdに記載されているとおりに学習データを配置した上で、同じところに記載されているコマンドを実行して学習に必要な専用ファイルを生成する
  2. InsightFaceのREADMEに記載されている学習実行用のコマンドを実行する

学習結果の評価

学習結果の評価については、IJBCと呼ばれる顔認証用の公開データセット(顔21,294個)を用いることにしました。InsightFaceにはIJBCを用いて評価を行うためのスクリプトが用意されています。これを使うことで評価用のプログラムを書かなくても学習させたAIモデルの精度を計測することができます。今回学習した結果の評価指標は以下のとおりです。下表の数字についてはFAR(他人受入率)に対応するTAR(本人受入率)となっています。

FAR

0.000001

0.00001

0.0001

0.001

0.01

0.1

現状TAR

0.0141637

0.0306284

0.0665746

0.149103

0.322186

0.616199

目標TAR

0.90以上

FAR(他人受入率)は他人を誤って本人と判定してしまう割合です。一方、TAR(本人受入率)は本人を正しく本人と判定する割合です。照合スコアの閾値をどの程度にするかによってFARとTARは変動します。例えば、シビアに照合すると他人を本人と間違えることが少なくなる一方で、本人を本人と正しく判定することも少なくなってしまうという具合です。私たちはFARが0.0001の際に、TARが0.90になるまでAIモデルの精度を高めたいと考えています。現状では0.0665476ということで程遠い状況ではありますが、まだ1stトライしたばかりですので、めげずに頑張りたいと思います。

まとめ

前回エントリーおよび本エントリーではInsightFaceのDNNに自前のデータを用いて学習させるためにやったことを記しました。InsightFaceの学習済モデルは実用可能なレベルの精度が出せることは分かっているので、後は自前データを用いてその精度にどれだけ近づけられるかをこれからデータの数を増やすなどしてトライしていきたいと思います。高品質なデータを大量に準備できるかが勝負になると思っていますが、現時点ではどのようなデータをどの程度揃えればよいかもよくわかっていないのが正直なところです。先日NECのフェローの方が書かれた顔認証の教科書を読んだところ、同じ人物について1時間以上も写真を撮影したという記載がありました。それくらい、いろんな表情や角度の顔画像が必要になるのかもしれません。暗中模索が続いてはいますが、確実に知見は蓄積できているという実感もあります。当社では自分たちが企画したアプリケーションに組み込めるレベルを目指して、引き続き顔認証AIの開発を進めていきます。