気になったこと
画像から顔検出するライブラリのMTCNNが、角度のある顔画像に対してどの程度検出できるのかが気になったので、画像を回転させてどこまで検出できるか試してみようと思います。
やったこと
このような処理を作成しました。
まず、読み込ませた「ivan.jpg」の画像をangleの値だけ回転させて保存します。
その画像をMTCNNで顔検出させたとき、angleをどこまで上げても大丈夫なのかを確認しました。
import cv2
from mtcnn import MTCNN
from PIL import Image
angle = 45
filename = "ivan.jpg"
output1 = "rotate_" + filename
output2 = "drow_" + filename
detector = MTCNN()
#画像を傾かせて保存する
pil_image = Image.open(filename)
rotate_image = pil_image.rotate(angle)
rotate_image.save(output1)
#画像を読み込んで顔検出
image = cv2.cvtColor(cv2.imread(output1), cv2.COLOR_BGR2RGB)
result = detector.detect_faces(image)
#画像に描画して保存
bounding_box = result[0]['box']
keypoints = result[0]['keypoints']
cv2.rectangle(image,
(bounding_box[0], bounding_box[1]),
(bounding_box[0]+bounding_box[2], bounding_box[1] + bounding_box[3]),
(0,155,255),
2)
cv2.circle(image,(keypoints['left_eye']), 2, (0,155,255), 2)
cv2.circle(image,(keypoints['right_eye']), 2, (0,155,255), 2)
cv2.circle(image,(keypoints['nose']), 2, (255,155,0), 2)
cv2.line(image,(keypoints['mouth_left']),(keypoints['mouth_right']),(0, 0, 0),2)
cv2.imwrite(output2, cv2.cvtColor(image, cv2.COLOR_RGB2BGR))
print(result)
やった結果
回転なし。もちろん顔検出出来ています。
45度回転。顔検出は出来ていますが、パーツの位置がずれています。
90度回転。顔検出は出来ていますが、パーツの位置がめちゃくちゃです。
120度回転。顔検出は出来ていますが、パーツの位置がめちゃくちゃです。
150度回転。顔検出は出来ていますが、パーツの位置がめちゃくちゃです。
180度回転。顔検出は出来ませんでした。
まとめ
この結果を見る限り、MTCNNで顔検出する場合、多少角度がきつくても顔検出はできているように見えました。
ただ、目、鼻、口の位置は信用できない情報になりそうです。
また、この結果はこの画像での結果でしかないので、別の人だと結果が違ってくるのかもしれません。