OpenCV 2.3.1のPC版でカスケードファイルを作って、Androidで使ってみよう...という目論見です。

OpenCV覚書のページでは、カスケードを作るのにHaar-likeのみを使っていましたが、今回はLBPをやってみます。

AndroidのOpenCV 2.3.1はLBPのカスケードを読むみたいですし...。



目次



OpenCV 覚書

WindowsでOpenCV 2.3.1を使う準備

LBPカスケードのサンプル(アニメ顔検出)とPythonコード

LBPカスケードを作ってみる



TOP


WindowsでOpenCV 2.3.1を使う準備

用意するもの

  ●OpenCV 2.3.1
   
OpenCV-2.3.1-win-superpack.exe(Windows版)

  ●intel TBB(並列処理用)
    tbb40_20120408oss_win.zip

  ●Python
    Windows x86 MSI Installer (2.7.3)

  ●numpy(Python用数学ライブラリ)
    numpy-1.6.2-win32-superpack-python2.7.exe (5.7 MB)

  ●CMake(Visual Studio用のプロジェクト作成)
    cmake-2.8.8-win32-x86.exe(Windows用Binary Distribution)

  ●Visual C++ 2010
    無ければ、無償のExpress Editionでも可
    Expressの場合、起動時に登録キーを要求してきます。キー取得にはWindows LiveのIDとパスが必要なので、まだの方は事前に取得しておきましょう。
    Visual C++ 2010 Express Edition

Express Editionが有料版と異なるのは、リモートデバッグ・バージョン管理・マクロ・アドイン・Mobile用アプリ開発機能などはない、ということです。

今回のように、プロジェクトファイルをビルドする分には問題ありません。


1:OpenCV 2.3.1をダウンロードして、インストール

ダウンロードしたものを解凍して、適当なドライブにコピー(例:C:¥OpenCV231)

2:intel TBBをダウンロードして、インストール

ダウンロードしたものを解凍して、適当なドライブにコピー(例:C:¥tbb40)

今回はVisual Studio 2010を使うので、

C:¥tbb40¥bin¥ia32¥vc10にあるdllファイルをすべて、C:¥OpenCV231¥build¥x86¥vc10¥binへコピー

3:Pythonをダウンロードして、インストール

インストール後、環境変数に登録。

4:numpyをダウンロードして、インストール

これをインストールしておかないと、CMakeはPythonモジュール用のコードを吐き出してくれません。

5:CMakeをダウンロードして、インストール

6:必要ならVisual C++ 2010 Express Editionをインストール


まず、Visual Studio用のプロジェクトを作ります。

C:¥OpenCV231フォルダーの中に、ビルド用のフォルダーを作成(例:C:¥OpenCV231¥rebuild)

CMakeを起動します。

もし、管理者権限を持たないユーザーでログインしている場合、

スタートメニュ -> CMake 2.8 -> CMake(cmake-gui)

ここで、右クリックして、「別のユーザーとして実行」

Administratorとして実行してください。





Where is the source code:の欄には、C:¥OpenCV231

Where to build the binaries:の欄には、C:¥OpenCV231¥rebuild





で、「Configure」ボタンをクリック。2010を選びます。





BUILD_NEW_PYTHON_SUPPORTのチェックとPYTHON_PATHを確認。

TBBを使うので、WITH_TBBにチェックして「Configure」。





途中で、警告が出たら、赤丸のとこらへんをクリックして、場所を教えてあげましょう。






INCLUDE --> C:¥tbb40¥include。
「Configure」。
LIB --> C:¥tbb40¥lib¥ia32¥vc10。
「Configure」。

で、最後に、
「Generate」
プロジェクトの作成が終わったら、Visual Studioでビルドします。

スタートメニュ -> Visual C++ 2010

ここで、右クリックして、「別のユーザーとして実行」

Administratorとして実行してください。

画面が開いたら、ファイル -> 開く->プロジェクト/ソリューション

開くのは、C:¥OpenCV231¥rebuild¥OpenCV.sln

ファイルの解析に結構な時間がかかります。準備完了のステータスが安定するまで待ちましょう。

ソリューション構成 を Releaseにします。
(メニュの「ツール」の下あたりにあります。デフォルトではDebugになっています)

また解析が始まりますが、すぐ終わります。

メニュのデバッグ -> ソリューションのビルド

追記

ビルド終了後、

C:¥OpenCV231¥rebuild¥bin¥Releaseにパスを通す。

Python用

C:¥OpenCV231¥rebuild¥lib¥Release¥cv2.pydを,<Pythonのインストールフォルダー>¥Lib¥site-packages直下にコピー。



Samplesを使ってみる場合、C:¥OpenCV231¥rebuildにコピー。
ただし、Pythonの中のものを実行する場合は、参照用のパスが実際と違うので修正する必要があります。Python2はそのままでも動作するものが多いです。

facedetect.pyなどでは、お約束のレナ・ソーダバーグの写真を使ってますが、顔以外に目も検出してますね...。



以上です。



CMakeの構成が同じなのに、VC++はビルドに時々失敗することがあるような....気のせいかな?
(特に、Python系のものが...)



工事中


TOP


LBPカスケードのサンプル(アニメ顔検出)とPythonコード

では実際に動くのか試してみます。

カスケードは
この方 がお作りになったものを使ってみます。

lbpcascade_animeface.xmlです。

検出用の顔のサンプルはこれ。





