この記事では、。 顔認識とは何か、顔検出とはどう違うのかを知ることができます。 顔認識の理論について簡単に説明した後、コーディングのセクションに進みます。
- 顔検出とは
- 顔認識とは
- 画像やWebカメラのライブ映像から顔を認識する顔認識プログラムを作成することができるようになります。
- Pythonを使った顔認識
- ウェブカメラフィードから顔を認識する
- 画像から顔を認識する
顔検出とは?
コンピュータビジョンにおいて、我々が解明しようとしている一つの本質的問題は、画像中のオブジェクトを人間の介入なしに自動的に検出することである。 顔検出もそのような問題と考えることができ、画像中の人間の顔を検出します。 人間の顔には多少の違いはあっても、全体的に見れば、どの人間の顔にも共通する特徴があるといってよいでしょう。 顔検出のアルゴリズムはいろいろありますが、Viola-Jonesアルゴリズムは最も古い手法の1つで、現在でも使われているので、この記事の後半で同じものを使用します。 この記事の最後にリンクしておきますので、この記事を読み終えたら、Viola-Jones Algorithm を調べてみてください。
顔検出は通常、顔認識や検証など、多くの顔関連技術への最初のステップとなります。 しかし、顔検出は非常に有用なアプリケーションを持つことができる。 顔検出の最も成功したアプリケーションは、おそらく写真撮影でしょう。 友人の写真を撮るとき、デジタル カメラに組み込まれた顔検出アルゴリズムが、顔の位置を検出し、それに応じて焦点を調整します。
顔検出だけのチュートリアルはこちら
顔認識とは何ですか?
さて、顔を検出するアルゴリズムを作ることに成功しましたが、誰の顔なのかも認識できるのでしょうか?
顔認識は、個人の顔を使用して識別または識別を行う方法です。 顔認識にはさまざまなアルゴリズムがありますが、その精度にはばらつきがあります。
では、ディープラーニングを使ってどのように顔を認識するのかについて説明します。 顔をベクトルに変換する顔埋め込みを利用するのですが、この手法をディープメトリック学習と呼びます。
顔の検出。 最初に行う作業は、画像やビデオストリームから顔を検出することです。 顔の正確な位置/座標がわかったので、次にこの顔を抽出して、さらに処理を進めます。 画像から顔を切り出したので、そこから特徴を抽出する。 ここでは、顔の特徴を抽出するために、顔の埋め込みを利用する。 ニューラルネットワークは、人の顔の画像を入力として受け取り、顔の最も重要な特徴を表すベクトルを出力する。 機械学習では、このベクトルをエンベッディングと呼びますので、これを顔面エンベッディングと呼びます。 さて、これがどのように異なる人物の顔を認識するのに役立っているのでしょうか?
ニューラルネットワークの学習では、似ている顔には似たベクトルを出力するよう学習させます。 例えば、異なる時間軸で複数の顔の画像があった場合、もちろん顔の特徴の一部は変わるかもしれませんが、それほど大きくは変わりません。 この場合、顔のベクトルは似ている、つまり、ベクトル空間において非常に近いということになります。 下図を参照してください。
ここで、ネットワークの学習後、ネットワークは同じ人の顔(似ている)に対して互いに近い(似ている)ベクトルを出力するように学習するようになりました。 上記のベクトルは次のように変換されます:
このようなネットワークを学習させるには、かなりの量のデータと計算パワーが必要なため、ここでは学習させないことにします。 ここでは、Davis King が約 300 万の画像のデータセットで学習させた、事前学習済みのネットワークを使用することにします。 このネットワークは顔の最も重要な特徴を表す 128 の数値のベクトルを出力する。
さて、このネットワークの動作がわかったところで、このネットワークを私たちのデータでどのように使用するかを見てみよう。 私たちのデータにあるすべての画像をこの事前学習されたネットワークに渡して、それぞれの埋め込みを取得し、次のステップのためにこれらの埋め込みをファイルに保存しておきます。 さて、データにあるすべての顔の埋め込みがファイルに保存されているので、次のステップは、データにない新しいT画像を認識することである。 そこで、まず、先ほどと同じネットワークを使って画像の顔埋め込みを計算し、この埋め込みと残りの埋め込みを比較します。
そこで、2つの画像を渡し、一方はウラジミール・プーチン、他方はジョージ・W・ブッシュの画像としました。 上の例では、プーチンのembeddingsは保存されていませんでしたが、ブッシュのembeddingsは保存されていました。 このように、2つの新しい埋め込みを既存のものと比較すると、ブッシュのベクトルは他のブッシュの顔の埋め込みに近いのに対し、プーチンの顔の埋め込みは他の埋め込みに近くないため、プログラムは彼を認識できません。
Python による顔認識
このセクションでは、OpenCV と Pythonを使って顔認識を実装することにします。 まず、必要なライブラリとそのインストール方法を確認します。
- OpenCV
- dlib
- Face_recognition
OpenCV は画像およびビデオ処理ライブラリで、顔検出、ナンバープレート読み取り、写真編集、高度なロボットビジョン、光学文字認識などの画像およびビデオ分析に使用されています。
Davis King によって保守されている dlib ライブラリには、実際の認識処理に使用する顔の埋め込みを構築するために使用する、「ディープ メトリック ラーニング」の実装が含まれています。 face_recognition をインストールする前に、dlib ライブラリを最初にインストールすることを忘れないでください。
OpenCV をインストールするには、コマンド プロンプトで
pip install opencv-python
Windows で dlib をインストールする方法をいろいろ試しましたが、その中で最も簡単だったのは Anaconda を使った方法です。 まず、Anacondaをインストールし(インストール方法はこちら)、コマンドプロンプトで次のコマンドを使用します:
conda install -c conda-forge dlib
次にface_recognitionをインストールするには、コマンドプロンプトで
pip install face_recognition
これですべての依存関係をインストールできたので、コーディングを開始しましょう。 1つはデータセットを受け取り、dlibを使用して各顔のembeddingを抽出するファイルです。
次のファイルでは、既存の画像内の顔認識と顔を比較し、次に同じことを行いますが、ライブ ウェブカメラ フィード内の顔を認識します。 次に、データセットをファイルを作成するのと同じフォルダに保存します。
「face_enc」という名前のファイルに埋め込みを保存したので、これを使用して画像またはライブ ビデオ ストリームで顔を認識することができます。
Face Recognition in Live webcam Feed
以下は、ライブ ウェブカメラ フィードで顔を認識するスクリプトです:
上の例では顔を検出するのに haar カスケードを使用しましたが、 face_recognition も使用することができます。face_locationsを使って顔を検出することもできます。
画像中の顔認識
画像中の顔を検出し認識するスクリプトは、上で見たものとほぼ同じものです。 自分で試してみて、もしできなかったら、以下のコードを見てください:
Output:
顔認識について学んだところで、この記事の終わりを迎えることにします。 Great learning academyでは、様々なコースを無料で受講することができます。 詳しくは下のバナーをクリック
Great LearningのPGP人工知能・機械学習コースでスキルアップすることも可能です。 このコースでは、業界のリーダーから指導を受け、リアルタイムで業界に関連するプロジェクトに取り組む機会も得られます。
Further Reading
- Face Detection using Viola-Jones Algorithm
リアルタイム顔検出 | OpenCVによる顔マスク検出
- Real-time Object Detection Using TensorFlow
YOLO object detection using OpenCV Pytorchにおけるオブジェクト検出 | オブジェクト検出とは何か?