今回は、Microsoft Cognitive ServicesのFace APIで顔認識の限界を検証してみました。
Face APIの仕様
Face APIのリファレンスによると、入力する画像には下記のような制限があるようです。
項目 | 仕様 |
画像形式 | BMP, JPEG, PNG, GIF (最初のフレームのみ) |
ファイルサイズ | 1KB ~ 4MB未満 |
認識可能な顔のサイズ(※画像サイズではありません) | 36×36 ~ 4096×4096 px |
同時認識数 | 最大64 |
上記の仕様を基に、検証用画像として11806×3924 px (4630万画素)の風景写真にわずか36×36 pxの顔の一部を合成した3.94MBのJPEG画像を作成してみました。1ヶ所だけ合成した顔が隠れているのですが・・・まずはどのくらいの時間で探すことができるか、試してみてください。
検証の内容
Face APIでは顔認識の結果として、顔の認識範囲を示す「faceRectangle」と顔の特徴点を示す「faceLandmarks」を取得することができます。画像認識サービスによっては、顔の特徴点と輪郭が顔認識の要素となっていることもありますが、Face APIではどうなのか下記の4項目について検証をしていきます。
① 顔のサイズ、範囲を変えた場合
② 一部を隠した場合
③ 角度、向きを変えた場合
④ 色相、明るさ・コントラストを変えた場合
顔認識の限界の検証
それではFace APIの限界を検証していきます。
まずは、faceRectangleの範囲を「顔」の基準として、110% ~ 60%の範囲の顔を切り抜いて顔の認識をさせてみました。さすがに顔の60%の範囲では、顔の特徴点が切り取られてしまうため、特徴点の認識誤差が発生しますが、目、鼻、口が写っていれば顔として認識させることができていました。また、顔の輪郭がなくても顔として認識されていることから、顔の輪郭は顔認識の要素でないことがわかりました。
faceRectangleがどのように決定されているか調べるため、顔の80%の範囲を切り抜いた画像の四方に白枠を付け、顔範囲110%と同じ画像サイズにしたものを認識させてみました。顔の白枠を付けたものと、顔範囲110%の画像を比較すると、ほぼ同じ位置にfaceLandmarksとfaceRectangleが表示されており、faceLandmarksを基にfaceRectangleが決定されていると推察されます。このことからも、Face APIは顔の特徴点から顔を認識していることがわかます。
また、顔の特徴点を一部隠して、どこまで顔が見えていれば認識できるか試してみました。
目、口、鼻と隠す箇所を変えてFace APIで認識してみましたが、複数の箇所を隠すと認識はできないものの、目、口のいずれかを完全に隠してしまっても、隠した部分を補完して顔を認識させることができていました。また、鼻の頂点は顔認識の上で重要なようで、鼻の頂点をほんの一部隠すだけでも顔を認識することができなくなってしまいました。
検証の結果、左右の瞳、口の左右端が作る四角形のうち隣り合う2点と鼻の頂点の計3点が見えていれば顔として認識できることがわかりました。
続いて、検出可能な顔のサイズを検証してみました。faceRectangleのサイズを基に、画像サイズを調整しながら顔の認識をさせてみましたが、Face APIのリファレンス通り、faceRectangleが36×36pxより小さくなると顔を認識させることができなくなりました。
原寸サイズでは認識ができなかった顔サイズ30pxの画像を、顔サイズ80pxの画像と同サイズに拡大したものも認識させてみました。ぼかし状になるバイキュービック法とモザイク状になるニアレストネイバー法の二種類の方法で拡大しましたが、いずれも概ね同じ位置に顔を認識させることができました。原寸では認識できない画像でも拡大することで認識可能になることがわかりました。
Face APIのリファレンスに載っていない項目として、認識可能な顔の角度を検証してみました。
正面向きの画像を15°ずつ回転させて顔の認識させたところ、30°までは顔認識できていますが、45°以上では顔を認識することができなくなり、細かく角度を変えても概ね35 ~ 40°が顔認識の限界のようでした。
また、同じく顔の角度でも空間的な顔の向きを変えた場合も試してみました。さすがに真横を向いた画像は認識できませんでしたが、目、鼻、口が識別できる画像であれば、どの方向を向いていても顔として認識できるようです。
画像の色相や明るさ、コントラストを変えて認識できるかも試してみました。
西郷隆盛像が認識できていることからもわかるように、色相に関しては特に関係なく認識できました。明るさ、コントラストも、よほど画像の濃淡が潰れない限り、認識させることは可能なようでした。
・色相
・明るさ、コントラスト
さて、初めに紹介した11806×3924 px (4630万画素)の検証用画像ですが、Face APIで認識させてみると顔を見つけ出すことができました。見つけにくいように顔の色相を変えて、背景の色と同化するように合成したのですが、リクエストからレスポンスまで7秒と、短時間で見つけ出してしまいました。同様に、この画像からフルHDサイズ(1920×1080px)の画像を切り出してPNG形式(3.6MB)ので保存したものを認識させると約4秒でレスポンスが返ってくるため、画像サイズが大きいほど認識に時間がかかるようです。
今回はFace APIの限界に挑戦してみましたが、入力する顔の大きさ、角度に気を付ければ概ね顔認識ができるため、広い範囲の画像に顔認識を適応させることができそうです。
64までの顔を同時に認識できるため、多人数の写る画像に一斉にモザイクをかけたり、集合写真から特定の人物を見つけ出したりといった応用ができるのではないでしょうか。
次回は、Face APIを使った顔の比較についての検証をしていきます。
お楽しみに!