ホームページ  >  記事  >  バックエンド開発  >  PythonでOpenCVで顔認証を実装した例を詳しく解説

PythonでOpenCVで顔認証を実装した例を詳しく解説

Y2J
Y2Jオリジナル
2017-04-27 11:27:244899ブラウズ

この記事では、opencvを使用してPythonで顔認識を実装することに関する関連情報を主に紹介します。非常に良い基準値を持っています。以下のエディターで見てみましょう

主な手順は次のとおりです:

1. 顔検出

2. 収集された顔からトレーニングします。機械学習アルゴリズム

4. 顔認識

5. 仕上げ作業

Haarベースの顔検出器の基本的な考え方は、顔の前面のほとんどの領域では、目の領域が額や頬よりも暗く、口が頬よりも暗くなければならない場合があります。通常、これらの比較を約 20 回実行して、検出されたオブジェクトが顔であるかどうかを判断します (実際には数千回実行されることもよくあります)。 LBP ベースの顔検出器の基本的な考え方は Haar ベースの顔検出器と似ていますが、エッジ、コーナー、平らな領域のヒストグラムなど、ピクセルの明るさのヒストグラムを比較します。

これら 2 つの顔検出器は、大きな画像セットをトレーニングすることで顔を検出できます。これらの画像セットは、後で使用できるように opencv の XML ファイルに保存されます。

これらのカスケード分類検出器は通常、トレーニングに少なくとも 1,000 個の固有の顔画像と 10,000 個の非顔画像を必要とします。トレーニング時間は通常、LBP の場合は数時間、

Haar の場合は 1 週間かかります。

プロジェクトの主要なコードは次のとおりです:

initDetectors
faceCascade.load(faceCascadeFilename);
eyeCascade1.load(eyeCascadeFilename1);
eyeCascade2.load(eyeCascadeFilename2);

initWebcam
videoCapture.open(cameraNumber);

cvtColor(img, gray, CV_BGR2GRAY);
//有需要则缩小图片使检测运行更快,之后要恢复原来大小
resize(gray, inputImg, Size(scaledWidth, scaledHeight));
equalizeHist(inputImg, equalizedImg);
cascade.detectMultiScale(equalizedImg......);

顔の前処理:

実際には、通常、トレーニング (画像収集) 画像とテスト (カメラ画像) の画像は、照明などの影響を受けて大きく異なります。 、人物の顔の向き、表情など)を考慮すると結果が悪くなるため、トレーニングに使用するデータセットが重要です。

顔の前処理の目的は、このような問題を軽減し、顔認識システム全体の信頼性を向上させることです。

顔前処理の最も簡単な形式は、equalizeHist() 関数を使用してヒストグラム均等化を行うことです。これは顔検出ステップと同じです。

実際には、検出アルゴリズムの信頼性を高めるために、顔の特徴検出 (目、鼻、口、眉毛の検出など) が使用されます。このプロジェクトでは目の検出のみを使用します。

OpenCV に付属するトレーニング済みの目検出器を使用します。例えば、正面の顔検出が完了した後、顔を取得し、目検出器を使用して顔の左目領域と右目領域を抽出し、各目領域に対してヒストグラム均等化を実行します。

このステップに含まれる操作は次のとおりです:

1. 幾何学的変換とトリミング

顔を回転して目を水平に保ち、目の間の距離を調整することが非常に重要です。目は常に同じであり、目が常に希望の高さの水平方向の中心になるように顔をパンします。

顔の周囲 (画像の背景、髪、額、耳、顎など) をトリミングします。

2. 顔の左側と右側にそれぞれヒストグラムイコライゼーションを使用します

3. バイラテラルフィルターを使用して画像ノイズを低減します

4. 残りの髪と顔画像の背景を削除します プロジェクトのキーコードは次のとおりです:

detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2,
Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye);
topLeftOfFace = face(Rect(leftX, topY, widthX, heightY));
//在左脸区域内检测左眼
detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols);
//右眼类似,这样眼睛中心点就得到了
leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2);
//再得到两眼的中点,然后计算两眼之间的角度
Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f );
//仿射扭曲(Affine Warping)需要一个仿射矩阵
rot_mat = getRotationMatrix2D(eyesCenter, angle, scale);
//现在可变换人脸来得到检测到的双眼出现在人脸的所需位置
warpAffine(gray, warped, rot_mat, warped.size());

