ブログ

PUX ソフトセンサー 顔認識/年齢・性別推定デモ

at_takuya.sasaki
2015年10月3日 18時27分

Armadillo-810/840では、PUX社のソフトセンサーという画像処理ソフトウェアを利用することができます。
今回はソフトセンサーの顔認識ソフトウェアである「FaceU」と、アットマークテクノが提供するAVコーデックミドルウェアを
使ったデモを作ってみたのでご紹介します。

デモ動画

まずはこちらの動画をご覧ください。 


ハードウェア構成

上記のデモは以下のような構成になっています。

[ Armadillo-840 ] --(USB)--   [ USBカメラ ] 
                  --(HDMI)--  [ HDMIディスプレイ ]
                  --(LAN)--   [ PC ] 


ソフトウェア概要

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

-->