顔画像認識

顔画像認識とは?

顔画像認識とはコンピュータビジョンにおけるパターン認識の一種で、顔画像解析、Face Detection、Face Trackingなどとも呼ばれている。カメラ画像(2次元や3次元)を解析することでコンピュータに人間の目のような認識力をもたせることを目的としたコンピュータビジョンに関わる技術である。人工知能を利用した画像認識技術も登場しているがここでは扱わない。

セキュリティシステムやコミュニケーションロボットのユーザ認識だけでなく、デジタルサイネージや感情認識を取り入れたアプリケーションなど、応用範囲が広がっている。

Back To Top

OpenCVの利用

本演習ではOpenCVとを利用する。Open CVはコンピュータビジジョン(CV)に関するライブラリセットであり、顔画像認識以外にも様々な画像に関する機能が実装されている。

OpenCVの顔画像認識機能はパターン認識であり、もとになるパターンデータが存在する。顔の要素を抽出したデータがライブラリの中に用意されており、このデータとカメラ画像のマッチングを行うことで顔と認識させる。今回はhaarcascade_frontalface_alt.xmlというデータを用いるが、他にも目や鼻、上半身や下半身といったように、人間の体の様々な部分を認識させることもできる。

下図はOpenCVに用意されているパターンデータリスト。

Back To Top

プログラムの動作環境

本講義ノートで紹介するプログラム(スケッチ)の動作確認は以下の環境で行っている。

OS: macOS Sierra(10.12.6)
Processing:バージョン3.3.5
OpenCVライブラリ:OpenCV for Processing
ビデオライブラリ:Video

OpenCVとVideoライブラリの追加は、スケッチメニュー>ライブラリをインポート>ライブラリを追加から行うことができる。

Back To Top

サンプルスケッチ

ファイルメニュー>サンプルをクリックする。

Contributed Libraries>OpenCV for Processingを開くとたくさんのサンプルが用意されている。
ダブルクリックしてスケッチを開き、Runすることで実験できる。

ただし、これらのサンプルはOpenCVに関する知識を必要とするので、OpenCVによる画像処理入門(講談社)などで学習する必要がある。

Back To Top

BackgroundSubstraction(背景差分)

背景差分では、背景画像と異なる部分の領域を判定する。単純は判定では天候の変化などの影響を受けやすいため、一定時間毎の背景画像の更新を必要とする。安定した背景画像が得られる場合に利用できる。

Back To Top

BrightnessContrast(明度)

マウスを左右に動かすことで、画像の明るさを変更できる。

Back To Top

FindEdges(輪郭抽出)

画像の輪郭抽出を行う。

OpenCVでは画像認識だけでなく、画像処理に関するライブラリも多数含まれる。

Back To Top

FaceDetection(顔画像認識)

本演習の本題となる顔画像認識のスケッチ。

以下にソースコードを解説する。

import gab.opencv.*; //OpenCVライブラリの読み込み
import java.awt.Rectangle;

OpenCV opencv; 
Rectangle[] faces;

void setup() {
  opencv = new OpenCV(this, "test.jpg"); //解析対象画像の読み込み
  size(1080, 720); //ウィンドウサイズの指定

  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); //パターンデータの読み込み
  faces = opencv.detect(); //顔画像認識処理
}

void draw() {
  image(opencv.getInput(), 0, 0); //入力画像の描画

  noFill(); //塗りなし
  stroke(0, 255, 0); //線の色
  strokeWeight(3); //線の太さ
  for (int i = 0; i < faces.length; i++) { //複数の顔画像にも対応
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);//矩形描画
  }
}

ここでパターンデータを変更してみよう。
11行目のCASCADE_FRONTALFACE部分を変更する。

opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);

CASCADE_FRONTALFACE:顔
CASCADE_EYE:目
CASCADE_MOUTH:口
CASCADE_NOSE:鼻

これ以外の設定は、ウェブ上に公開されているリファレンス参照。

Back To Top

LiveCamTest(顔画像認識ビデオ版)

Runして実験してみよう。

FaceDetectionスケッチと異なり、カメラからの入力によって動的な顔画像認識を行う。

以下にソースコードを解説する。

import gab.opencv.*; //OpenCVライブラリの読み込み
import processing.video.*; //Videoライブラリの読み込み
import java.awt.*;

Capture video;
OpenCV opencv;

