◆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, PImage img);
openCV :作成されたインスタンス
ap:PAppletのインスタンス。通常はthisを与える
width:解析画像の横サイズ
height:解析画像の縦サイズ
img:解析対象となる画像データ
インスタンスを作成する際に、直接、解析対象となる画像データを与える事も可能です。
1 2 3 4 5 6 7 |
PImage p5img; OpenCV openCV; //画像データを読み込む p5img = loadImage("gahag-0080277957-1.jpg"); //OpenCVのインスタンスを作成する openCV = new OpenCV(this, p5img); |
.
画像データではなく画像サイズ(width/height)を指定した場合は、loadImage()メソッドで、OpenCVに解析対象となる画像データを読み込ませます。
画像データを読み込むvoid openCV.loadImage(PImage img);
openCV:OpenCVのインスタンス
img:PROCESSINGの画像データ
OpenCVのインスタンスを作成する際に画像データを指定した場合は、loadImageを行う必要はありません。
1 2 3 4 5 6 7 8 9 |
PImage p5img; OpenCV openCV; //画像データを読み込む p5img = loadImage("gahag-0080277957-1.jpg"); //OpenCVのインスタンスを作成する openCV = new OpenCV(this, 500, 700); //解析対象画像を指定する openCV.loadImage( p5img ); |
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 | 顔検出(正面) |
カスケードファイルは、解析したい内容によって使い分ける必要があります。
これ以外にも、世の中には猫の顔やカワウソの顔(笑)を検出するカスケードファイルを作成した猛者がみえるようです。
自分でカスケードファイルを作成する事も可能なようですから、興味がある人は調べてみるとよいかもしれません。
- rest term.com様:ねこと画像処理
- Aidemy Blog様:世界一いらない人工知能??OpenCVを用いたカワウソ分類器作成奮闘記
- Qiita様:OpenCVでアニメの顔検出:@mczkzkさん
標準のOpenCVでは任意のフォルダーにあるカスケードファイルを読み込ませることが可能ですが、OpenCV for Processingではカスケードファイルを読み込む場所を変更することができません。
ネットから入手したり自分で作成したカスケードファイルを利用したい場合は、該当ファイルを上記フォルダに格納しておく必要があります。
カスケードファイルの読み込みにはOpenCVクラスが持つloadCascade()メソッドを利用します。
カスケードファイルを読み込むvoid openCV.loadCascade(String cascadeFileName);
openCV:OpenCVのインスタンス
cascadeFileName:ファイル名または定数
カスケードファイルの名前を指定します。
1 2 |
//カスケードファイル(顔認証用)を指定する openCV.loadCascade(OpenCV.CASCADE_FRONTALFACE); |
指定にはOpenCVクラスが持つ定数も利用可能ですが、一部のファイルしか定義されていないので、直接ファイル名を指定したほうが良いかもしれません。
解析する
画像を解析します。
解析するRectangle[] rects = openCV.detect();
openCV:OpenCVのインスタンス
rects:解析結果
顔認証の解析結果は、JavaのRectangleクラスの配列として戻されます。
【関連記事】
- なし
サンプルプログラム
顔認証例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/** * PROCESSING 3.0 OpenCV Sample * @auther MSLABO * @version 2019/12 1.0 */ import gab.opencv.*; import java.awt.Rectangle; PImage p5img; OpenCV openCV; Rectangle rects[]; void setup(){ size(500,700); //OpenCVのインスタンスを作成する p5img = loadImage("gahag-0080277957-1.jpg"); openCV = new OpenCV(this, p5img); //カスケードファイルを指定 openCV.loadCascade("haarcascade_frontalface_alt.xml"); //解析する rects = openCV.detect(); } void draw(){ background( p5img ); //顔のある場所に黄色の四角を描く noFill(); stroke(255,255,0); strokeWeight(2); for( Rectangle r: rects ){ rect( r.x, r.y, r.width, r.height ); } } |
家族が写った写真から、顔と思われる箇所を検出します。
frontalfaceカスケードファイルでは、顔が正面を向いていない場合や傾いていると、正確に認識しないことがあります。
<出力サンプル>
(画像URL:GAHAG|著作権フリー写真・イラスト素材集 様)
左下の女の子はうまく検出できませんでしたが、概ね良い感じです。
今度はすこし意地悪をして、絵画の顔を認識させてみましょう。
(画像URL:GAHAG|著作権フリー写真・イラスト素材集 様)
なんとか認識できていますね(笑)。
それでは定番(?)のアニメ顔ではどうでしょうか?。
(画像URL:illust-AC 様:大和丸さん)
はい、全滅です・・・。標準のカスケードファイルは、二次元の顔は苦手なようです(汗)。
しかし、諦めるのはまだ早い!。
カスケードファイルを、上記記事で紹介したmczkzkさんのアニメ顔学習ファイル(lbpcascade_animeface.xml)に切り替えます。
その結果は、以下の通り。
(画像URL:illust-AC 様:大和丸さん)
おみごと!。完璧です(笑)。
機械学習は(当たり前ですが)学習データが重要ですね。
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。