で、結果はこんな感じ(Python、PC + Webカメラ)。





PythonのコードはSamplesのものを修正して使ってみました。

【anime_facedetect.py】

import numpy as np
import cv2
import cv2.cv as cv
from video import create_capture
from common import clock, draw_str

help_message = '''
USAGE: facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>]
'''

def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30), flags = cv.CV_HAAR_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:,2:] += rects[:,:2]
    return rects

def draw_rects(img, rects, color):
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

if __name__ == '__main__':
    import sys, getopt
    print help_message
    
    args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade='])
    try: video_src = video_src[0]
    except: video_src = 'synth:bg=../cpp/anime_face.jpg:noise=0.05'
    args = dict(args)
    cascade_fn = args.get('--cascade', "../../data/lbpcascades/lbpcascade_animeface.xml")
    cascade = cv2.CascadeClassifier(cascade_fn)

    cam = create_capture(video_src)

    while True:
        ret, img = cam.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.equalizeHist(gray)
        
        t = clock()
        rects = detect(gray, cascade)
        vis = img.copy()
        draw_rects(vis, rects, (0, 255, 0))
        for x1, y1, x2, y2 in rects:
            roi = gray[y1:y2, x1:x2]
            vis_roi = vis[y1:y2, x1:x2]
        dt = clock() - t

        draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))
        cv2.imshow('facedetect', vis)

        if cv2.waitKey(5) == 27:
            break




Androidではこんな感じ。

Eclipse用のプロジェクト(for Android)







TOP


LBPカスケードを作ってみる

まず、参照するドキュメントはここ。

Cascade Classifier Training

HarrとLBPの両方について書かれています。内容としては......

●トレーニングデータの準備として、opencv_createsamples.exeの使い方。
     vecファイルの作成。

●ポジティブ画像とネガティブ画像の配置の仕方や、データについて記述したファイルの作り方。

●カスケード・トレーニング用コマンドの記述方法。
     (LBPカスケードを作るコマンド)opencv_traincascade.exeの引数のセットの仕方など。



コマンド発行用のコンソールアプリは、このページの例だと、

C:\OpenCV231\rebuild\bin\Release

にあります。

**********************************************************************


vecファイルの作成
opencv_createsamples


●検出用の画像が1枚しかない場合(例:sample.png)

この画像を回転させたり、拡大・縮小したりした多くのパターンでvecファイルを作成します(例:sample.vec)。

背景が白で44x18の画像(sample.png)をベースに、4000パターン用意して作成。
opencv_createsamples.exe -img sample.png -vec sample.vec -num 4000 -bgcolor 255 -w 44 -h 18 -show


-showのオプションはつけないほうがいいかもです。
このオプションがあると、各サンプルが別窓で表示されますが、プロセスがいつまでたっても終わらない感じです。
これがない場合は、プロセスが%で表示されますが、こちの方が速いです。

●サンプル画像がたくさんある場合

OKフォルダーを作って、そこにサンプルを格納(このような画像をポジティブ画像といいます)。

各画像の中で、対象が映っている領域を指定したファイル(OK.txt)を作成します。

フォーマット
<画像パス> <スペース> <取得数> <タブ> <左上(X)> <スペース> <左上(Y)> <スペース> <幅> <スペース> <高さ>


OK/image_0001.jpg 1 113 32 163 150
OK/image_0002.jpg 1 0 0 299 300
OK/image_0004.jpg 1 0 0 300 225
      ・
      ・

NGフォルダーを作って、そこに検出対象が映っていない画像を格納(このような画像をネガティブ画像といいます)。

データファイル(NG.txt)を作成します。

フォーマットは画像パスのみ。


NG/image_0001.jpg
NG/image_0002.jpg
NG/image_0003.jpg
NG/image_0004.jpg
      ・
      ・

opencv_createsamples.exe -info OK.txt -vec sample.vec -num 63 -bg NG.txt

63はポジティブ画像の数。

468はネガティブ画像の数。

**********************************************************************


カスケード作成
opencv_traincascade


BALLという名前のフォルダーを作成。カスケードはこの中に作成されます。

opencv_traincascade.exe -data BALL -vec sample.vec -bg NG.txt -numPos 63 -numNeg 468 -featureType LBP -bt LB

これを走らせてみたところ、19ステージあたりで、

Required leaf false alarm rate achieved. Branch training terminated.

というメッセージをはいて終了。

このメッセージは、サンプル数が少ない場合や、画像数が違っているような場合に出るらしい。

ちょっと調べてレポートします。

**********************************************************************


注意点

segmentation faultで落ちる場合
(opencv_haarliketrainingの場合だけど、opencv_traincascadeでも出るかも)

ネガティブ画像の実体がない場合。
すべてのネガティブ画像は、ポジティブ画像のタテヨコ2倍以上の大きさが必要。





矩形領域の座標を取得するページ

ポジティブ画像のデータ作成支援用。

haartraining用となっていますが、LBPでも同じです。




他のOpenCV関連ページ

OpenCV覚書

アンドロイドでOpenCV(お顔の検出)

アンドロイドでOpenCV(色検出)

アンドロイドでOpenCV(特徴点検出)

Android OpenCV 2.3.1で画像認識

AndroidでOpenCV 2.4.6を使ってみる

OpenCV + NyMMDで初音ミクさんにご挨拶してもらいます

Android OpenCV 2.4.6 の顔検出アプリを一から作ってみる



Under construction

TOP