正確に顔認証させるための試行錯誤

Seungyoun Yi氏:次はサービスの製品化についてお話します。エンジンを最適化したあとに、これを製品化しようと考えました。製品化することは試行錯誤の連続でもあります。例えば、私たちがLINEアプリを作ると想像してください。

デベロッパー、プランナー、デザイナーが一緒になって素晴らしいUI/UXをデザインしてアプリを作っています。顔認証のアプリはどうでしょうか? 様々なメンバーが集まって、この問題をどうやって解決したかを説明していきます。

これは顔認証のコアであるエンジン(Face Engine)のフローチャートです。エンジンは3つのステップで成り立っています。1つ目は顔の検出、2つ目は顔の特徴点の抽出、3つ目は、顔の認識です。これは私の写真です。誰も写真を貸してくれなかったので私の写真を使いました。

(会場笑)

このイベントで使用した Face Sign(顔認証受付システム)は、顔登録と顔認証の2つのフローがあり、それぞれで顔認証に必要なこの3つのステップが組み込まれています。

顔登録では、顔認識のスピードはそれほど重要ではありませんが、イベント当日の顔認証は、ユーザー体験をよくするためスピードが重要になります。

イベント当日は、スピードを重視して顔検出と特徴点抽出はクライアント側で処理していますが、顔認識は精度を重視してサーバー側で処理しています。

顔登録は1枚の静止画を登録しますが、イベント当日は常時撮影しているため、動的フレームに対応する必要があります。クライアント側のデバイスでは、これらの問題にも対処しています。

顔が撮影しやすいようなデバイスの角度・揺れ、常時撮影される動画フレームの処理、複数人を同時に並列処理する方法、取得した顔画像の品質チェックなどあらゆる対応をしています。

例えば、デバイスの角度は、垂直な状態から10度以上倒すと顔の検出がしづらくなります。

また、顔認識に適したフレームの選定も必要です。一定以上のブレがある画像は、そもそも認識できないため、あらかじめ処理から除外します。ここでは画像処理で一般的なOpenCVを使用しています。

また、ブレを抑える方法として、フレームチェックだけでなく、デバイスのジャイロスコープによる補正も利用しています。

サービス開発ではデザインも重要です。

初めは、左のように認証結果として本人の登録画像を表示していました。これはユーザーに間違いなく認証されたことを示して、安心感を与えるためです。しかし、実際のユーザーフィードバックをみてみると、「自分の写真を見ると落ち着かない」「不安になる」という意見が多くありました。

そのため、認証結果の画面から登録画像を無くし、名前とボタンだけが表示されるようにしました。また、プライバシーにも配慮し、名前も頭文字だけを表示するようにしました。

それが、今日体験してもらったものです。

このほかにも、最初のユーザーテストでは、「デバイスが何をしているかわからない」というフィードバックもあったため、顔の検出中、認証中などステータスがわかるような情報も表示するように改善しました。

Faceガイドラインの処理で苦労したこと

スムーズに顔認証ができるよう、顔認証のデバイスには、顔の位置をガイドする枠を用意しました。

枠を用意することで、ユーザーが自然と枠に顔を合わせるようになり、認証に適した顔画像を取得しやすくなります。

また、顔が近すぎたり、遠すぎる場合も認証精度が下がるため、アラート文言を表示し、ガイドに従うようなUXにしました。

このほかに、デバイス画面からはみ出している場合も顔を近づけすぎた場合と同様に、認証精度が下がります。

複数人が写っている場合も注意が必要です。一番大きく写っている顔を認識するようにしました。こうすることで、基本的には、後ろに人が並んでいる場合でもエラーを防ぐことができます。しかし、まれに後ろに写っている人の方が顔が大きく写ってしまう場合もあるため、できるだけ前の人と距離を開けるようなオペレーションにもしました。

また、顔のサイズだけでなく、顔の状態も考慮する必要があります。

