はじめに
こちらの「認識した顔の数を話す」という動作を試してみていて、何となく「Face Detection」ボックスのソースを覗いてみたのですが、何でこれだけのコードでこの機能ができるのだろう、と (そのときは) 不思議に思いました。
仕組みを確認してみるのと、独自ボックスを作成してみるのと合わせて、「Face Detection」同等のボックスを自作してみました。
「Face Detection」ボックスの確認
まず「Face Detection」ボックスの枠があり、その中で「Count Det. Faces」が配置されています。
「Face Detection」ボックス
「Count Det. Faces」ボックス
ところえ、Mac でスクリーンショットを撮るのに command + shift を押すのですが、画像みたいなヒントが出るみたいですね。
「Count Det. Faces」のコード
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self, False)
def onLoad(self):
self.nFacesDetected = -1
def onUnload(self):
#puts code for box cleanup here
pass
def onInput_onStart(self, p):
if(len(p) > 0):
if(self.nFacesDetected != len(p[1]) -1): # an additional array has been placed at the end for time
self.nFacesDetected = len(p[1]) -1 # filtered info and has to be substracted when counting faces
if(self.nFacesDetected != 0):
self.onFaceDetected( self.nFacesDetected )
else:
self.onNoFace()
else:
if(self.nFacesDetected != 0):
self.nFacesDetected = 0
self.onNoFace()
def onInput_onStop(self):
pass
オレオレ「Face Detection」ボックスの作成
「oreore Face Detection」ボックスの作成
ボックスを配置するペイン上でコンテキストメニュー
ボックスの新規作成 > ダイヤグラム...
「名前」「概要」を入力、「出力」の [+] を押して以下の項目を追加します。
Name | Type | Nature |
---|---|---|
numberOfFaces | 数 | 即時 |
onNoFace | "バン" | 即時 |
これで「Face Detection」ボックスと同等の "枠だけ" ができました。
「oreore Count Det. Faces」ボックスの作成
「oreore Face Detection」ボックス内でコンテキストメニュー
ボックスの新規作成 > Python...
「名前」「概要」を入力、「出力」の [+] を押して以下の項目を追加します。
Name | Type | Nature |
---|---|---|
onFaceDetected | 数 | onStopped |
onNoFace | "バン" | onStopped |
「OK」を押して閉じた後、onStart の入力部分でコンテキストメニューで Edit input を選択し、Type を「ダイナミック」に変更します。
「oreore Count Det. Faces」のコードの編集
「Count Det. Faces」からそのままコピペします。
入出力の接続
ここまで来てようやく「Count Det. Faces」の入力が onStart ではなく、 変なところ につながっていることに気づきました。
ALMemory という機構を介して、各種 API のイベント、値を取得できるようです。
ということで、ALMemory からのイベントの追加 [+] を押し FaceDetected をチェックして、接続口を作り、入出力を接続します。
(Pepper 実機でないと FaceDetected は出てこないようです)
「Face Detection」から「oreore Face Detection」に接続し直します。
オレオレ版で実行
オリジナルと同等の動きをすることを確認しました。
感想
- 「Face Detected」ボックスでは顔認識結果を ALMemory 経由で受け取って分類するだけ、という処理なことに納得しました。
- 他にどんなイベントがあるのか確認してみます。楽しみ。