Top / VstoneMagicを使ってみる / プログラミング / 顔を認識させてみよう

顔を認識させてみよう


音声認識のプログラムは一旦置いておいて、顔認識を使ったプログラムを作ってみましょう。また、複数のメソッドの切り替えや別メソッドの呼び出しを使ったプログラミングも合わせて説明します。

  • ○メソッドを追加しメインメソッドを切り替える

    今まで作成した対話プログラムは残し、ここからは新しいメソッドを作ってプログラミングを進めます。まず、クラスウィンドウにメソッドブロックを追加してください。追加したらブロックをクリックしてプロパティウィンドウに設定を表示してください。

    メソッドブロックの設定では、メソッドの名前などを設定できます(各項目の詳しい説明は省略します)。メソッド名は「methodName」の項目で設定できます。ここでは「faceTracking」というメソッド名に変更してください。

    image2_026.png



    メソッドを追加するとエクスプローラにも表示されます。クラスに含まれるメソッドは全てエクスプローラに表示され、先程までプログラミングしていたメソッド「main」は http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_029.png 、追加したメソッド「faceTracking」は http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_030.png のアイコンで表示されます。本ソフトウェアでは、前者の http://www.vstone.co.jp/sotamanual/sotamanual_pict/vstonemagic/image2_029.png のアイコンで表示されたメソッドを「メインメソッド」と呼び、プログラムを起動するとこのメインメソッドが実行されます。

    image2_027.png

    これからfaceTrackingのメソッドをプログラミング・実行するため、メインメソッドをmainからfaceTrackingに変更する必要があります。エクスプローラよりfaceTrackingのメソッドを右クリックし、表示されたポップアップメニューより「メインメソッドに設定」をクリックしてください。

    image2_028.png


    ちなみに、メソッドは別のメソッドから呼び出すことができるため、この方法でメインメソッドではないメソッドも実行させることができます。プログラムの規模が大きくなると一つのメソッドが巨大になって見づらくなるため、各部をメソッドに切り分けて見やすくします。



  • ○顔を見つけて挨拶させる

    それでは、faceTrackingのメソッドに顔認識のプログラムを作りはじめましょう。まずは、周囲を見回して顔が見つかったら挨拶するプログラムを作ります。

    周囲を見回して顔を見つける処理は、「顔追従」のブロック一つで行うことができます。顔追従は開始・終了の二つのブロックを持ち、この間に挟まれたブロックを実行中に、自動的に首を見回して顔を見つけ、顔が見つかったらその顔を追跡(トラッキング)します。それでは、顔追従のブロックをfaceTrackingのメソッドブロックにドラッグ&ドロップして接続してください。

    image2_031.png


    次に、顔が見つかったかどうかの分岐処理を作ります。ツールボックスより「顔が見つかったか?」のブロックをドラッグ&ドロップして、顔追従ブロックの中に接続してください。「顔が見つかったか?」のブロックは分岐構造になっており、顔が見つかったら上側の分岐に、見つからなかったら下側の分岐に進みます。

    image2_032.png



    続いて、顔が見つかった場合にあいさつさせるため、発話ブロックをドラッグ&ドロップし、顔が見つかったかの分岐ブロックの上側の条件分岐に接続してください。発話の内容は初期値の「こんにちは」のままで良いです。

    image2_033.png


    顔追従ブロックは繰り返し機能を持たないため、このままプログラムを実行すると少しだけ顔追従してすぐにプログラムが終了してしまいます。そこで、繰り返し機能を持つブロックを別途追加して繰り返し構造を作ります。ここでは、無限ループのブロックをプログラムにドラッグ&ドロップしてください。

    無限ループのブロックを追加したら、「顔追従」と「顔が見つかったか」の間に入るように各ブロックをつなぎかえてください。

    image2_034.png


    顔追従のプログラムで繰り返しを使う場合、必ずこのように顔追従ブロックの中に繰り返し構造を入れてください。顔追従は、開始・終了時にカメラの初期化・解放処理を実行し、この処理には多少時間がかかります。もし、繰り返しの中に顔追従ブロックをつなげると、毎回の繰り返しで初期化や解放処理が実行され、プログラムが遅くなったり動作が不安定になってしまいます。


    これでプログラムは完成です。一度実行してみましょう。周囲を見回して顔が見つかると挨拶し、そのままゆっくり顔を動かすとロボットの首が追従します。また、顔を早く動かしたりカメラを指で隠して顔を見えなくすると、再び周囲を見回し始めます。



  • ○顔が見つかったら対話のメソッド(main)を呼び出してみる

    本ページの冒頭で、メソッドは別のメソッドから呼び出して実行できると説明しましたが、ここで実際にそのプログラムを作ってみましょう。丁度今のプログラムには、先ほど作成した音声対話のメソッド(mainメソッド)が残っています。顔が見つかって「こんにちは」としゃべったら、この対話メソッドを呼び出して対話できるプログラムに変えてみましょう。

    ツールボックスからブロックを追加する操作のように、エクスプローラから呼び出したいメソッドをクラスウィンドウにドラッグ&ドロップすると、そのメソッドを呼び出すブロックを作成できます。それでは、エクスプローラからmainメソッドをクラスウィンドウにドラッグ&ドロップし、「こんにちは」の発話ブロックの後につないでください。

    image2_035.png

    つないだらプログラムを実行してみましょう。顔が見つかり「こんにちは」と言った後、mainメソッドにプログラミングされた対話プログラムが始まります。

    メソッドを使うプログラムの注意点として、メソッドの中でそのメソッド自身を呼び出したり、二つのメソッド同士が交互に呼び出し合うような使い方をしないようにしてください。このようなプログラムを実行すると、メソッドをどんどん呼び出し続けるようになり、最終的にメモリ不足によるエラーが発生してプログラムが停止します。


  • ○性別や年齢・笑顔を判定してみる

    顔認識の機能では、顔の有無以外に、検出した顔の性別・年齢・どのくらい笑顔かと言ったパラメータも取得しており、本ソフトウェアにはこれらのパラメータを使うブロックが備わっています。それでは、これらを使った機能をプログラムに追加してみましょう。

    まずは、見つかった顔の性別を言い当ててみたいと思います。ツールボックスより、性別の判定ブロックをドラッグ&ドロップし、「こんにちは」の発話ブロックの後ろに接続してください。

    image2_036.png

    プログラムが大きくなってきたので、図のようにブロックを整列し直してください。

    性別の判定ブロックには分岐が三つあり、上から順に「男性の場合」「女性の場合」「判定できない場合」という条件です。各分岐に発話ブロックをつなげて、それぞれ「あなたは男性ですね」「あなたは女性ですね」「分かりません」等、条件に合った文章を設定しましょう。

    image2_037.png




    次に、年齢を判定させてみましょう。年齢による分岐は、年齢の判定ブロックを使います。ブロックをドラッグ&ドロップし、性別の判定ブロックの後ろにつなげましょう。

    image2_038.png


    年齢の判定ブロックの分岐条件は、取得した年齢と比較する数値(age)、及びその比較方法(condition)の二つの設定項目があり、この二つを組み合わせて条件を設定します。

    image2_039.png

    conditionの種類とその意味については、以下の通りです。

    • == … 取得した年齢とageが【同じ】値である
    • < … 取得した年齢がage 【未満】である
    • <= … 取得した年齢がage 【以下】である
    • > … 取得した年齢がage 【より大きい】
    • >= … 取得した年齢がage 【以上】である
    • != … 取得した年齢とageが【違う】値である

    例えば、ブロック初期値の上側の分岐の場合(ageが20、conditionが<=)、「見つかった顔が20歳以下である」という条件になります。

    年齢を使ったプログラムでは「20歳から30歳の間」のような条件を設定したくなる場合がありますが、各分岐には条件を一つしか設定できません。そこで、分岐構造の「一番上の条件から順番に成立を確認する」仕組みを利用します。

    下図のように、年齢の判定ブロックに分岐を一つ追加し、「年齢<=20」「年齢<=30」「else」と設定した場合、2番目の分岐を確認するときは1番目の条件に当てはまらなかったことになります。そのため、結果的に2番目の分岐で「21~30歳である」という判断ができます。

    image2_040.png

    それでは、このように年齢の判定ブロックの2番目の分岐に「年齢<=30」という条件を挿入し、各分岐に発話ブロックをつなげて「20歳以下ですね」「21歳から30歳ですね」「31歳以上ですね」としゃべらせましょう。

    image2_041.png




    続いて、笑顔の度合いも判定させてみましょう。笑顔の判定ブロックをドラッグ&ドロップし、年齢の判定ブロックの後ろにつなげましょう。

    image2_042.png

    顔認識の機能では、検出した顔の笑顔の度合いを0~100までの数値で割り出します。笑顔かどうかの閾値(境目)は45前後です。笑顔の判定ブロックの分岐条件も年齢の判定と同様に、取得した笑顔の点数と比較する数値(smilepoint)、及び両者を比較する方法(condition)が設定できます。

    image2_043.png

    年齢の判定ブロックを参考に、任意の条件を設定して、それぞれの分岐に応じた内容を発話させましょう。

    image2_044.png


    ここまでプログラムができたら実行してみましょう。ロボットに顔を認識させて、性別・年齢・笑顔が上手く認識されるか試してみてください。




  • ○待機中にもロボットを動かす

    今のプログラムでは、顔が見つかるまで首以外の関節が静止してしまいます。このままだと動きに乏しいので、待機中に適当な動作をさせてみましょう。

    待機中に動作を行う場合は、待機動作の開始ブロックを使います。このブロックを実行すると、ロボットが手をぶらぶらさせたり顔を少し動かすなどして、常時なんとなく動くようになります。それでは、プログラムの一番最初に待機動作の開始ブロックを追加して下さい。

    image2_045.png

    プログラムを実行すると、顔を探している間にロボットが手を動かしたりしてなんとなく動き出します。顔が見つかってしゃべりだすと、先ほどと同じく発話に合わせた動作を行います。

    待機動作を終了したい場合は、待機動作の終了ブロックを実行してください。



  • ○顔を見つけてしゃべりだしたら周囲を見回さないようにする

    プログラムの実行中、顔が見つかってしゃべっている最中なのに、視線をそらして辺りを見回し始める場合があります。これは、顔追従ブロックの機能として、顔を見失うと辺りを見回して顔を探し始めるためです。一度顔を見つけてしゃべり出したら、顔を見失っても見回さないようにしたい場合、顔の自動サーチの可否ブロックを使います。

    image2_046.png

    顔の自動サーチの可否ブロックには「faceSearch」という設定項目があり、こちらをfalseに設定したブロックを顔追従中に実行させると、顔を見失っても周囲を見回さなくなります。再び周囲を見回すようにしたい場合は、faceSearchをtrueにしたブロックを実行させてください。

    また、見回し動作自体を最初から無効にしたい場合は、顔追従ブロックの設定項目の「faceSearch」を「false」に設定してください(但し途中で顔の自動サーチの可否ブロックを実行すると、設定が切り替わります)。



    目次  次のページへ>>