void setup() {
  size(640, 480);
  video = new Capture(this, 640/2, 480/2); //Videoの初期化 1/2しているのは処理を軽くするため
  opencv = new OpenCV(this, 640/2, 480/2); //OpenCVの初期化
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); //パターンデータの読み込み

  video.start(); //Videoの開始
}

void draw() {
  scale(2); //初期化の時点で1/2サイズになっているので2倍に拡大
  opencv.loadImage(video); //VideoをOpenCVに入力

  image(video, 0, 0 ); //Videoの描画

  noFill(); //塗りなし
  stroke(0, 255, 0); //線の色
  strokeWeight(3); //線の太さ
  Rectangle[] faces = opencv.detect(); //顔画像認識処理
  println(faces.length); //顔の数デバッグ

  for (int i = 0; i < faces.length; i++) { //複数の顔の対応
    println(faces[i].x + "," + faces[i].y); //顔の座標デバッグ
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height); //矩形描画
  }
}

void captureEvent(Capture c) { //Videoキャプチャー処理
  c.read();
}

FaceDetectionと同様にパターンデータを変更してみよう。
12行目のCASCADE_FRONTALFACE部分を変更する。

opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);

CASCADE_FRONTALFACE:顔
CASCADE_EYE:目
CASCADE_MOUTH:口
CASCADE_NOSE:鼻
CASCADE_UPPERBODY:上半身
CASCADE_LOWERBODY:下半身
CASCADE_FULLBODY:全身
CASCADE_CLOCK:時計

Back To Top

顔の置き換え実験

LiveCamTestのスケッチを改造して、顔を画像で置き換えるプログラムを作成した。

 

①スケッチの準備

以下のコードを空のスケッチにコピー&ペーストして、スケッチを保存する。

import gab.opencv.*; //OpenCVライブラリの読み込み
import processing.video.*; //Videoライブラリの読み込み
import java.awt.*;

Capture video;
OpenCV opencv;
PImage img;
float size = 1.5; //置換画像サイズ

void setup() {
  size(640, 480);
  video = new Capture(this, 640/2, 480/2); //Videoの初期化 1/2しているのは処理を軽くするため
  opencv = new OpenCV(this, 640/2, 480/2); //OpenCVの初期化
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE); //パターンデータの読み込み
  img = loadImage("face.png"); //置換画像の指定 スケッチフォルダ内のdataフォルダ内に配置
  video.start(); //Videoの開始
}

void draw() {
  imageMode (CORNER);
  scale(2); //初期化の時点で1/2サイズになっているので2倍に拡大
  opencv.loadImage(video); //VideoをOpenCVに入力
  image(video, 0, 0 ); //Videoの描画
  Rectangle[] faces = opencv.detect(); //顔画像認識処理

  //置換画像の表示
  imageMode (CENTER);      
  for (int i=0; i < faces.length; i++) { //顔の数だけ繰り返す
      image(img, faces[i].x + faces[i].width /2, faces[i].y + faces[i].height /2, faces[i].width * size, faces[i].width * size * img.height/img.width );
  }
}

void captureEvent(Capture c) { //Videoキャプチャー処理
  c.read();
}

 

②置換画像の準備

スケッチメニュー>スケッチフォルダを開く。
下画像を保存してスケッチフォルダのdataフォルダ内に入れる。Macであればブラウザ上からドラック&ドロップすることが可能。

 

③実験

スケッチをRunして、顔が画像に置き換わっているか試してみよう。

Back To Top

置換画像の制作

前述のface.pngをPhotoshopで編集して、オリジナルの置換画像を試してみよう!

Back To Top

デジタルサイネージへの応用事例

しくみデザインでは、この顔画像認識を使って様々なデジタルサイネージを提案している。

Back To Top

より高度な顔画像認識技術

FaceTrackerは、Jason Saragih氏の研究成果であるDeformable Model Fitting by Regularized Landmark Mean-Shiftを実装したもので、顔の特徴点を追跡する技術。Kyle McDonald氏がopenFrameworksのアドオンofxFaceTrackerとして公開している。

Face Substitution from Kyle McDonald on Vimeo.

下映像は最新の表情解析技術と画像処理技術を組み合わせたもの。このような技術は映画やアニメーションキャラクターの表情コントロールに使われていたが、より細かい動きが再現可能になったことで、一見すると本物だと感じる域に達しつつある。高精細な表現がリアルタイム動作可能になれば、VR技術と融合することで映画『サロゲート』のような世界が登場するだろう。

Back To Top