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

顔を認識させてみよう

今まで作成した対話プログラムは残しておいて、別にメソッドを作ってプログラミングを進めます。 対話プログラムのメソッドは、後のプログラムで、これから作成する顔認識のメソッドから呼び出すために使います。

顔認識プログラムを作成する前に、次の手順でプログラムを作成するメソッドを追加してください。

メソッドブロックをドラッグ&ドロップしてください。

本ソフトウェアでは、最初に実行するメソッドを「メインメソッド」として一つ設定します。画面右側の「エクスプローラ」にメソッドの一覧が表示され、メインメソッドは

のアイコンで、それ以外のメソッドは

のアイコンで表示されます。

追加したメソッドを右クリックしてポップアップメニューを表示し「メインメソッドに設定」をクリックしてください。

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

それでは、顔認識の機能を使ったプログラムを作りはじめましょう。まずは、周囲を見回して顔が見つかったら挨拶させてみます。

まずは、顔追従のブロックをドラッグ&ドロップし、先程追加したメソッドブロックに接続してください。

顔追従のブロックは、カメラに映った人の顔を認識し、顔が見つかったらそちらへ顔を追従します。また、顔が見つからない場合は自動的に周囲を見回します。

このブロックはメソッドと同じく開始・終了がセットとなっており、この中のブロックを実行中の間だけ顔の認識・追従が有効になります。

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

続いて、顔が見つかった場合にあいさつさせるため、発話ブロックをドラッグ&ドロップし、顔が見つかったかの分岐ブロックの上側の条件分岐に接続してください。

これでプログラムが完成したかに見えますが、一つ問題があります。顔追従ブロックは繰り返し機能を持たないため、このままプログラムを実行すると少しだけ顔認識してすぐにプログラムが終了してしまいます。

現在作っているプログラムは「顔が見つかったか」を都度判断させる必要があるため、この中に繰り返し構造を作る必要があります。

繰り返し構造を持つブロックはいくつかありますが、ここでは無限ループを使います。ツールボックスから無限ループのブロックをドラッグ&ドロップしてください。

無限ループの挿入先は、顔追従ブロックと顔が見つかったかの分岐の間です。キーボードのSHIFTキーを押しながら顔追従ブロックをドラッグして接続を切り離し、SHIFTキーから手を離してそのまま無限ループのブロックの間につなげてください。

次に、顔追従ブロックの中に無限ループをつなげてください。

これでプログラムは完成です。一度実行してみましょう。

注意として、顔追従ブロックを繰り返しの中に接続しないで下さい。顔追従は、開始や終了のブロック内でカメラの初期化・解放処理が実行し、この処理には多少時間がかかります。もし、繰り返しの中に顔追従ブロックをつなげると、繰り返しを行うたびに初期化や解放処理が実行され、プログラムが遅くなってしまいます。

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

顔認識機能のブロックには、検出した顔の性別・年齢・どのくらい笑顔かと言ったパラメータを使えるものが備わっています。

これらを順番にプログラムに追加してみましょう。

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

性別の判定ブロックには分岐が三つあり、上から順に検出した顔が「男性の場合」「女性の場合」「判定できない場合」の条件となります。

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

プログラムができたら実行し、ロボットがあなたの性別を正しく言い当てられるか確認してみましょう。

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

年齢の判定ブロックの分岐条件の初期値は「顔が20歳以下である」です。ここではこの分岐条件のまま利用しますが、より細かく年齢を判断したい場合は、ブロックをダブルクリックして分岐条件を追加・設定してください。

年齢の判定ブロックの各分岐に発話ブロックをつなげて、「20歳以下ですね」「20歳より上ですね」等、分岐に沿った文章を設定してください。

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

顔認識の機能では、検出した顔の笑顔の度合いを0~100までの数値で割り出します。笑顔かどうかの閾値(境目)は45前後で、笑顔の判定ブロックも分岐条件の初期値に「笑顔が45点以上である」となっています。

笑顔の判定ブロックの各分岐に発話ブロックをつなげて、それぞれ「いい笑顔ですね」「もっと笑って」等、分岐に沿った文章を設定してください。

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

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

今のプログラムでは、顔が見つかるまで首以外の関節が静止してしまいます。このままだと動きに乏しいので、大気中に適当な動作をさせてみましょう。 待機中に動作を行う場合は、待機動作の開始ブロックを使います。プログラムの最初にこのブロックを追加してプログラムを実行してみましょう。

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

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

  • ○人が見つかったときに周囲を見回さないようにする

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

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

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