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