弊社ライブラリのPaPeRo i 顔認証サービス(NeoFace)対応とPython版デモアプリ

 PaPeRo i 顔認証サービス(NeoFace)用のAPIはアドオンシナリオに静的リンクするC++ライブラリとして提供され、従来の様なJSON形式のメッセージを組立てて送信する形ではなく、NeoFace専用のAPIを呼ぶ方式のため、Pythonアプリから利用することができませんでした。
 そこでWebSocket通信アドオンシナリオとPythonライブラリにNeoFace対応のための機能追加を行い、デモ用Pythonアプリを作成して顔認証動作を確認してみました。

PaPeRo i 制御用WebSocket通信アドオンシナリオ

 PaPeRo i 顔認証サービスでは5人まで登録できる個人宅向けサービスと500人までの施設向けサービスで異なるライブラリ(個人宅向け=libNeoFace_p.a、施設向け=libNeoFace_c.a)をリンクする必要があります。単純な方法としてはWebSocket通信アドオンシナリオを、個人宅向け版、施設向け版、NeoFaceを使わない版に分けることになりますが、種類が増えて大変なので、今回NeoFace機能はプラグインとして別ファイルからロードする形にしました。
ディレクトリ
/Extension/robot_platform/lib/addon/data/0001/0012/plugin
に置いてあるsce_pluginで始まり.soで終わる名前のファイルをロードするので、利用するサービスに合わせてプラグインの実体sce_plugin_neoface_p.so.1.0.0 / sce_plugin_neoface_c.so.1.0.0に対する.soで終わる名前のシンボリックリンクを作成してください(ダウンロードファイルでは個人宅向けがロードされる様シンボリックリンクが作成してあります)。
 WebSocket通信アドオンシナリオ内部の動作としては、従来WebSocketから受け取ったJSONデータは必要なフォーマット変換を行うだけでほぼそのままrobot_platformに送り、レスポンスやイベントも同様でしたが、今回は受け取ったJSONメッセージの”Destination”値が”__NeoFace”の場合にはNeoFaceコマンドと判断し、”Name”値に対応するNeoFace APIをコールして結果をレスポンスとして返します。(Pythonライブラリに隠蔽されるのでアプリ作成でこの動作を意識する必要はありません。)

PaPeRo i 制御用Pythonライブラリ(pypapero.py)

 NeoFace用に追加したPythonライブラリのAPIは、元のC++のPaPeRo i 顔認証サービスライブラリAPIと1対1で対応し、引数も同一になっていますので、APIの動作の詳細についてはPaPeRo i 顔認証サービスライブラリAPI 仕様書をご参照ください。但しAPI名称はNeoFace_Authenticate→send_neoface_authenticateの様に従来同様send_を先頭に付加し、またPythonのコーディング規約に合わせてスネークケースとしています。
 レスポンスのName値はpypapero.pyに

NEOFACE_AUTHENTICATE_RES = "__NeofaceAuthenticateRes"

の様に定義してあります。レスポンスデータではC++のAPIで返値用の変数名として定義されている文字列(outvecなど)のキーにその値が載って戻されますが、細かい手順などについてはデモアプリを参照して下さい。

デモアプリ

 NeoFaceの顔認証自体はsend_take_picture()で顔を撮影しsend_neoface_authenticate()を実行するだけです。結果はユーザID、ユーザ名、スコア、マッチした顔画像のインデックスの組の、スコア順のリストが返されます。アプリに組み込む場合、どの様な流れで顔認証を行い、その結果をどの様にPaPeRo iの振る舞いに反映させるかが工夫のしどころとなるかと思いますが、今回はそういった形ではなく、ユーザ登録や顔画像登録など、用意されているAPIを全て確認できる、ブラウザから操作するアプリとしました。PaPeRo i 顔認証サービス管理ポータルの「顔認証対象者管理」と重なる部分もありますが、

  • PaPeRo i のカメラで顔追従、左右の目の間隔の確認、撮影、画像の確認ができる
  • 顔認証動作が確認できる
  • サブグループ管理、端末管理、認証回数の確認などができない
  • サブグループIDは(メイン画面では)変更できない
  • 登録画像の表示シーケンスには時間がかかる(試した限りで5枚で15秒など)

といった違いがあります。

フリー写真素材ぱくたそ 様の写真素材を利用しています。画像の再利用は行わないでください(リンク先をご参照ください)。

使用手順

(1) PaPeRo i のバージョン確認・更新
 PaPeRo i 顔認証サービスを使用するためにはFW=2.1.37_papero-09以降、robot_platform=std_1_0_18.rom以降(/Extension/robot_platform/bin/sys_mgrのタイムスタンプがMar 16 2017以降)が必要です。
FWはブラウザで 192.168.1.1/index.cgi/fw_main から、
robot_platformは 192.168.1.1/robo/fwup.html から更新できます。
(2) PaPeRo i へのPythonインストール
 インターネットに接続するPaPeRo i でPythonを使えるようにするなどをご参照ください。
(3) Pythonパッケージインストール
PaPeRo iでインターネット接続可能な状態で、pipが未インストールの場合:

# python3 -m ensurepip

ws4pyとtornado4をインストール:

# pip3 install ws4py tornado==4.5.3

(4) アドオンシナリオ用ライセンスファイル入手
 FW=2.1.37_papero-09/robot_platform=std_1_0_18.rom以降ではアドオンシナリオを動作させるためのライセンスファイルが必要になります。
(/Extension/License/sce_????????_????????????.lic)
(5) PaPeRo i 顔認証サービス申し込み、使用するPaPeRo iの申請
(6) PaPeRo i 顔認証サービス管理ポータルでサブグループの登録、端末(PaPeRo i)へのサブグループ登録
(7) PaPeRo i へのNeoFaceライセンスファイル等のインストール
 /Extension/Licenseにneoface_admin_key、neoface_auth_key、neoface_groupidを置いてください。
(8) 初回起動
 アプリをダウンロードしてPaPeRo i の任意の場所に展開し、

# python3 neofacedemo.py

(9) サブグループIDの設定
 ブラウザで192.168.1.1:8860/neofacedemoを開き、サブグループIDに管理ポータルで設定したIDを入力して保存してください。

(10) アプリ再起動
 一旦終了した上で再度実行してください。

# python3 neofacedemo.py

(11) 操作
 ブラウザで 192.168.1.1:8860/web/neofacedemo.html を開いてください。ユーザ登録、顔画像登録後に、「撮影」と「認証」または「撮影&認証」で認証シーケンスが実行され、「~さん、こんにちは」と認識した人の名前を発話します。試した限り、人を間違えることはありませんでした(5人登録)。

ダウンロードリンク:
アドオンシナリオ
デモアプリソース