顔パーツを選択して置換する
検出した顔パーツをすべて含むよう部分をスワップする例[1]を参考に、目、口などパーツを選択して置換する例を作成しました。Fig1では、右目、左目、口を置換しています。眼が青く、唇ぷるんになっています。
Fig1. 左上:パーツ交換元、左下:交換先、右下:交換後
顔パーツの検出
[1]と同様にdlibという機械学習のライブラリの顔パーツ検出を使用しています。dlibの顔パーツ検出はOne Millisecond Face Alignment with an Ensemble of Regression Trees[2]という回帰で特徴点を検出する方法の実装だそうです。
顔の特徴点を68点で記述したデータセットiBUG 300-W datasetを学習した結果がdlibで提供されています。
Fig2. 特徴点検出結果
パーツを三角形ごとに変形
顔パーツを構成する特徴点から3点ずつ選びパーツを三角形の集合にします。左目なら4つの三角形になります。三角形ごとに対応するAffine変換を求めてパーツを変形します。三角形に分けることでAffine変換のみで画像が変形できます。
Fig3. 三角形の変形
パーツを合成
変形後のパーツを合成します。単純な置き換えではパーツのつなぎ目が目立ってしまうので、openCVのseamlessClone()を使うことで変形先画像に違和感なく画像を合成します。ポワソン方程式を画像合成に応用した手法Poisson Image Editing[3]の実装ということです。
Fig3. 左:単純な置き換え、右:つなぎ目を目立たないように合成
コード
pyCodes/facePartsSwap at master · misakikobayashi1984/pyCodes · GitHub
参考
[1]Face Swap using OpenCV ( C++ / Python ),<https://www.learnopencv.com/face-swap-using-opencv-c-python/>
[2]Vahid Kazemi and Josephine Sullivan(2014),One Millisecond Face Alignment with an Ensemble of Regression Trees,CVPR 2014
[3]Patrick Perez, Michel Gangnet, and Andrew Blake(2003),"Poisson Image Editing",SIGGRAPH2003