つくるって楽しい

主にpythonとか。画像処理とか。

顔パーツを選択して置換する

検出した顔パーツをすべて含むよう部分をスワップする例[1]を参考に、目、口などパーツを選択して置換する例を作成しました。Fig1では、右目、左目、口を置換しています。眼が青く、唇ぷるんになっています。

 

f:id:mikekochang:20190301101345j:plain
Fig1. 左上:パーツ交換元、左下:交換先、右下:交換後

 

顔パーツの検出

[1]と同様にdlibという機械学習のライブラリの顔パーツ検出を使用しています。dlibの顔パーツ検出はOne Millisecond Face Alignment with an Ensemble of Regression Trees[2]という回帰で特徴点を検出する方法の実装だそうです。
顔の特徴点を68点で記述したデータセットiBUG 300-W datasetを学習した結果がdlibで提供されています。

f:id:mikekochang:20190301101700j:plain
Fig2. 特徴点検出結果

 

パーツを三角形ごとに変形

顔パーツを構成する特徴点から3点ずつ選びパーツを三角形の集合にします。左目なら4つの三角形になります。三角形ごとに対応するAffine変換を求めてパーツを変形します。三角形に分けることでAffine変換のみで画像が変形できます。

f:id:mikekochang:20190301101729j:plain
Fig3. 三角形の変形

 

パーツを合成

変形後のパーツを合成します。単純な置き換えではパーツのつなぎ目が目立ってしまうので、openCVのseamlessClone()を使うことで変形先画像に違和感なく画像を合成します。ポワソン方程式を画像合成に応用した手法Poisson Image Editing[3]の実装ということです。

f:id:mikekochang:20190301102048j:plain

 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