顔検出動作のチューニング

 顔との距離(正確には画像上の目間ピクセル距離)が一定の値を超えたら顔認証するパペロアプリの動作を、実際に顔を近づけて確かめてみたところ最初うまく顔検出イベントが上がらず思う様な動作にならなかったのですが、PaPeRo i の顔検出コンポーネントは設定ファイルで動作を調整できるようになっており、設定値を変えることで動作を改善することができたのでご紹介します。

PaPeRo i の顔検出動作について

 PaPeRo i の顔検出は撮影画像中央に不検出エリアがあり、

  • 顔が不検出エリアに収まっている限り顔検出イベントを発生しない
  • 不検出エリアから検出エリアに顔が出た場合も即座にイベントが上がらず、n回連続検出で検出イベントが上がる
  • 顔を見失った場合も即座にはイベントが上がらず、m回連続不検出で不検出イベントが上がる

という動作になっています。画像中央の不検出エリアについては見つけた顔の方に頭を向ける顔追従動作のためであれば無駄なイベントが上がらず効率的な仕様だといえますが、顔との距離によって処理を変えたい場合には顔が不検出エリアに入りっぱなしになると顔検出イベントが上がらず、少々マッチしません。

顔検出コンポーネント設定ファイル

顔検出コンポーネントの設定ファイルは、

/Extension/robot_platform/conf/FaceDetect.conf

で、設定値は

undetectEventThreshold=3
detectEventThreshold=2
detectAreaThreshold=40
detectFaceInterval=500
detectFaceImageAreaThreshold=200

となっていました。個々の値ですがこのファイルのコメントに

#    undetectEventThreshold # 顔不検出イベント送信閾値(連続不検出回数)
#    detectEventThreshold   # 顔検出イベント送信閾値(連続エリア外検出回数)
#    detectAreaThreshold    # 顔不検出エリア閾値(画像中心からのピクセル数)
#    detectFaceInterval     # 顔検出間隔(ミリ秒)
#    detectFaceImageAreaThreshold # 顔検出イメージイベント検出エリア閾値(画像中心からのピクセル数)

と説明されています(詳細は顔検出コンポーネントの仕様書をご参照ください)。パペロの正面で顔を近づけたり遠ざけたりする場合にはこの設定値だとなかなか顔検出してくれず、感度が悪いと感じてしまいます。
(上記の通り、実際には感度が悪いわけではなくあえてイベントを上げない動作になっています。)

まずノイズ軽減のためと思われる連続検出・不検出回数を変えてみました。

undetectEventThreshold=2
detectEventThreshold=1

これだけでかなり改善された印象になります。さらに不検出エリアを小さくするなど調整してみました。

undetectEventThreshold=2
detectEventThreshold=1
detectAreaThreshold=10
detectFaceInterval=1000
detectFaceImageAreaThreshold=200

これで顔の位置が中央のままでも約1秒に1回顔検出イベントが上がるようになり、顔との距離によって顔認証するのに十分満足できる動作になりました。


0