顔認証用のC++アプリケーションを開発しています。まず、顔を検出して画像を前処理する必要があります。
次に、別のHaar分類子を使用して各目を見つけることはできません(目は非常に簡単に見つけることができます)。次に、その人に2つの目があり、目が水平であることを意味する「レベル」の顔を定義します。
2つの目の間の角度を測定し、その角度で画像を回転させるだけです。
angle = atan ( eye1.Y - eye2.Y ) / (eye1.X - eye2.X )
与えられた画像で目の正確な位置を見つけることは簡単ではありません。 OpenCVで目を見つけるためのHaarカスケードは、有用ではないほど多くの偽陽性を生成します。さらに、このアプローチは画像の回転に対してロバストではありません(ただし、わずかな回転を補正する可能性がありますが、トレーニング画像はわかりません)。もし私があなたなら、この研究分野の関連論文を http://scholar.google.com で幅優先探索を開始します。
顔画像を位置合わせするには、堅牢な頭のポーズの推定が必要です。私は自分でいくつかの調査を行いましたが、アルゴリズムとコードを共有することはここで役立つと思います。私が見た中で最も興味深いアプローチは次のとおりです。
Gary B. Huang 、 Vidit Jain 、および Erik Learned-Miller 。 複雑な画像の教師なし共同アライメント。コンピュータビジョン国際会議(ICCV)、2007年。 (プロジェクトページ) 、- (PDFオンライン利用可能) 、 (ソースコード)
X。朱 、 D。ラマナン 。 野生の顔検出、ポーズ推定、ランドマークのローカリゼーションコンピュータビジョンとパターン認識(CVPR)プロビデンス、ロードアイランド、2012年6月。 (プロジェクトページ) 、 (PDFオンライン利用可能) 、 (ソースコード)
WildプロジェクトページのLabeledFacesから次の顔の位置合わせコードを試しました。それは本当にうまく機能し、顔の特徴点を検出する必要はありません。 C++コードは次の場所からダウンロードできます: http://vis-www.cs.umass.edu/faceAlignment/
それでも顔の要点を見つけたい場合は、Viola-Jones検出器はあまり堅牢で正確ではないことがわかります。個人的には、Flandmark顔キーポイント検出器を使用することをお勧めします: http://cmp.felk.cvut.cz/~uricamic/flandmark/ これははるかに堅牢で正確です。 Cコードは上記サイトからダウンロードできます。
顔の位置合わせのための最先端のアプローチは次のようにする必要があります:
教師あり降下法とその顔の位置合わせへの適用X.XiongおよびF.De la Torre in CVPR 2013
それは非常に高速で効果的です。あなたは彼らのプロジェクトのウェブサイトをチェックすることができます IntraFace 。
それらは使いやすいソフトウェアを提供します。 ただし、コアパーツコード、つまり教師あり降下法(SDM)はリリースされていません、それは単純です簡単に実装できる線形回帰。
傾斜した顔を処理できることを示すデモはこちらです(プライバシーの問題については、ぼかしを追加し、左上隅の軸に注意してください): https://drive.google.com/file/d/0BztytuqPViMoTG9QaEpZWi1NMGc/edit?usp = Sharing
ずれた顔を検出すると、顔認識が困難になります。位置合わせを修正したい場合もあれば、正しく位置合わせされていないものを除外するだけで十分な場合もあります(たとえば、ビデオストリームで顔を検出している場合)。私は後者のアプローチを採用し、特別なHaar Cascadeをトレーニングして、正しく位置合わせされた明るい顔のみを検出しました。詳細はこちら: http://rwoodley.org/?p=417 。
私のカスケードを使用する場合は、それがどのように機能するかを教えてください。他の人がどのような結果を得るのか興味があります。それは私のニーズを満たしました。
ここでは、OpenCVとDLibを使用して実装しました: https://github.com/ManuBN786/Face-Alignment-using-Dlib-OpenCV
傾斜した面は、私のコードを使用して位置合わせできます。
これを実現するアルゴリズムを一日中検索したところ、Hemlata et al。による「 顔の特徴と傾斜した顔の傾斜角度を見つけることによる顔検出 」が見つかりました。 GoogleからDuckDuckGoに切り替えた後。 45度を超える角度で傾斜した面をサポートします。
コードで実装する方法に関しては、それは私が現在取り組んでいる別の問題ですが、少なくともこれは出発点です。
顔認証の場合、 dlib または face_recognition を使用してこれを行うことができます。これは、現在opencvよりも非常に便利で正確です。
Dlibに関しては、顔の位置合わせはここにあります(C++コード) http://dlib.net/face_alignment.py.html
またはここ(pythonコード) https://www.pyimagesearch.com/2017/05/22/face-alignment-with-opencv-and-python/ 。
ローカルバイナリ機能の回帰による3000 FPSでの顔の位置合わせ という名前のアルゴリズムペーパーは、dlibによって実現されます。