12

私の質問を理解するために関連しているように思われるので、私がやろうとしていることを説明します。

私は現在、データベース内の既知の写真に基づいて、カメラの前に足を踏み入れた人の顔認識を試みています。

これらの既知の写真は、識別用のスマートカード(正面の顔の写真が1つだけ含まれている)またはソーシャルネットワークの正面の顔のプロフィール写真から収集されています。私がこれまで読んだことから、良い顔認識のためには、かなりの量のトレーニング画像が必要であるように思われます(50+)。そのため、信頼できるトレーニングセットを作成するために収集した画像は非常に少ないため、代わりにライブカメラフレームキャプチャ(現在150を使用)をトレーニングセットとして使用し、以前に収集した識別済みの写真をテストセットとして使用してみました。私がこれで試していることが正しいかどうかわからないので、私が失敗しているかどうか教えてください。

つまり、問題は、スマートカードから取得した5枚の識別された写真を取得した後、カメラが自分の顔をキャプチャした150フレームをトレーニングセットとして使用して顔認識を実行しようとしたことです。認識しようとすると、5つのテスト面のそれぞれの信頼値が非常に似ており、誰も正確に認識できないため、プログラム全体が役に立たなくなります。多くの場合、トレーニングとしてさまざまなカメラキャプチャを使用すると、自分の写真よりもランダムな人物の写真から高い信頼値が得られます。

私はここで途方に暮れているので、あなたが私に与えることができるどんな助けにも感謝します。

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

注:OpenCV用のJavaCVラッパーを使用してプログラムを作成し、パッケージに含まれているhaarcascadesを使用しています。使用されるアルゴリズムである固有顔。

4

2 に答える 2

27

顔認識

イントロ

これを追加したい。libfacerecは公式のOpenCV2.4.2に含まれています。以下を参照してください。

つまり、OpenCV 2.4.2を使用している場合は、contribモジュールに新しいcv::FaceRecognizerがあります。最近Pythonラッパーが追加されたことを知っています(ありがとうございます!)、おそらくこれを書いている時点ではJavaもラップされています。

cv :: FaceRecognizerには、多くの完全なソースコード例を使用して顔認識を行う方法を示す広範なドキュメントが付属しています。

利用可能な顔認識アルゴリズム(固有顔、フィッシャーフェイス、ローカルバイナリパターンヒストグラム)がどのように機能するかを知りたい場合は、特にOpenCVを使用した顔認識ガイドをお読みください。そこで、アルゴリズムがどのように機能するかを説明し、それらの欠点について説明します。

少ない画像での顔認識

次に、トレーニングデータセットが小さい場合に、顔を認識するという元の問題について説明します。私はあなたに徹底的な答えを書きます、それでそれはおそらくグーグルからここに来る人々を助けるでしょう。

データセットに1人あたりのサンプルが非常に少ない場合は、実際にはEigenfacesとFisherfacesを使用しないでください。これらのモデルが機能するためにはデータが必要です、私はそれを十分に強調することはできません。多いほど良い。これらの方法は、データの分散の推定に基づいているため、モデルを推定するためのデータを提供してください。少し前に、AT&T Facedatabase(facerecフレームワークを使用)で小さなテストを実行しました。これは、1人あたりの画像数を変えた場合のこれらのメソッドのパフォーマンスを示しています。

ここに画像の説明を入力してください

私はここで出版物を書いていませんし、詳細な数学的分析でこれらの数字を裏付けることもしません。これは以前に行われたことがあるので、これらの数値を疑う人は、小さなトレーニングデータセットのPCA(固有顔)とLDA(フィッシャーフェイス)の非常に詳細な分析を確認するために、(2)を調べることをお勧めします。

したがって、私が提案するのは、小さなサンプルシナリオでの顔認識にローカルバイナリパターンヒストグラム(3)を使用することです。これらはOpenCVFaceRecognizerにも含まれており、小さなトレーニングデータセットで非常に優れたパフォーマンスを発揮することが証明されています。これをTanTriggs前処理(4)と組み合わせると、非常に堅牢な顔認識モデルが得られるはずです。TanTriggs前処理はPythonでは8ライナー(またはそれ以上)です。実装についてはhttps://github.com/bytefish/facerec/blob/master/py/facerec/preprocessing.py#L41を参照してください。これはJavaに簡単に適応できるはずです(または、人々が要求した場合は、OpenCVで実装できます)。

文学

  • (1)Belhumeur、PN、Hespanha、J.、およびKriegman、D. Eigenfaces vs. Fisherfaces:クラス固有の線形射影を使用した認識。パターン分析とマシンインテリジェンスに関するIEEEトランザクション19、7(1997)、711–720。
  • (2)Martinez、A and Kak、A. PCA vs LDA IEEE Transactions on Pattern Analysis and Machine Intelligence、Vol。23、No.2、pp.228-233、2001。
  • (3)Ahonen、T.、Hadid、A.、およびPietikainen、M .ローカルバイナリパターンによる顔認識。コンピュータビジョン-ECCV2004(2004)、469–481。
  • (4)Tan、X.、およびTriggs、B.困難な照明条件下での顔認識のための拡張されたローカルテクスチャ機能セット。画像処理に関するIEEEトランザクション19(2010)、1635〜650。
于 2012-07-07T10:27:46.083 に答える
6

知りたいのは、1つのトレーニング画像だけで顔認識を実行する方法です。これは可能ですが、分類するさまざまな人の数によっても異なります。

50以上のトレーニング画像は確かに必要ありません。基本的な顔認識では、顔のスペース(固有顔)を計算するために約50の顔が必要です。おそらくあなたはそれをそれと混同しました。この顔にはさまざまなバリエーションがあることを確認してください(肌の色、眼鏡、形など)。これらの顔は、好きな顔データベースから取得できます。http://www.face-rec.org/には、いくつかのデータベースがリストされており、さまざまなアルゴリズムが説明されています。

あなたがあなたの顔のスペースを計算した後、あなたはあなたが持っているのと同じくらい多くの顔で訓練します。あなたの場合、あなたは1つしか持っていません。分類したい主題の数に応じて、これはすでに機能している可能性があります。

誤った分類が多すぎる場合は、ハイブリッド方式を検討します。ハイブリッド方式は、テンプレートマッチングアルゴリズム(固有顔、フィッシャーフェイス)と機能ベースのアルゴリズムを組み合わせたものです。この場合、最初のアルゴリズムの出力を取得し、目、鼻、眉毛、あごの形などをテスト顔と一致させます。

要するに:

  1. haarcascadesを使用して各画像から顔を抽出します
  2. あなたの顔のスペースを計算します
  3. それぞれの顔のために訓練する
  4. 顔の分類を求める
  5. 最も可能性の高い分類を取り、顔の特徴を確認します

まだ見つけていない場合のために、OpenCVには顔認識ライブラリもあります: https ://github.com/bytefish/libfacerec

編集:私は10〜15個を超えるコンポーネント(固有顔)を使用しません。

于 2012-07-04T08:15:50.317 に答える