JCV 社の顔認証 SDK でリアルタイム顔認証アプリを実装する:1 … SDK 紹介編

Pocket

日本コンピュータビジョン株式会社 (JCV) より、 顔認証 SDK をご提供いただきました。

今回より数回に分けて、こちらの SDK を使用した Java 製の 顔認証アプリ を実装していき、その機能をご紹介します。

JCV 顔認証 SDK とは

JCV 社の「顔認証 SDK」は、SenseTime 社の顔認識・トラッキング技術を活用したライブラリです。

画像や動画中の複数の顔に対し、正確かつ高速に顔認識・トラッキングを行う API を提供しています。

この SDK を使用すると、次のような顔認識を行う Java アプリが作成できます。

顔認識を行っている様子

↑ 顔認証 SDK を使用した Java アプリで顔認識を行っている様子。

顔認証 SDK でできること

「顔認証 SDK」は、人の顔を認識し、個人を特定できるライブラリです。同様なライブラリはいくつかありますが、JCV 顔認証 SDK のアルゴリズムは、

  • 横顔
  • マスクなどで一部が隠れた顔
  • ぼやけてしまっているキャプチャ画像

など、 不明瞭な顔情報からも正確な顔認識が可能 な点が特徴です。

マスクをしていても顔認識ができます

↑ マスクをしていても顔認識ができます。

静止画だけでなく、 動画 やウェブカメラのキャプチャ映像などからの顔面トラッキングも大変 高速 に動作します。

また、対象が「非生体」かどうかを見抜く 生体認証 機能もあります。これにより、ポスターの顔写真や 3D マスクなどによるなりすましを検知し、不正な顔認証を防げます。

スマホでかざした画像は非生体と見抜きます

↑ スマホでかざした画像は非生体と見抜きます。

考えられるユースケース

SDK の機能や特徴を、利用者目線から見てみます。この SDK を使うとどんな仕組みが作れるでしょうか。

1. 会員の本人確認を行う

店舗の会員認証を想定します。

予め、会員登録の際に顔写真を撮影し、この SDK を使って顔の特徴を分析しておきます。

そして、店舗に訪れたお客様の顔をカメラで撮影し、SDK で顔の特徴を比較します。「1 人のお客様」を「N 人の会員データ」の中から検索する、 1:N 認証 となります。

この SDK ならお客様がマスクをしたままでも認識できますし、会員カードを手渡ししたりする必要もありません。会員カードを不正に使い回した成りすましも防止できます。

証明写真などと比較できます

↑ 証明写真などと、ウェブカメラで撮影した顔写真とを比較したり。

2. 来場者の会員・非会員をリアルタイムに見分ける

ユースケース 1. と同様に、予め会員の顔写真を撮影し、SDK で分析しておきます。

次に、店舗の入口などにウェブカメラ (ネットカメラ) を設置し、複数のお客様を動画で撮影します。SDK はリアルタイムに複数の人物の顔をトラッキングし、それぞれ会員データから検索を行います。「N 人のお客様」を「N 人の会員データ」の中から検索する、 N:N 認証 となります。

顔トラッキング処理自体は、会員か否かに関わらず可能です。トラッキングしたそれぞれの顔について会員データから検索し、酷似する会員データが特定できれば「会員」とみなし、どの会員データとも照合できなかった場合は「非会員」とみなします。

こうすることで、来場者全体のうち、会員の割合がどのくらいで、非会員がどのくらい来場しているか、といった情報をリアルタイムに確認できます。トラッキングした会員情報を保存していけば、会員の来場日時や頻度も確認できますから、その後様々な用途にデータを利用できるでしょう。

顔は認識できても、特定の人物と判断できなかった場合

↑ 顔は認識できても、特定の人物と判断できなかった場合。「Unknown」と表示しています。

なお、「リアルタイムに」と書きましたが、SDK の仕組みとしては必ずしもリアルタイムである必要はありません。ウェブカメラからの映像を取得するのではなく、事前にビデオカメラで撮影しておいた動画ファイルや画像ファイルを読み込ませての分析も可能です。

動作条件

この SDK を動作させるための条件を簡単にご説明します。

JCV 社にご提供いただいた Java 版の SDK は、 Ubuntu Linux 上で動作保証されています。内部的に .so 形式のネイティブライブラリを用いているので、そのままでは Windows 上での動作は難しいと思われます。弊社オープンストリームでは、VirtualBox 上に構築した Ubuntu 18.04 環境にて動作確認できております。

また、SDK 本体には、ウェブカメラの映像や画像データを取得する処理がありませんので、キャプチャのために OpenCV を組み合わせます。

必須なのはこのぐらいで、その他は個別の環境に応じて必要なライブラリを用意します。会員データを JSON 形式で扱うのであれば gson などのライブラリ、DB に読み書きするのであれば JDBC や ORM を用意する、といった流れです。

動作環境構築

それでは、この SDK を使った Java アプリを実装していくため、環境構築していきましょう。各手順の詳細は省きますのでご容赦ください。

1. VirtualBox で Ubuntu 環境を構築する

まずは Ubuntu 環境を構築します。今回は VirtualBox と Vagrant を利用し、GNOME デスクトップ環境を使えるようにしておきます。

