開発環境
顔認証が行える RealSense F455のSDKはIntelがGitHubで提供しています。他のRealSenseシリーズのSDKとは異なります。今回はSDKについて解説します。
https://github.com/IntelRealSense/RealSenseID
サポートOS
- Linux(ubuntu 18、gcc 7.5以降でテスト)
- Windows(Windows 10、msvc 2019でテスト)
- Android(Android 6.0でテスト)
サポート言語
- C/C++
- C#
- Java
- Python
モード
RealSense F455は2つのモードを持ち、用途に応じて切り替えて使用します。
デバイスモード
ユーザーのデータベース管理やデバイスでの照合など、デバイス自体でユーザーの登録や認証を行う場合に使用するモードです。小規模な環境でRealSense F455を1台で使用する場合に適しています。

サーバーモード
PCやクラウドサーバー上のデータベースを用いてユーザーを認証したい場合に使用するモードです。大規模な環境で複数台で連携してユーザー認証する場合に適しています。

アーキテクチャ
RealSenseID SDKはRealSenseID(API)とPacket Manager(セキュア通信)に分かれます。
RealSenseID APIはカメラプレビュー、顔認証、デバイス制御を担当しており、主にこのAPI呼び出して、RealSense F455を操作します。
Packet Manager(セキュア通信)はRealSenseID APIとRealSense F455の通信処理を担当し、通信経路をセキュアに保ちます。

https://github.com/IntelRealSense/RealSenseID から引用
API解説
顔認証する際に基本となるAPIを解説します。
デバイスの接続・切断
デバイス接続する場合はセキュアに接続するため、以下のようにECDSAキーで認証します。
class MySignatureCallback : public RealSenseID::SignatureCallback { public: bool Sign(const unsigned char* buffer, const unsigned int buffer_len, unsigned char* out_sig) override { // ホスト ECDSA 秘密鍵を使用して、バッファに署名 } bool Verify(const unsigned char* buffer, const unsigned int buffer_len, const unsigned char* sig,const unsigned int sign_len) override { // デバイス ECDSA 公開鍵でバッファを確認します。 } }; MySignatureCallback signature_callback; RealSenseID::FaceAuthenticator authenticator {&signature_callback}; // デバイスに接続 Status connect_status = authenticator.Connect({RealSenseID::SerialType::USB, "COM9"}); // デバイスを切断 authenticator.Disconnect();
ユーザーの登録
カメラで撮影したユーザーの顔を、ニューラルネットワークアルゴリズムで処理を行い、顔の特徴量を取得します。これを暗号化してデータベースに保存します。デバイスモードの場合、このデータベースをRealSense F455本体にセキュリティに保護されたストレージに保存します。
class MyEnrollmentCallback : public RealSenseID::EnrollmentCallback { public: void OnResult(const RealSenseID::EnrollStatus status) override { std::cout << "結果: ステータス: " << status << std::endl; } void OnProgress(const RealSenseID::FacePose pose) override { std::cout << "進捗: 姿勢:" << pose << std::endl; } void OnHint(const RealSenseID::EnrollStatus hint) override { std::cout << "ヒント: " << hint << std::endl; } }; const char* user_id = "ASTINA"; MyEnrollmentCallback enrollment_callback; // ユーザーを登録 Status status = authenticator.Enroll(enrollment_callback, user_id);
ユーザーの認証
カメラで撮影したユーザーの顔を、ニューラルネットワークアルゴリズムで処理を行い、顔の特徴量を取得します。この結果とデータベースに登録されている全ての特徴量と比較を行い結果を得ます。
class MyAuthenticationCallback : public RealSenseID::AuthenticationCallback { public: void OnResult(const RealSenseID::AuthenticateStatus status, const char* user_id) override { if (status == RealSenseID::AuthenticateStatus::Success) { std::cout << "ユーザー認証成功 ユーザーID: " << user_id << std::endl; } else { std::cout << "ユーザー認証失敗: ステータス:" << status << std::endl; } } void OnHint(const RealSenseID::AuthenticateStatus hint) override { std::cout << "ヒント: " << hint << std::endl; } }; MyAuthenticationCallback authentication_callback; // ユーザーを認証 Status status = authenticator.Authenticate(authentication_callback);
まとめ
顔認証という一見複雑なプログラミングが必要に思える機能も、RealSense F455とRealSense ID SDKを使用することで、少ないコード量で精度の高い顔認証が可能です。
お手持ちのシステムに顔認証を組み込んで見てはいかがでしょうか?
現行のシステムに顔認証機能を付けたいが、どのように実現できるのか分からないといった場合は、お気軽にASTINAへご相談ください。


投稿者

taguchi
エレキを担当してます。
基板、組み込みソフト、通信技術。