顔認証だけ行うシンプルなPythonサンプル

 弊社ライブラリのPaPeRo i 顔認証サービス(NeoFace)対応とPython版デモアプリで「NeoFaceの顔認証自体はsend_take_picture()で顔を撮影しsend_neoface_authenticate()を実行するだけです。」とだけ書いていましたが、具体的な例をご紹介します。

ソースコード

neofacedemo.py:

# -*- coding:utf-8 -*-
import sys
from logging import (getLogger, Formatter, debug, info, warn, error, critical,
                     DEBUG, INFO, WARN, ERROR, CRITICAL, basicConfig)

import pypapero
from pypapero import (
    NEOFACE_INIT_RES,
    NEOFACE_AUTHENTICATE_RES,
    TAKE_PICTURE_RES,
    KEY_NEOFACE_USER_ID,
    KEY_NEOFACE_USER_NAME,
    KEY_NEOFACE_FACE_INDEX,
    KEY_NEOFACE_OUTVEC,
    KEY_NEOFACE_INDICES,
    KEY_NEOFACE_OUTCOUNT,
    NEOFACE_AUTH_THRESHOLD_LOW,
    NEOFACE_AUTH_THRESHOLD_MEDIUM,
    NEOFACE_AUTH_THRESHOLD_HIGH,
    KEY_NAME,
    KEY_RETURN,
)

logger = getLogger(__name__)

sub_group_id = 'CUSTOMER99'
auth_fn = 'auth.jpg'
auth_camera = 'SXGA'
auth_threshold = NEOFACE_AUTH_THRESHOLD_LOW


def main():
    simulator_id, robot_name, ws_server_addr = pypapero.get_params_from_commandline(sys.argv)
    if ws_server_addr == '':
        ws_server_addr = 'ws://192.168.1.1:8088/papero'
    papero = pypapero.Papero(simulator_id, robot_name, ws_server_addr)
    if papero.errOccurred != 0:
        return
    papero.send_neoface_init()
    while True:
        msgs = papero.papero_robot_message_recv(1.0)
        if msgs is None:
            continue
        msg = msgs[0]
        name = msg.get(KEY_NAME)
        logger.info('name: {}'.format(name))
        if name == NEOFACE_INIT_RES:
            ret = msg.get(KEY_RETURN)
            if ret != 0:
                logger.error('neofaceInitRes return: {}'.format(ret))
        if name == 'detectButton':
            status = msg.get('Status')
            if status == 'C':
                logger.info('send_take_picture')
                papero.send_take_picture(format='JPEG', filename=auth_fn, camera=auth_camera)
            elif status == 'L':
                logger.info('exit')
                break
        elif name == TAKE_PICTURE_RES:
            ret = msg.get(KEY_RETURN)
            if ret != 0:
                logger.error('takePictureRes return: {}'.format(ret))
            else:
                logger.info('send_neoface_authenticate')
                query_image = '/tmp/' + auth_fn
                papero.send_neoface_authenticate(sub_group_id=sub_group_id,
                                                          threshold=auth_threshold,
                                                          query_image=query_image,
                                                          )
        elif name == NEOFACE_AUTHENTICATE_RES:
            ret = msg.get(KEY_RETURN)
            if ret != 0:
                logger.error('neofaceAuthenticateRes return: {}'.format(ret))
            else:
                lst = msg.get(KEY_NEOFACE_OUTVEC)
                if isinstance(lst, list):
                    top = lst[0]
                    if isinstance(top, dict):
                        uid = top.get(KEY_NEOFACE_USER_ID)
                        uname = top.get(KEY_NEOFACE_USER_NAME)
                        image_idx = top.get(KEY_NEOFACE_FACE_INDEX)
                        if uid is not None and 0 < len(uid):
                            logger.info('authenticate OK. top userId: {} userName: {} imageIdx: {} outvec: {}'.format(
                                uid, uname, image_idx, lst
                            ))
                            papero.send_start_speech('こんにちは、{}さん'.format(uname))
                        else:
                            logger.error('authenticate NG3.')
                    else:
                        logger.error('authenticate NG2.')
                else:
                    logger.error('authenticate NG1.')

    papero.papero_cleanup()


if __name__ == "__main__":
    #loglevel = DEBUG
    loglevel = INFO
    #loglevel = ERROR
    LOG_FMT = '%(asctime)s %(name)s %(funcName)s %(levelname)s %(message)s'
    basicConfig(level=loglevel, format=LOG_FMT)
    main()

使用手順(ラズパイなどから実行する場合)

 実行はPaPeRo i 本体、ラズパイ・PCなど外部ホストのどちらでも可能です。PaPeRo i本体で実行する場合、弊社ライブラリのPaPeRo i 顔認証サービス(NeoFace)対応とPython版デモアプリの使用手順をご参照ください。Pythonインストール済みの外部ホストから実行する場合は以下の通りです。

(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) アドオンシナリオ用ライセンスファイル入手
 FW=2.1.37_papero-09/robot_platform=std_1_0_18.rom以降ではアドオンシナリオを動作させるためのライセンスファイルが必要になります。
(/Extension/License/sce_????????_????????????.lic)
(3) WebSocket通信アドオンシナリオのバージョン確認(v0.1.0以降)
 必要ならこちらからダウンロードしてインストールしてください。
(4) pypapero.pyのバージョン確認(Ver.1.02以降)
 必要ならこちらからダウンロードし、pypapero.pyをneofacedemo.pyと同じフォルダに配置してください。
(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) サブグループIDの設定
 サブグループIDはソースコードに直書きしているので

sub_group_id = 'CUSTOMER99'

の部分を直接書き換えてください。
(9) PaPeRo iからインターネット接続できる様にする
(10) プログラム実行

$ python3 neofacedemo.py

座布団真ん中ボタンで写真を撮り、続いて顔認証を実行し、第一候補のユーザ名を発話します。


0