デジタル画像中の人間の顔を識別することは、生体認証やヘルスケアからビデオ監視やセキュリティに至るまで、様々な用途があります。心理学的側面では、顔の識別は、人間が視覚的なシーンで顔を見つけ、注目するプロセスです。
顔検出は物体クラス検出の特殊なケースと考えることができます。信頼できる方法論は、固有顔【多変量解析のひとつである主成分分析の手法を顔画像に当てはめたもの】の技術と遺伝的アルゴリズムに基づいています。
この記事では、単に基本的な技術をお伝えするのではなく、最新の研究やプロジェクトから効率的な顔認識アルゴリズム(オープンソース)をいくつかご紹介します。
【タイトルをクリックすると、関連するWebサイトが開きます(一部を除く)】
15. FaceMatch
これはFacebookの顔認識機能のラッパーです。現時点ではかなり基本的なもので、改良が必要です。
このプログラムは、Facebookに写真をアップロードすると/photos/tagging/recognitionエンドポイントを呼び出します。Facebook APIを使ってプライベートな写真をアップロードし、アップロード者の情報を使ってブラウザをシミュレートしてエンドポイントを呼び出します。
14. Face Everthing
これは、Github【世界中の人々が自分の作品(プログラムコードやデザインデータなど)を保存、公開できるようにしたWebサービス】上の多くのプロジェクトに基づいた顔検出、位置合わせ、認識、再構成です。作成者の目標は最先端の顔システムを開発することですが、現在のところ再構成は利用できず、コードも完全ではないようです。
13. Fisherfaces
スクリプトで得られた固有顔
Fisherfacesは、前処理、特徴抽出、分類器、交差検証を備えたPython用の顔認識フレームワークを実装しています。基本的には、動画(Webカメラフィードなど)の顔認識モデルを測定、保存、ロードすることができます。また、オプションでモデルを検証して、期待できるパフォーマンスを確認することもできます。オプションでk-Fold Cross Validation【k分割交差検証】を実行し、モデルの精度を推定します。
12. Real Time Face Recognition
Real Time Face Recognitionのアルゴリズムは、TensorFlow、OpenCV、MTCNN、Facenetに基づいています。顔の読み取りはOpenCV2、顔の埋め込みはFacenet、検出はMTCNN、認識は分類器によります。主となるアイデアはOpenFaceにインスパイアされています。しかし、作成者はコードを書くのにPythonを選びました。
11. Android Face Recognition with Deep Learning
これは、数多くの顔認識技術を詰め込んだAndroidライブラリです。コードはTensorFlow、FaceNet、LIBSVM、Caffeから派生しています。
ライブラリに写真を渡して学習・分類することもできるし、すでに写真から特徴量が得られている場合は、特別なフラグを「true」に設定して特徴ベクトルを一緒に渡すこともできます。
10. DeepID Test
Webfaceデータセット(plumチーム)とDeepIDネットワーク(Tang Xiaoaoチーム)を用いて、Caffeによりモデルパラメータを学習し、顔検出の精度はLFW(labeled faces in the wildの略、顔画像データセット)分類により実施されています。
顔認識の原理は、顔画像データセット内でラベル付けされた顔から、50%が同じ画像、残りの50%が異なる画像である6,000組の画像を抽出することです。次に、対応する2つの画像を良いモデル入力として学習し、2つの160ビット次元特徴ベクトルを得ます。最後に、6,000コサイン距離またはユークリッド距離を求め、閾値を選択することにより、より高い顔精度を生成するのです。
9. Node FaceNet
これはNode.js用のTensorFlowに裏打ちされたFaceNetの実装で、顔の検証、認識、クラスタリングの問題を解決するためのものです。このスクリプトは、写真からコンパクトなユークリッド空間へのマッピングを直接学習します。
このスクリプトは、顔1つにつき128バイトしか使用せずに顔認識性能を最適化し、LFWデータセットで99.63%の精度を達成しました。
8. SphereFace
これは SphereFace(顔認識のためのディープハイパースフィア埋め込み)の実装です。このリポジトリは、SphereFaceを使った深い顔認識のためのパイプライン全体(すべての前処理)で構成されています。認識パイプラインには、顔検出、位置合わせ、認識の3つの重要なステップが含まれます。
この技術は、CNN(畳み込みニューラルネットワーク)に角度識別特徴を学習させるA-Softmax(角度ソフトマックス)損失を提案します。幾何学的には、角度ソフトマックス損失は、超球多様体に識別制約を課していると見なすことができ、これは画像もまた多様体上にあるという事前設定と本質的に一致します。
これは、MegaFaceチャレンジにおいて、小規模な学習セットプロトコルの下で最先端の検証性能を達成します。
7. Deep Face Recognition with Caffe Implementation
このアルゴリズムは、深層顔認識のために開発されており、深層顔認識の識別特徴学習アプローチに関連しています。
このモデルは、顔認識タスクのための中心損失として知られる新しい監視信号に基づいています。中心損失は、各クラスの深層特徴の中心を学習すると同時に、深層特徴とその対応するクラス中心との間の距離にペナルティを与えます。
提案する中心損失関数は、畳み込みニューラルネットワークにおいて最適化が容易です。ソフトマックス損失と中心損失の両方の監視下で、畳み込みニューラルネットワークは、2つの主要な学習目標、つまり顔認識にとって非常に重要なクラス内のコンパクトさと可能な限りのクラス間の分散を達成するために深い特徴を取得するように学習することができます。
6. FaceRecognition in ARKit
このスクリプトは、Vision APIを使って顔を検出し、抽出した顔を、CoreMLモデルを通して人物を識別します。このスクリプトを実行するには、Xcode 9、iPhone 6s(または新しいもの)、機械学習モデルが必要です。
作成者は、Nvidia DIGITSを使ってAWSでモデルを学習させ、各人物の画像を数百枚撮影し、顔を抽出しました。異なる顔を持つ別の「不明」カテゴリーがあります。顔認識には、事前に学習され、微調整されたモデルが使用されています。
5. Facial Recognition API for Python and Command Line
このモデルは、ディープラーニングで開発されたDlibの最先端の顔識別を使用しています。LFWベンチマークでラベル付けされた顔に対して99.38%の精度があります。シンプルなface_recognitionコマンドラインツールを使えば、画像フォルダに対して顔認識を行うことができます。さらに、このライブラリは他のPythonライブラリと一緒に使うことで、リアルタイムの顔認識を行うことができます。
4. Face recognition using Tensorflow
文献『FaceNet』【文献は英語です】で紹介されているTensorFlowを使った顔識別の実装です。深層顔認識のための識別特徴学習法の現象も利用しています。
ソースコードはOpenFaceの実装を参考にしています。学習にはCASIA-WebFaceとMS-Celeb-1Mの2つのデータセットを使用し、それぞれ0.987と0.992のLFW精度を得ました。
3. Joint Face Detection and Alignment
制約のない環境での顔の検出と位置合わせは、様々な照度、ポーズ、オクルージョン【手前にある物体が後ろにある物体を隠す状態】により、非常に難しいことです。しかし、ディープラーニング技術の助けを借りれば、素晴らしい結果を得ることができるのです。
このプロジェクトでは、ディープカスケード・マルチタスクフレームワークを使用し、検出と位置合わせの間の固有の相関関係を利用して性能を向上させます。顔とランドマークの位置を予測するために、3段階の深層畳み込みネットワークを持つカスケードアーキテクチャを利用します。
また、作成者らは、実際の性能をさらに向上させるマイニングアプローチを導入しています。この技術は、顔検出のための困難なWIDER FACEベンチマークと、顔位置合わせのためのAFLWベンチマークにおいて、最先端の方法論よりも優れた精度を達成しています。
2. OpenBR
これは、オープンな(クローズドも)アルゴリズムの開発と再現可能な評価をサポートする共通の生体認証フレームワークです。既存のアルゴリズムを改良したり、新しいモダリティを探求したり、認識性能を測定したり、自動化された生体認証システムを展開したりするために使用できます。
このフレームワークには、学習、顔認識、性別推定、年齢推定のアルゴリズムが含まれています。Mac OSX、Windows、Linuxを含むすべての主要プラットフォームでサポートされています。
1. OpenFace
OpenFaceは、ディープニューラルネットワークによる顔識別のTorchとPythonによる実装で、FaceNetをベースにしています。Torchにより、CPUまたはCUDAでネットワークを実行できます。
単一の入力に対するワークフローは以下の通りです。
・OpenCVやDlibで事前に学習させたモデルを用いて顔を検出する。
・ニューラルネットワーク用に顔を変換する。
・ディープニューラルネットワークを用いて、128ビット次元の単位超球面上に顔を表現する。
・クラスタリングまたは分類法を適用し、完全な識別を行う。