FaceNetで顔認識

1 min読了の目安(約1500字TECH技術記事

この記事ではFaceNetアルゴリズムの簡単な説明と、簡単な顔認識プログラムを載せています。

1.顔検出と顔認識の違い

まずはじめに顔検出と顔認識について説明。ごっちゃにしてる人が多いので。

顔検出(Face Detection)

顔検出とは、「顔の位置を検出する技術」のことです。つまり、画像内から顔を見つけ出す技術のこと。顔検出を使用すると、自撮りやポートレートの装飾、ユーザーの写真からのアバターの生成などのタスクに必要な情報を取得できます。

顔認識(Face Recognition)

顔認識は、「たくさんある顔画像の中から特定の人間の顔を認識する技術」のことです。スマホのロックや企業セキュリティー、写真アプリの人物検索などに使われています。
「顔認識」は通常「顔検出」とともに用いられることがほとんどです。

2.FaceNetとは

FaceNetは2015年にGoogleが発表した顔認証用のニューラルネットワークです。
顔の画像がから、顔の特徴量を抽出し、顔の埋め込みと呼ばれるこれらの特徴の128要素のベクトル表現を予測するシステムです。

論文は こちら

3.仕組み

FaceNetはSiameseNetworkをベースにしてあり、入力画像がどのクラスに属するかではなく、
画像同士の距離を学習します。

クラス分類で顔認識をする場合、一人一人の画像を大量に収集して学習する必要があります。
さらに、認識したい人が増えた場合は、再学習が必要です。
その一方、Siamese Networkのように画像間の距離を算出する場合は、その距離により2つの顔画像が同一人物かどうかを判断できるので少ない画像で判別が可能です。

つまり、FaceNetを使えば画像が1枚でも顔認識判定が可能で、そのような学習タスクをOne Shot Learningと呼びます。

4.Triplet Loss

FaceNetは、Triplet Lossと呼ばれる特定の損失関数を採用しています。Triplet Lossは、同じIDの画像間のL2距離を最小化し、異なる人物の顔画像間のL2距離を最大化します。

5.試してみる

Google Colabに実装したコードと実行結果を載せています。(コード汚いのは許して)

6.参照