pytorch で顔の位置合わせ 回転

pytorch で顔の位置合わせ 回転

顔の位置を合わせたい

複数の顔画像の位置合わせをしたい。
face alignmentなどというやつ。
第一段階として顔の回転角度を平行に合わせる。

1. 結果

こんな感じになる↓


元画像


回転後

2. 角度を合わせる方法

多くの人間は両目が水平についている。
そこで両目が水平である状態を基準として入力顔画像を回転させることにする。

2.1. 両目の座標を取得する

顔の特徴点を抽出する方法がいくつかある。
今回は以前に試したfacenet_pytorchを使用。

これにより入力画像から両目の座標が得られる。



2.2. 回転角を計算する

両目の座標が水平になるような回転角Θを求める。

回転角Θは以下の図のような感じになる



ここでtanΘ = (dy / dx)
なのでΘ = arctan(dy / dx)

numpyに良い感じの関数があるので良い感じに計算できる。
numpyarctan()で出てくる値はラジアンなので度数に変換する。

得られた回転角Θだけ画像を回転させると両目が水平になった画像が得られる。



3. コード

今回作成したコード。
以前試したfacenet_pytorchを使用しているが、両目の座標が取得できればなんでもいい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from facenet_pytorch import MTCNN
from PIL import Image
import numpy as np

img_path = "test.jpg"
out_path = "out_" + img_path
img = Image.open(img_path)
mtcnn = MTCNN()

# 顔領域、顔っぽさ、特徴点のリストを取得、顔が1つなら長さ1
boxes, probs, points = mtcnn.detect(img, landmarks=True)

# 両目の座標を取得
left_eye = points[0][0]
right_eye = points[0][1]

# 両目の座標が水平になるような回転角を計算
dx = right_eye[0] - left_eye[0]
dy = right_eye[1] - left_eye[1]
theta = np.arctan(dy / dx) # radian
theta = theta * 180 / np.pi # degree = radian * 180 / pi

# 画像を回転・保存
img = img.rotate(theta)
img.save(out_path)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×