アオカケスの鳥かご

日々の出来事を綴っていきたい

PythonでFaceAPIを使う方法 part2(顔検出)

part1ではFaceAPIを使う準備を行いました。

aokakes.hatenablog.com

part2では実際にPythonでFaceAPIを使っていきます。

FaceAPIで画像を処理してもらい、その結果を画像に書き込んで保存するところまでいきます。

 

手順

1. 画像をURLに送信して結果を変数に格納

2. 結果を描画して保存

 

基本的には公式のマニュアル通りにやっていきます。

docs.microsoft.com

 

準備

FaceAPIを楽に利用できるcognitive_faceというライブラリがあります。

pipでインストールできます。

$ pip3 install cognitive_face

 

1. 画像をURLに送信して結果を変数に格納

10行目でオプションを設定することができます。

landmarksをtrueにすると顔のパーツの細かい座標が取得できます。今回はとくに必要ないのでfalse。

また、attributesで取得したい情報を指定することができます。

項目は以下の通り。

attributes 説明 詳細
hair 髪型 bald(ハゲ率)
invidible(画像内に髪があるかどうか) "true" or "false"
haircolor(髪の色)
smile 表情  "0.0 ~ 1.0"
headPose 頭の角度 pitch(左右) "0.0 ~ 1.0"
roll(前後) "0.0 ~ 1.0"
yaw(上下) "0.0 ~ 1.0"
gender 性別 "male" or "female"
age 年齢 "0.0" ~
facialHair 顔の毛(ヒゲなど) moustache(口ひげ) "0.0 ~ 1.0"
beard(あごひげ) "0.0 ~ 1.0"
sideburns(ほおひげ、もみあげ) "0.0 ~ 1.0"
glasses メガネの有無 "NoGlasses" or メガネの種類
makeup 化粧 eyeMakeup(目の化粧) "true" or "false"
lipMakeup(唇の化粧) "true" or "false"
emotion 感情 anger(怒り) "0.0 ~ 1.0"
contempt(軽蔑) "0.0 ~ 1.0"
disgust(嫌気) "0.0 ~ 1.0"
fear(恐怖) "0.0 ~ 1.0"
happiness(幸福) "0.0 ~ 1.0"
neutral(はっきりしない) "0.0 ~ 1.0"
sadness(悲しみ) "0.0 ~ 1.0"
surprise(驚き) "0.0 ~ 1.0"
occlusion 顔の隠れている部分 foreheadOccluded(額 "true" or "false"
eyeOccluded(目) "true" or "false"
mouthOccluded(口) "true" or "false"
accessories アクセサリーの種類 type(種類)
confidence(信頼性) "0.0 ~ 1.0"
blur 画像のぼかしレベル blurLevel(ぼかしレベル) "Low" or "medium" or "high"
value "0.0 ~ 1.0"
exposure 露出度 exposureLevel
value "0.0 ~ 1.0"
noise 画像のノイズレベル noseLevel(ノイズレベル) "Low" or "medium" or "high"
value "0.0 ~ 1.0"
faceLandmarks 顔のパーツの座標 pupilLeft
pupilRight
noseTip
mouthLeft
mouthRight
eyebrowLeftOuter
eyebrowLeftInner
eyeLeftOuter
eyeLeftTop
eyeLeftBottom
eyeLeftInner
eyebrowRightInner
eyebrowRightOuter
eyeRightTop
eyeRightBottom
eyeRightOuter
noseRootLeft
noseRootRight
noseLeftAlarTop
noseRightAlarTop
noseLeftAlarOutTip
noseRightAlarOutTip
upperLipTop
upperLipBottom
underLipTop
underLipBottom
結構色々ありました。
とりあえず今回は必要な情報だけ持ってくるようにします。

2. 結果を描画して保存

画像から顔を検出することができればfacesの中には顔の座標やattributesで指定した情報が格納されています。

これらの情報をオリジナル画像に書き込み、別ファイルとして保存します。

画像pathとfacesを関数drawに引数として渡します。

男性と女性で色を変えるようにしてみました。実行すると結果を描画したものが保存されていきます。 

 

完成版 

「img」ディレクトリを作成し、その中に顔検出をしたい画像を入れておきます。

プログラムを実行するとimg内の全ての画像で顔検出を行い、結果を描画したものを「face」ディレクトリに保存していきます。

 

ただし、FaceAPIは10回/分の制限があります。とは言うものの、この制限は少しあまいようでなぜか20回くらい叩けたりしました。

なので1枚の画像を処理するごとに3秒sleepさせればよさそうですが、一応余裕を持って4秒sleepさせています。もしかしたら今後制限が厳しくなるかもしれませんし、大人しく6秒sleepさせておいたほうがいいのかもしれません。

 

まとめ

これでPythonでFaceAPIを使うことができるようになりました。

性別と年齢の判定ができるだけでも何か色々できそうな気がします。

 

part3では顔認証システムの構築をやります(たぶん)。