顔認証を行うには(OpenCV)

◆PROCESSING 逆引きリファレンス

 カテゴリー:イメージ処理

顔認証を行うには(OpenCV)

【概要】

最近のAIを用いた画像認識技術は、めざましい発展をしていますね。画像認識として有名なものに顔認証があります。

顔認証用として利用可能なライブラリには、OpenCV(Open Source Computer Vision Library)があります。

OpenCVは様々な言語から利用できるように移植されています。PROCESSING用にも、OpenCV 2.4.5をサポートしたOpenCV for Processingがあります。

ただしサポートしているOpenCVが古いので、とにかく最新版(2019/12現在、OpenCVは4.2.0が最新)が利用したいという人は、OpenCVの本家から最新版をダウンロードして利用しましょう。

なお本家のOpenCV用ライブラリ(jarファイル)とPROCESSING用のライブラリは直接互換性がありません。以下で紹介する解説とソースコードは、本家ライブラリでは利用できないので注意してください。

 

【詳細】

インストールする

OpenCV for Processingは、以下の手順でインストール可能です。

標準エディタのメニューで「スケッチ」->「ライブラリをインポート」->「ライブラリを追加」を選択します。

Contribution Manager画面が表示されるので、Librariesタブの検索窓に「OpenCV」と入力します。

表示されたライブラリを選択し、Installボタン押下します。ダウンロードとインストールが始まります。

2019/12現在、Ver0.5.4がインストールされます。インストールができたら、標準エディタを再起動しておいてください。

OpenCVがインストールされるフォルダは、通常はスケッチファイルの格納場所になります。

スケッチファイルの格納場所は、標準エディタの「ファイル」->「設定」で表示される「スケッチブックの場所」を参照してください。


上記例であれば
D:¥processing-3.5.3¥src¥libraries¥opencv_processing
にインストールされます。

OpenCVがインストールされるフォルダは、顔認証などに用いるカスケードファイル(学習データ)が格納される場所にもなっていますので、事前に調べておきましょう。

 

インスタンスを作成する

まずはOpenCVのインスタンスを作成し、画像認識に用いるカスケードファイルと、解析対象となる画像データを読み込ませます。

インスタンスを作成OpenCV openCV = new OpenCV( PApplet ap, int width, int height);
OpenCV openCV = new OpenCV( PApplet ap, PImage img);

openCV :作成されたインスタンス
ap:PAppletのインスタンス。通常はthisを与える
width:解析画像の横サイズ
height:解析画像の縦サイズ
img:解析対象となる画像データ

インスタンスを作成する際に、直接、解析対象となる画像データを与える事も可能です。

.
画像データではなく画像サイズ(width/height)を指定した場合は、loadImage()メソッドで、OpenCVに解析対象となる画像データを読み込ませます。

画像データを読み込むvoid openCV.loadImage(PImage img);

openCV:OpenCVのインスタンス
img:PROCESSINGの画像データ

OpenCVのインスタンスを作成する際に画像データを指定した場合は、loadImageを行う必要はありません。

loadImageは静止画で利用してもOKですが、主に動画などからリアルタイムで顔を検出したい場合などに利用します。

 

カスケードファイルを指定する

画像認識用のカスケードファイル(学習データ)を読み込ませます。

カスケードファイルは、OpenCVがインストールされたフォルダの
¥library¥cascade-files
に格納されています。

私の例であれば、
D:¥processing-3.5.3¥src¥libraries¥opencv_processing¥library¥cascade-files
にあるxmlファイルがそれです。

デフォルトでインストールされるカスケードファイルには、以下のようなものがあります。

