読者です 読者をやめる 読者になる 読者になる

yamaguchi.txt

開発日記。備忘録代わりだよ。

カメラから取得した映像にdlibを用いた顔認識をする。

作ったもの

dlibの実装を用いて、selective searchしたそれぞれの領域に対して(全画像領域みたいです)HOG特徴量を取ってSVMを使った物体認識を行っています。
処理の流れとしては、

selective searchを用いて物体認識をかける画像領域を切り出す。

それぞれの領域に対してHOG特徴量を取ってSVMを用いて物体認識を行う。

selective searchとは、画像中の似たような領域を一つの物体として認識して、物体の候補を提案するアルゴリズムです。
HOG特徴量は入力画像から計算したエッジ画像に対して、各ブロック領域ごとの方位ヒストグラムを計算したものです。(画像はここから)
f:id:yamaguchi_1024:20151115155658j:plain

今回は教師用データを自前で作成し、dlibというライブラリに突っ込んでいます。

opencvとdlibのインストール

Ubuntu14.04にOpenCVをインストールする

この記事を参考にしました。これに沿ってインストールすればできますが、latestのopencv(3.0)をインストールするのはレファレンス少ないし使いづらかったのであまりおすすめできません。opencv2.4.10をインストールします。

git cloneします。

$ git clone https://github.com/jayrambhia/Install-OpenCV.git
$ cd Install-OpenCV/Ubuntu
$ cd Install-Opencv/Ubuntu/2.4

 に移動し、

./opencv2_4_10.sh

 する。

だいぶ時間がかかります。インストールが終わったら、pythonはそのままでも動きますが、C++を実行したくなった時は
この記事を参考にして

g++ -o main main.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

こういう感じにすれば実行できます。

dlibのインストール

この記事を参考にしました。

dlibからダウンロードして解凍して、インストールしています。

$ wget http://sourceforge.net/projects/dclib/files/dlib/v18.10/dlib-18.10.tar.bz2
$ tar xf dlib-18.10
$ cd dlib-18.10/python_examples/
$ sudo apt-get install libboost-python-dev cmake
$ ./compile_dlib_python_module.bat 
$ sudo cp dlib.so /usr/local/lib/python2.7/dist-packages/

顔認識ができるまで

教師用データを作成する際に、mogrify,fehを使いました。画像を回転させたりサイズを変更したりするときにとても便利です。
mogrify,fehのインストール

$ sudo apt-get install imagemagick
$ sudo apt-get install feh

教師用データの作成、検出器の作成はkivaさんの記事の通りにやりましょう。でもxmlに変換する前に行頭にobjectの数書き足さないといけませんでした。
Cは5で変えなくてもいい感じにできました。

内蔵カメラからリアルタイムで顔認識するようにしたので、そのスクリプトを貼ります。
同じディレクトリにdetector.svmを入れときましょう。

#!/usr/bin/python

import os
import sys

import dlib
from skimage import io

import cv2


detector = dlib.simple_object_detector("detector.svm")
cap=cv2.VideoCapture(0)
if not cap.isOpened():
    raise Exception, 'video not found'

while(cap.isOpened()):
   cv2.waitKey(1)
   ret,frame = cap.read()
   dets = detector(frame)
   for d in dets:
    cv2.rectangle(frame, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255), 2)
   cv2.imshow("nyan",frame)

   k=cv2.waitKey(1) & 0xFF
   if k==ord('q'):
  sys.exit()
結果

C=5でもかなり精度が高く、正面を向いていれば誤判定もなく認識出来ました。顔出しが怖くなければ動画を投稿したかった。