口と目の位置/座標があると仮定して、2次元画像で基本的な顔の位置合わせを行うにはどうすればよいですか。
画像の顔の位置合わせを修正するために実装できるアルゴリズムはありますか?
口と目の位置/座標があると仮定して、2次元画像で基本的な顔の位置合わせを行うにはどうすればよいですか。
画像の顔の位置合わせを修正するために実装できるアルゴリズムはありますか?
顔(または画像)の位置合わせとは、ある画像(またはこの場合は顔)を別の画像(または参照画像/顔)に対して位置合わせすることです。画像レジストレーションとも呼ばれます。これは、外観(強度ベースの登録)またはキーポイントの場所(機能ベースの登録)のいずれかを使用して行うことができます。2番目のカテゴリは、一方の画像がもう一方の画像の置き換えられたバージョンと見なされる画像モーションモデルに由来します。
あなたの場合、ランドマークの場所(目と鼻の3ポイント?)は、機能ベースの簡単な登録のための優れたリファレンスセットを提供します。両方の2D画像に一連の点の位置があり、相似変換(回転、平行移動、スケーリング)、つまりにマッピングされる平面2D変換を推定できるx_1
と仮定します。さらに反射を追加することもできますが、顔の場合、これはおそらく不要です。 x_2
S
x_1
x_2
推定は、正規方程式を作成し、x_1 = Sx_2
線形回帰を使用してシステムの線形最小二乗(LS)問題を解くことによって実行できます。5つの未知のパラメーター(2つの回転、2つの平行移動、1つのスケーリング)の場合、5つの方程式を解くために3つのポイント(正確には2.5)が必要になります。上記のLSの解は、直接線形変換(SVDまたは行列の疑似逆行列を適用するなど)によって取得できます。参照ポイントの数が十分に多い(つまり、自動的に検出される)場合は、ポイントフィルタリングと不確実性の除去のためのRANSACタイプの方法です(ただし、ここではそうではありません)。
推定後S
、2番目の画像に画像ワーピングを適用して、全体の変換されたグリッド(ピクセル)座標を取得しますimage 2
。変換によってピクセルの位置は変更されますが、外観は変更されません。やむを得ず、の変換された領域の一部はimage 2
のグリッドの外側にありimage 1
、それらのヌル位置の値を決定できます(0、NaNなど)。
詳細については、R。Szeliski、「画像の配置とステッチング:チュートリアル」(セクション4.3「幾何学的登録」)
OpenCVでは、「幾何学的画像変換」を参照してください。たとえばcv::getRotationMatrix2D
cv::getAffineTransform
、cv::warpAffine.
角度と形状を保持するために、相似変換(アフィンの特殊なケース)を推定して適用する必要があることに注意してください。
顔の場合、特徴点には多くのばらつきがあります。したがって、アフィン変換だけではすべての特徴点を完全に適合させることはできません。すべてのポイントを完全に位置合わせする唯一の方法は、ポイントを指定して画像をワープすることです。基本的に、ポイントを指定して画像の三角測量を実行し、各三角形のアフィンワープを実行して、すべてのポイントが位置合わせされたワープ画像を取得できます。
顔検出は、目の位置だけに基づいて処理できます。
ここで、OpenCV、Dlib、およびMTCNNは、顔と目を検出することを提供します。さらに、これはPythonベースのフレームワークですが、deepfaceはこれらのメソッドをラップし、すぐに使用できる検出および位置合わせ機能を提供します。
detectFace関数は、バックグラウンドでそれぞれ検出と位置合わせを適用します。
#!pip install deepface
from deepface import DeepFace
backends = ['opencv', 'ssd', 'dlib', 'mtcnn']
DeepFace.detectFace("img.jpg", detector_backend = backends[0])
さらに、検出と位置合わせを手動で適用できます。
from deepface.commons import functions
img = functions.load_image("img.jpg")
backends = ['opencv', 'ssd', 'dlib', 'mtcnn']
detected_face = functions.detect_face(img = img, detector_backend = backends[3])
plt.imshow(detected_face)
aligned_face = functions.align_face(img = img, detector_backend = backends[3])
plt.imshow(aligned_face)
processed_img = functions.detect_face(img = aligned_face, detector_backend = backends[3])
plt.imshow(processed_img)
OpenCVの顔認識ガイドに顔画像の位置合わせのセクションがあります。
スクリプトは、与えられた画像を目の位置に合わせます。Pythonで書かれていますが、他の言語に簡単に翻訳できるはずです。Sorin MironによるC#の実装を知っています。