サンプルデモ
![シンタロヲフレッシュさんの顔認証](/storage/javascript/how-to-facial-recognition-by-javascript/static/dst/example_t.png)
今回紹介する、Face Detectionの動作デモです。上記の通り、写真の中の人間の顔を認識し、どこからどこまでがその範囲かを座標で取得することが可能です。今回、ハートを"プルプル"させるブログメディア、prasmを運営するシンタロヲフレッシュさん(@shintarowfresh)にご協力いただき、写真をサンプルとして利用させていただきました。
サンプルデモを見る
ライブラリはGitHub上で公開されています。下記のリンクからアクセスして、まずは、ファイルをダウンロードして下さい。
jquery.facedetection-master.zip
HTML
<head>
<!-- jQueryライブラリの読み込み -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<!-- ライブラリの読み込み -->
<script src="./jquery.facedetection.min.js"></script>
</head>
img
要素を追加して下さい。後々、jQueryで操作するためのid
属性値を付けておきます。また、img
要素に、スタイルシートのposition
を利用して顔範囲を示す枠線を重ねる関係上、ラッパーとなる親要素(f
igure
)で囲んでおきます。なお、画像は自身のサーバー内にあるものしか利用できません。http経由で外部サーバーの画像を読み込んでも、プログラムは動作しない点にご注意下さい。
HTML
<figure>
<img src="./face.jpg" id="face-image">
</figure>
JavaScript
$( function()
{
// 顔画像のID属性値
var id = 'face-image' ;
// インスタンスの作成
var img = new Image();
// 画像の読み込み完了時の処理を定義
img.onload = function()
{
// 処理の記述
}
// 画像の読み込み (キャッシュを防ぐため、パラメータを追加)
img.src = $( '#' + id ).attr( 'src' ) + '?' + Math.floor( new Date().getTime() / 1000 ) ;
}
faceDetection
()
というメソッドを実行します。成功すると、画像の中に映っている人数分のデータを配列で取得できるので、ループ処理でそれらのデータを処理します。画像に含まれる顔データの数だけ、顔範囲となる要素f
ace-image-border
を、追加していく形です。下記は簡易に全体のプログラムを表したもので、実際には、親要素内の画像のオフセット値など、細かくフォローしなければならない要素が他にもあります。
JavaScript
$(function()
{
// 顔画像のID属性値
var id = 'face-image' ;
// ID要素が[facial-image]の画像を読み込んだ後にプログラムを実行する
var img = new Image();
// 画像の読み込み完了時の処理を定義
img.onload = function()
{
//プログラムの実行
$( "#" + id ).faceDetection( {
// プログラムが完了すると[obj]に顔に関するデータが含まれている
complete: function (obj)
{
// 顔を認識できなかった(objにデータがない)場合
if( typeof(obj)=="undefined" )
{
alert( "顔情報を認識できませんでした…。" ) ;
return false ;
}
// 顔を認識できた場合
else
{
// 人数分だけループ処理する
for( var i=0 ; i<obj.length ; i++ )
{
// ラッパー要素内に、顔範囲を示すdiv要素を追加
$( "#facial-image" ).after( '<div class="facial-image-border"></div>' ) ;
// 顔範囲の場所を動的に指定
$(".facial-image-border").eq(i).css( {
left:obj[i].x * obj[i].scaleX + "px" ,
top:obj[i].y * obj[i].scaleY + "px" ,
width:obj[i].width * obj[i].scaleX + "px" ,
height:obj[i].height * obj[i].scaleY + "px"
} ) ;
}
}
} ,
// プログラムの実行に失敗した時の処理
error:function(code,message)
{
// エラーすると原因を示すテキストを取得できるのでアラート表示する
alert( "Error:" + message ) ;
}
} ) ;
}
// 画像の読み込み (キャッシュを防ぐため、パラメータを追加)
img.src = $( '#' + id ).attr( 'src' ) + '?' + Math.floor( new Date().getTime() / 1000 ) ;
}
例えば、画像に3人分の顔データが含まれていた場合、プログラム実行後のHTML構造は下記の通りになります。改行とインデントは見やすいように、こちらで加えたものです。
HTML
<figure>
<img src="./sample.jpg" id="face-image">
<div class="face-image-border"></div>
<div class="face-image-border"></div>
<div class="face-image-border"></div>
</figure>
scaleX
、または110.67194935568408
y
画像の中の顔範囲のY座標。顔範囲の最上部が、画像の最上部から何px離れているか。画像のオリジナルサイズに準拠する。
例: 100.15831396947877
width
顔範囲の横幅。画像のオリジナルサイズに準拠する。
例: 174.66362463446376
height
顔範囲の縦幅。画像のオリジナルサイズに準拠する。
例: 174.66362463446376
positionX
親要素内の顔範囲の縦位置。親要素の最上部から何px離れているか?画像のオリジナルサイズに準拠する。
例: 110.67194935568408
positionY
親要素内の顔範囲の横位置。親要素の左端から何px離れているか?画像のオリジナルサイズに準拠する。
例: 62.65831396947877
offsetX
ドキュメント内の顔範囲の横位置。ページの左端から何px離れているか?画像のオリジナルサイズに準拠する。
例: 536.1719493556841
offsetY
ドキュメント内の顔範囲の縦位置。ページの最上部から何px離れているか?画像のオリジナルサイズに準拠する。
例: 1380.1583139694787
scaleX
画像のオリジナルサイズの横幅と、表示されている横幅の比率。
例: 0.495
scaleY
画像のオリジナルサイズの縦幅と、表示されている縦幅の比率。
例: 0.495
confidence
プログラムが独自に算出した、顔認識の信頼性を示すレベル値。クオリティの調整に利用できる。
例: 3.062835970000007