正確かつ迅速に顔情報を取得するために、顔の輪郭を検出するラプラシアン法も活用しています。

また、顔が45度傾いたり、回転すると、輪郭などの情報が変化するため、顔の認識精度が低下します。

顔の傾きに関しては、目の中心を線で結び、線の傾きから顔の傾きを判定しました。

アジア人特有の眼を認識するアルゴリズム

また、目が開いているか、閉じているかもチェックしています。目が開いている場合の顔画像を使って認識するようにしています。

参考にした論文では、目の開閉を目元の縦と横の比を使って算出していましたが、実際は少し工夫が必要でした。

アジア人は、西洋人よりも目が切れ長であるため、目元の縦と横の比の変化が小さく、目の開閉をうまく認識できませんでした。今回のイベントはアジア人が多いため、アジア人でも高精度で認識できるように調整する必要もありました。

最近のカメラは高性能になっているため、一般的なものでも300万画素とデータ容量が非常に大きくなっています。そのため、今回は顔認証エンジンで処理できるように100万画素にリサイズしています。また、最終的に抽出された顔の特徴量も、圧縮し、バイナリデータに変換することで、データ通信量を最小化しています。

また、生体認証であるため、サイバーセキュリティチームによるチェックを受けています。事前にユーザー同意を確実に取ったうえで、顔写真はサーバに保持せず、顔の特徴データのみをサーバに送信しています。データ保護のために保管中は暗号化を施し、イベントが終了した後はすみやかにデータ削除するといったデータ管理ポリシーを決めて運用しました。

トライアンドエラーを重ねて処理速度が向上

ネットワークの最適化により、韓国ソウルで行われたバランス・フェスティバル2019で認識速度の向上が認められました。

特に、顔の特徴量をバイナリデータに変換することで、最大1.6倍速くなることが確認できました。

また、バイナリへの変換に加えて、gzipに圧縮することで、最大1.7倍速くなることが確認できました。zipファイルの解凍する必要がありますが、全体の所要時間は結果として減少しました。

そして、すべてを実装したあとに、我々はユーザアクションを最適化する必要がありました。ユーザが遠いときには近寄ってもらうよう、頭が横を向いているときは正面を見てもらうよう、UXをデザインしました。これは私のイメージです。

また、チェックインをするためのボタンを作りましたが、ボタンを設置すると100パーセントそこに触ってしまうため、ボタンは不要と判断しました。また、以前は2画面だったのを1画面にまとめました。

そうすることでユーザを認識する場合にボタンを押したり触ったりしなくても、顔だけで認識ができると考えました。

これらのバーの値は、全て試行錯誤に結果、得られたものです。実施環境ごとに、問題があれば、この値を調整できます。

利便性を高めるために取り組んできたこと

ここまでエンジン開発とサービス開発についてご紹介してきました。まとめに入りたいと思います。

エンジンの最適化では、軽量モデルとして、CNN演算アルゴリズム、浮動小数点 の最適化などによって、より軽量で、より速いモデルを作り、1ミリ秒以下に減らすという改善を行いました。

また、サービスの最適化では、Detect preprocessing と Landmark postprocessing を行いました。また、ユーザが簡単に使えるようにUXの企画開発も行いました。

私たちは、2019年8月に開催したTechTalkというイベントをはじめとして、5つのフィールドテストを実施して改善してきました。

イベントごとにさまざまなユーザーフローを検討しました。1つのボタンを減らすためにも、たくさんのトライアルをしています。

現場のネットワークの状況というのも重要です。0.1秒で安定して認識できるよう、事前に現場でネットワークのスピード遅延も確認しました。

AI のゴールは、エンジン開発だけでなく、サービス開発まで含めて行うことが大切だと思っています。

最後になりますが、今回のイベントで実際に体験していただいた皆さんに、私たちの Face Sign を理解していただけたら嬉しいです。

ご清聴ありがとうございました。

(会場拍手)