maji-thatcher 開発記録 2019-03-04 (3日目)

Pnyompen
@pnyompen

@alclimb より引き継いで、3日目は私が書かせていただきます。

サッチャー錯視画像を作るための顔認識から、顔の切り抜きまでを行っていきます。

画像処理や、データマイニングなどの処理は、JupyterNotebookを使うとトライアル&エラーがしやすく便利です。

ライブラリのインポート

必要なライブラリをインポートします。
今回は、顔認識にdlibをよりお手軽にしたface_recognition使います。

Python
import os import PIL import face_recognition import numpy as np from PIL import ImageFile, ImageDraw, Image %matplotlib inline import matplotlib.pyplot as plt ImageFile.LOAD_TRUNCATED_IMAGES = True

画像の読み込み

画像を読み込んで表示します

Python
img_path = 'img.1.jpg' img = Image.open(img_path) img = img.convert('RGB') img_array = np.array(img) plt.imshow(img) plt.show()

a.png a.png

JupyterNotebookを使うことで、こんな感じに簡単に確認ができます。

顔の目印を検出する

目鼻口などの位置を検出します

Python
detection_model = 'hog' n_upsample = 0 face_locations = face_recognition.face_locations(img_array, number_of_times_to_upsample=n_upsample, model=detection_model) landmarks = face_recognition.face_landmarks(img_array, face_locations)

顔認識モデルにはhogとcnnがあり、cnnのほうがディープラーニングを用いたモデルになっているので認識精度が高いです。
ですが、その分リソースも消費するので、今回はサーバーのスペックを考慮して、hogに設定しました。
number_of_times_to_upsampleは、何回元の画像をアプサンプリングするかを指定します。
この値を大きくすることで、認識が難しい小さい顔でも認識できるようになりますが、その分処理の時間がかかります。

ちゃちゃっと顔を認識して

ダウンロード \(7\).png ダウンロード \(7\).png

顔領域の切り抜き

この式を使って切り抜きます。

math
x' = e_1 - e_0\\ y' = \frac{1}{2}(e_1 - e_0) - \frac{1}{2}(m_0 + m_1)\\ c = \frac{1}{2}(e_1 - e_0) - 0.1\cdot y'\\ s = max(4.0\cdot|x'|, 3.6\cdot|y'|)\\ x = Normalize(x' - Rotate90(y'))\\ y = Rotate90(x)\\

$e_0, e_1$ はそれぞれ左右の目の中心
$m_0, m_1$ はそれぞれ左右の口の端
※式が表示されないのは仕様です
cは切り抜く中心
sは一辺の大きさ
x, yは、縦横の方向ベクトルです。

ダウンロード \(8\).png ダウンロード \(8\).png

ハイ完成!

お手軽に顔の認識、クロッピングが完了しました。

次回は実際にサッチャー錯視画像を作ります。

WRITER
Pnyompen
@pnyompen
READ NEXT
COMMENTS
コメント機能は開発中です。実装完了まで今しばらくお待ちください。