//先对人脸左侧和右侧分开进行直方图均衡
equalizeHist(leftSide, leftSide);
equalizeHist(rightSide, rightSide);
//再合并,这里合并时左侧1/4和右侧1/4直接取像素值,中间的2/4区域像素值通过一定计算进行处理。

//双边滤波
bilateralFilter(warped, filtered, 0, 20.0, 2.0);

//采用椭圆掩码来删除一些区域
filtered.copyTo(dstImg, mask);

顔を収集してトレーニングします: 適切なデータセットには顔の変形のさまざまな状況が含まれている必要があります。これらのバリエーションはさまざまな状況で発生する可能性があります。トレーニングセット。正面顔のみをテストする場合は、トレーニング画像に完全な正面顔があれば十分です。

そのため、優れたトレーニング セットには、多くの実際の状況が含まれている必要があります。

このプロジェクトで収集された画像は少なくとも 1 秒離れており、L2 ノルムに基づく相対誤差評価基準を使用して 2 つの画像のピクセル間の類似性を比較します。

errorL2 = norm(A, B, CV_L2);
similarity = errorL2 / (double)(A.rows * A.cols);
次に、新しい顔を収集するためのしきい値と比較して、この画像を収集するかどうかを決定します。 ミラー化された顔を使用する、ランダムノイズを追加する、顔画像の一部のピクセルを変更する、回転するなど、多くのテクニックを使用してより多くのトレーニングデータを取得できます。

//翻转
flip(preprocessedFace, mirroredFace, 1);

各人に十分な顔画像を収集したら、顔認識に適した機械学習アルゴリズムを選択し、それを使用して収集されたデータを学習し、顔認識システムをトレーニングする必要があります。

顔認識アルゴリズム:

1. フィッシャー顔、PCA (主成分分析) とも呼ばれます

2. LDA (線形判別分析) とも呼ばれます

3. ローカル バイナリ パターン ヒストグラム (LBPH)

その他の顔認識アルゴリズム: www.face-rec.org/algorithms/OpenCV は CV::Algorithm クラスを提供します。このクラスにはいくつかの異なるアルゴリズムがあります。シンプルかつユニバーサルな顔認識は、これらの 1 つで完了できます。 OpenCV の contrib テンプレートには、上記の顔認識アルゴリズムを実装する FaceRecognizer クラスがあります。

initModule_contrib();
model = Algorithm::create<FaceRecognizer>(facerecAlgorithm);

model->train(preprocessedFaces, faceLabels);

このコードは、選択された顔認識のトレーニング アルゴリズム全体を実行します。 顔認識:

1. 顔認識: この人物を顔で識別するには

FaceRecognizer::predict() 関数を呼び出すだけで写真の中の人物を識別できます

int identity = model->predict(preprocessedFace);

それが引き起こす問題は常に特定の人物を予測できます (入力画像がトレーニング セット内の人物に属していない場合でも)。

この問題を解決する方法は、信頼度の基準を設定することです。信頼度が低すぎる場合は、未知の人物であると判断できます。

2. 顔認証: 画像内に探している人物がいるかどうかを確認します

信頼できるかどうか、またはシステムが未知の人物を正しく識別できるかどうかを確認するには、顔認証が必要です。

ここでの信頼度の計算方法は次のとおりです:

固有ベクトルと固有値を使用して顔画像を再構成し、入力画像と再構成された画像を比較します。人物のトレーニング セットに複数の顔画像がある場合、特徴ベクトルと特徴

値を使用した再構成では非常に良好な結果が得られます。そうでない場合は、大きな差が生じ、未知の顔である可能性が示されます。

subspaceProject() 関数は顔画像を特徴空間にマッピングし、subspaceReconstruct() 関数を使用して特徴空間から画像を再構成します。

仕上げ: インタラクティブ GUI

OpenCV 関数を使用して、いくつかのコンポーネントやマウスクリックなどを簡単に描画します。

以上がPythonでOpenCVで顔認証を実装した例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。