福岡人データサイエンティストの部屋

データサイエンスを極めるため、日々の学習を綴っています。

【Pillow(PIL)】浜辺美波から検出されたものとは【face_recognition】【Python】



こんにちは!こーたろーです。


前回、浜辺美波と橋本環奈の顔画像を比較しました。


その結果、しっかりと浜辺美波と橋本環奈の特徴づけができて、画像の仕分けをすることができました。


今回は、このとき使ったface_recognitionにおいて、どのように特徴量を検出したかを見ていきます。


それでは早速まいりましょう!


ライブラリのインポート



ライブラリは、前回同様にface_recognitionとPILを使用していきます。

import face_recognition
from PIL import Image, ImageDraw  



今回使用しているデータはコチラになります。




画像データの取得及び顔のランドマーク出力



画像データをロードして、そこから、face_recognitionのface_landmarksによって、画像の特徴として位置付けたポイントを抽出します。

image = face_recognition.load_image_file("minami1.png")
face_landmark_list = face_recognition.face_landmarks(image)



このランドマーク関数では、画像データ(image)を引数に持ち、返り値としては、辞書型のリストになっており、





こういった形で返ってきます。各パーツごとの点座標を検出した分だけ返します。


また、検出する部位としては、辞書型のkeys( )メソッドを使って出力すると、




  • nose_bridge : 鼻筋
  • nose_tip : 鼻先
  • top_lip : 上唇
  • bottom_lip : 下唇
  • left_eye : 左目
  • right_eye : 右目
  • left_eyebrow : 左眉毛
  • right_eyebrow : 右眉毛
  • chin : 下顎



となっています。


これらを一度、リストとして取り出しておきます。

ランドマークの描画



ランドマークを検出したので、その値が画像のどの位置で検出されているかを画像内に描画していきます。


まずは、イメージ画像を編集するために、画像データを配列にしていきます。加えて、描画するためのメソッドであるImageDraw.Drawに引き渡しておきます。

im = Image.fromarray(image)
draw = ImageDraw.Draw(im)



次に、取り出した特徴点に対して、楕円の点を描画していきます。


for文から確認しますが、これは、画像リストの[0]番目(今回の顔は、浜辺美波の顔だけということで一つだけ)をピックアップし、ランドマークリストの値の数だけ、楕円を描画します。


楕円の描画には、x,yの値が及びサイズが必要なのですが、このx,yを出力するためのあたいを関数のlandmark_pointで計算させています。

def landmark_point(xy, size):
    xy2 = xy[0] + size, xy[1] + size
    return [(xy),(xy2)]

for face_landmark in face_landmark_list[0]:
    for xy in face_landmark_list[0][face_landmark]:
        draw.ellipse(landmark_point(xy, 5), outline = (255, 0, 0), fill = (255, 0, 0))

im



最後に、結果を表示させます。





顔の複数検出なんかも今後取り組んでいきたいです。


ではでは。


5日でわかるOpenCVプログラミング入門