サンプルアプリではウェブカメラを利用するため、USB 機能を ON にしておきます。VirtualBox の Extension Pack も必要になるかと思いますので、インストールしておきましょう。

VirtualBox で Ubuntu・GNOME デスクトップ環境を作りました

↑ VirtualBox 上に Ubuntu・GNOME デスクトップ環境を作りました。

2. JDK をインストールする

続いて Ubuntu 環境に JDK をインストールします。今回は JavaFX で GUI アプリを作ろうと考えていますが、最近の JDK には JavaFX のライブラリが同梱されていません (OpenJFX プロジェクトに分離されている)。

今回は手順を簡単にするため、JavaFX ライブラリが JDK 本体に同梱されている、JDK 1.8 (Java 8) を利用したいと思います。SDK の動作保証環境としても Java 8 までしか明記されていないので、ひとまずは Java 8 を利用します。

Oracle の公式サイトから Linux 版をダウンロードしインストールします。そして環境変数 JAVA_HOMEJRE_HOMECLASSPATHPATH あたりを通しておきましょう。

3. OpenCV をインストールする

JDK をインストールしたら、OpenCV をインストールし、JAR ライブラリを取得します。今回は、動作保証されている v3.2.0 を使用します。OpenCV はソースコードからビルドしてインストールしますが、若干つまづいたところがあるのでその点だけ記載します。

JAR ファイルを生成させるには、JDK や Ant などがインストールされている必要があります。事前に以下のコマンドで依存パッケージをインストールしておきます。

$ sudo apt-get install -y build-essential pkg-config python-dev cmake ant libopenblas-dev liblapacke-dev

OpenCV をダウンロードします。GitHub よりソースコードを取得します。

$ wget https://github.com/opencv/opencv/archive/3.2.0.zip -O opencv-3.2.0.zip

ダウンロードした opencv-3.2.0.zip を解凍し、配下に build/ ディレクトリを作成、 build/ ディレクトリに移動して cmake を実行します。

# カレントディレクトリである build/ ディレクトリの一つ上の階層「.. (= ../)」を基準に cmake を実行する
$ cmake -DCMAKE_BUILD_TYPE=RELEASE -DMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF -DWITH_FFMPEG=OFF ..

# 処理が完了したら、コンソール出力の以下の部分に「java」が含まれていることを確認する
# 「java」がない場合は JAR ファイルが生成されない
--   OpenCV modules:
--     To be built:                 core flann imgproc ml photo video imgcodecs shape videoio highgui objdetect superres ts features2d calib3d java stitching videostab

続いて make コマンドを実行しますが、ココでエラーが発生するかと思います。

# 「-j」オプションは並列処理する数。CPU のコア数に応じて指定すると処理が早く終わります
$ make -j4

# 恐らく次のようなエラーが出て途中で終了する
[ 41%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/hal_internal.cpp.o
In file included from /home/vagrant/jcv/opencv-3.2.0/modules/core/src/hal_internal.cpp:49:0:
/home/vagrant/jcv/opencv-3.2.0/opencv_lapack.h:2:10: fatal error: LAPACKE_H_PATH-NOTFOUND/lapacke.h: そのようなファイルやディレクトリはありません
 #include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
modules/core/CMakeFiles/opencv_core.dir/build.make:522: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/src/hal_internal.cpp.o' failed
make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/src/hal_internal.cpp.o] Error 1
make[2]: *** 未完了のジョブを待っています....
CMakeFiles/Makefile2:1401: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/all' failed
make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2

SDK と一緒にご提供いただいたドキュメントに、対処法が記載されていました。

# 次のファイルを開く
$ vi ./opencv_lapack.h

opencv_lapack.h というファイルには、次のような行があると思います。

#include "LAPACKE_H_PATH-NOTFOUND/lapacke.h"

この行を、以下のように修正します。

#include "lapacke.h"

そうしたら、再度 make コマンドを実行します。今度は正常終了するはずです。

$ make -j4

コンパイルが終わったらインストールを行います。

$ sudo make install

正常に終了すると、次の JAR ファイルが生成されているはずです。この JAR ファイルを、Java プロジェクトの依存ライブラリとして使用します。

  • ./bin/opencv-320.jar

そして、ネイティブライブラリ .so ファイルも生成されていますので、これを /usr/lib/ 配下にコピーすることで、PATH を通しておきます。

$ sudo cp ./lib/libopencv_java320.so /usr/lib/

ここまでで OpenCV のインストールは完了です。

#@ 4. SDK をインストールする

SDK に同梱されているネイティブライブラリの2ファイルを、PATH が通っているところ (/usr/lib/) に配置します。

$ sudo cp libstidface_professional.so.2.0.5 /usr/lib/libstidface_professional.so
$ sudo cp libjni_facepro.so /usr/lib/libjni_facepro.so

SDK には StidFaceProfessional.jar という JAR ファイルが同梱されているので、これを Java プロジェクトの依存ライブラリとして使用します。

まとめ

記事が長くなってきたので、今回はここまでとします。

  • JCV 社の顔認証 SDK は、任意の画像・映像データから人物の顔を識別・トラッキングし、顔認証が実現できる
  • Java ベースで実装できる
  • ウェブカメラのキャプチャなど、画像取り込みには OpenCV を使用すると楽

次回は、構築した環境をベースに Java アプリを実装し、どのように動作するかをお見せします。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です