Armadillo-810/840では、PUX社のソフトセンサーという画像処理ソフトウェアを利用することができます。
今回はソフトセンサーの顔認識ソフトウェアである「FaceU」と、アットマークテクノが提供するAVコーデックミドルウェアを
使ったデモを作ってみたのでご紹介します。
デモ動画
まずはこちらの動画をご覧ください。
ハードウェア構成
上記のデモは以下のような構成になっています。
[ Armadillo-840 ] --(USB)-- [ USBカメラ ]
--(HDMI)-- [ HDMIディスプレイ ]
--(LAN)-- [ PC ]
- Armadillo-840
http://armadillo.atmark-techno.com/armadillo-840 - USBカメラ
今回はBUFFALO社製BSWHD06MWHを使用しました。
http://buffalo.jp/product/multimedia/web-camera/bswhd06m/ - HDMIディスプレイ
HDMI入力が可能で、FullHD(1920x1080i)の解像度での表示が可能なディスプレイを使用しました。 - PC
LANポートが搭載されており、ブラウザがインストールされていれば、特にスペック等に制限などはありません。
ソフトウェア概要
Armadillo-840にはPUX社ソフトセンサーの顔認識ソフトウェア[ FaseU ] を利用したサンプルアプリケーションをインストールしました。
サンプルアプリケーションの仕様は主に以下の通りです。
- 動画の再生はアットマークテクノのAVコーデックミドルウェアを利用して、H.264形式のFullHD動画を再生しています。
http://manual.atmark-techno.com/armadillo-840/armadillo-840_product_manual_ja-1.6.0/ch15.html
- FaseUのAPIでは5歳刻みで年齢判定できますが、今回のサンプルでは0-30歳、30歳以上で分類しています。
- FaseUのAPIでは顔の特徴点データをデータベースに登録し、同一人物かどうか判定することが可能です。
今回のサンプルでも認識した特徴点をデータベースに登録し、同一人物か判定しています。
なので、例えば30歳未満男性向けの動画が流れている間に、別の30歳未満男性が認識されると、動画を最初から再生します。
- 判定した年齢・性別情報を二次元グラフィックライブラリの[Cairo]を使って、画像データ上に描画しています。
- Webサーバとして画像データをMotion-JPEGとして出力しています
PC側では、ブラウザを起動し、Armadillo-840のIPアドレス、ポート番号を指定するだけで、
WebサーバからMotoin-JPEGを取得、描画が行われます。
デモを試してみたい
今回のデモは、FaseUのSDKを利用して開発しているため、無償評価版などは用意していません。
ただし、[年齢・性別認識]の単体機能を試していただけるサンプルアプリケーションについては、
Armadillo-840/Armadillo-810をご購入済の場合、購入製品登録をしていただければユーザーズサイトから、
ダウンロードしていただくことが可能です。
詳しくは以下のページをご参照ください。
http://armadillo.atmark-techno.com/software/pux
デモのソースコードについて
今回のデモは、FaseUのSDKの中に含まれている、年齢・性別認識のサンプルアプリケーションのソースコードをベースに
開発しています。(言語は C++ です。)
SDKの中に含まれるサンプルアプリケーションには、顔の特徴点をデータベースに登録するAPIの呼び出しなどの実装も含まれており
これらを流用することで、大体120行ほどの追加実装だけで、デモが完成しました。
参考までに、追加実装したソースコードを引用します。
// 現在の顔の特徴量を取得
pPFID_func->GetFeat( (short)i, &pwork->pdi[i] );
// 登録画像と現在の顔をマッチング
s16 match_num = pPFID_func->MatchFeat( VERIFY_THRESOLD, MAX_DB_NUM );
pwork->pdi[i].match_userid = -1;
pwork->pdi[i].match_score = 0;
// 年齢と性別をログ出力
s16 age = pwork->pdi[i].pfagr_age - 2;
s16 gen = pwork->pdi[i].pfagr_gen;
if( gen == PFAGR_MALE )
printf("Fase Detect : MALE (age: %d - %d)\n",age,age+4);
else
printf("Fase Detect : FEMALE (age: %d - %d)\n",age,age+4);
//LOG_PRINT( "Match Num = %d\n", match_num );
printf( "Match Num = %d\n", match_num );
for ( j=0; j<match_num; j++ ) {
s16 candi = pPFID_func->GetCandi( j );
s16 score = pPFID_func->GetScore( j );
//LOG_PRINT( " UserID = %d(Score=%d)\n", candi, score );
printf( " UserID = %d(Score=%d)\n", candi, score );
// 複数マッチした場合は、スコアの高い方を優先
if( pwork->pdi[i].match_userid != -1 ){
if( pwork->pdi[i].match_score < score ){
pwork->pdi[i].match_userid = candi;
pwork->pdi[i].match_score = score;
}
}else{
pwork->pdi[i].match_userid = candi;
pwork->pdi[i].match_score = score;
}
}
if( match_num > 0 ){
// 前回のフレームで認証したユーザーと同一か
if( prev_userid == pwork->pdi[i].match_userid ){
frame_count++;
}else{
prev_userid = pwork->pdi[i].match_userid;
frame_count = 0;
signage_start = 0;
}
// 規定のフレーム数連続で認識した場合
if( frame_count > 1 && signage_start == 0 ){
printf("Start Video\n");
signage_start = 1;
default_flag = 1;
// 男性
if( gen == PFAGR_MALE ){
// 30才以上
if ( age >= 30 ){
system("/root/video/demo.sh /root/video/Elephants_Dream_800x480_telop.mp4 &");
}else{
system("/root/video/demo.sh /root/video/tears_of_steel_800x480_telop.mp4 &");
}
// 女性
}else{
if ( age >= 30 ){
system("/root/video/demo.sh /root/video/Sintel.2010.800x480_telop.mp4 &");
}else{
system("/root/video/demo.sh /root/video/big_buck_bunny_800x480_telop.mp4 &");
}
}
}
//マッチしなければDBへ登録
}else{
s16 uid = pPFID_func->StoreFeat( (short)db_num, (short)i , &pwork->pdi[i]);
db_num++;
//LOG_PRINT( "DB insert. fnum[%d] - UserID = %d\n", i, uid );
printf( "DB insert. fnum[%d] - UserID = %d\n", i, uid );
}
このようにSDKに含まれるサンプルアプリケーションのソースコードをベースに、自社の仕様に合わせてカスタマイズをすることが可能ですので、
1からアプリケーションの開発をする必要がありません。
SDKのご購入などについては、以下をご参照ください。
http://armadillo.atmark-techno.com/software/pux