ファイル名 定数 説明
1 haarcascade_clock.xml CASCADE_CLOCK 時計
2 haarcascade_eye.xml CASCADE_EYE 人の目
3 haarcascade_eye_tree_eyeglasses.xml メガネをかけた目
4 haarcascade_frontalface_alt.xml CASCADE_FRONTALFACE 顔検出(正面)
5 haarcascade_frontalface_alt_tree.xml 顔検出(正面)
6 haarcascade_frontalface_alt2.xml 顔検出(正面)
7 haarcascade_frontalface_default.xml 顔検出(正面)
8 haarcascade_fullbody.xml CASCADE_FULLBODY 全身
9 haarcascade_lefteye_2splits.xml 左目
10 haarcascade_lowerbody.xml CASCADE_LOWERBODY 下半身
11 haarcascade_mcs_eyepair_big.xml 両目
12 haarcascade_mcs_eyepair_small.xml 両目
13 haarcascade_mcs_leftear.xml 左耳
14 haarcascade_mcs_lefteye.xml 左目
15 haarcascade_mcs_mouth.xml CASCADE_MOUTH
16 haarcascade_mcs_nose.xml CASCADE_NOSE
17 haarcascade_mcs_rightear.xml CASCADE_RIGHT_EAR 右耳
18 haarcascade_mcs_righteye.xml 右目
19 haarcascade_mcs_upperbody.xml 上半身
20 haarcascade_profileface.xml CASCADE_PROFILEFACE 証明写真の顔
21 haarcascade_righteye_2splits.xml 右目
22 haarcascade_upperbody.xml CASCADE_UPPERBODY 上半身
23 hogcascade_pedestrians.xml CASCADE_PEDESTRIANS 歩行者
24 lbpcascade_frontalface.xml 顔検出(正面)

カスケードファイルは、解析したい内容によって使い分ける必要があります。

これ以外にも、世の中には猫の顔やカワウソの顔(笑)を検出するカスケードファイルを作成した猛者がみえるようです。

自分でカスケードファイルを作成する事も可能なようですから、興味がある人は調べてみるとよいかもしれません。

標準のOpenCVでは任意のフォルダーにあるカスケードファイルを読み込ませることが可能ですが、OpenCV for Processingではカスケードファイルを読み込む場所を変更することができません。

ネットから入手したり自分で作成したカスケードファイルを利用したい場合は、該当ファイルを上記フォルダに格納しておく必要があります。

カスケードファイルの読み込みにはOpenCVクラスが持つloadCascade()メソッドを利用します。

カスケードファイルを読み込むvoid openCV.loadCascade(String cascadeFileName);

openCV:OpenCVのインスタンス
cascadeFileName:ファイル名または定数

カスケードファイルの名前を指定します。

指定にはOpenCVクラスが持つ定数も利用可能ですが、一部のファイルしか定義されていないので、直接ファイル名を指定したほうが良いかもしれません。

 

解析する

画像を解析します。

解析するRectangle[] rects = openCV.detect();

openCV:OpenCVのインスタンス
rects:解析結果

顔認証の解析結果は、JavaのRectangleクラスの配列として戻されます。

 

【関連記事】

  • なし

 


サンプルプログラム

顔認証例:

家族が写った写真から、顔と思われる箇所を検出します。

frontalfaceカスケードファイルでは、顔が正面を向いていない場合や傾いていると、正確に認識しないことがあります。

<出力サンプル>

(画像URL:GAHAG|著作権フリー写真・イラスト素材集 様)

左下の女の子はうまく検出できませんでしたが、概ね良い感じです。

今度はすこし意地悪をして、絵画の顔を認識させてみましょう。


(画像URL:GAHAG|著作権フリー写真・イラスト素材集 様)

なんとか認識できていますね(笑)。

それでは定番(?)のアニメ顔ではどうでしょうか?。

(画像URL:illust-AC 様:大和丸さん)

はい、全滅です・・・。標準のカスケードファイルは、二次元の顔は苦手なようです(汗)。

しかし、諦めるのはまだ早い!。

カスケードファイルを、上記記事で紹介したmczkzkさんのアニメ顔学習ファイル(lbpcascade_animeface.xml)に切り替えます。

その結果は、以下の通り。

(画像URL:illust-AC 様:大和丸さん)

おみごと!。完璧です(笑)。

機械学習は(当たり前ですが)学習データが重要ですね。


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。