2012年12月31日月曜日

Mastering OpenCVの第8章の顔認識のメモ step2 後半

Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。
今回は、Step2の、顔認識の精度を高めるための前処理に関しての続き

顔と両目の検出ができた場合、両目の位置をそろえることにより検出精度を高める。

・warpAffin()を使用することで、以下の項目を実現できる。

 ・両目が水平なるように回転させる。
 ・両目の間隔を一定にそろえる
 ・目の高さを顔の中心にすることで、顔の高さを所望のものにする。
 ・髪の毛、額、あご、耳の部分が含まれないように領域を切り取る

 あらかじめ決めた理想の座標と、検出した両目の座標を用いてアフィン行列を作る。

 はじめに、目の中心座標を求め、アフィン変換を行う
 詳細な方法は、コードに記載されている。

・ヒストグラムの平滑
 現実世界では、左右の照明環境が異なる場合があり、認識精度に影響を与える。
 右半分と、左半分でヒストグラムの平滑化を別々に行う
 ただし、そのまま合成すると境目ではっきりとしたエッジが生じてしまう。

 これを回避するために、左右別々のヒストグラムの平滑化と、全体で平滑化したものを
 合成する。

 左から 0-25% 左半分の平滑化画像
 25-50%   左半分の平滑化画像と全体平滑化画像を距離に応じて加算
 50-75%   全体平滑化画像と右半分の平滑化画像とを距離に応じて加算
  75-100% 右半分の平滑化画像

・スームージング
 平滑化を行うとノイズが目立ってしまう
 これを回避するためにbilateralFilterを使用する

・楕円マスク
 首は影の影響を受けやすいので、黒画像の楕円マスクを作成、上記画像と合成する

以上により認識用の前処理画終了

第8章を数日前に読み終えていたのだが、なかなか書く気力がなかったが何とか年内に纏め上げることができた。

2012年12月28日金曜日

Mastering OpenCVの第8章の顔認識のメモ step2 前半


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。
今回は、Step2の、顔認識の精度を高めるための前処理に関して

両目を検出する
 ・OpenCV 2.4の目の辞書は、目が開いていても閉じていても検出できる

 ・目を閉じている場合を検出するには、左右異なる辞書を使用する
  haarcascade_mcs_lefteye、haarcascade_lefteye_2splits(右も同様)

 ・lefteyeが意味するのは、実際の体の左側を示している。カメライメージでは右側になる。

 ・検出精度は、下記の順番である。

 (1) haarcascade_mcs_lefteye.xml
     haarcascade_mcs_righteye.xml

 (2) haarcascade_lefteye_2splits.xml
     haarcascade_righteye_2splits.xml

 (3) haarcascade_eye.xml

 (4) haarcascade_eye_tree_eyeglasses.xml

 ・haarcascade_eye_tree_eyeglassesは、めがねをかけていても検出できるが、かけていないと検出できない

 ・目の検出には、目の近傍の画像を使用しなければいけない。顔全体で検出すると信頼性が下がる
 
 ・haarcascade_mcs_lefteye、haarcascade_lefteye_2splitsは、目の近傍の少し大きめの範囲に対応できる。一方、haarcascade_eyeは、目の近傍の狭い範囲しか対応できない

 ・近傍のエリア割合の表が、掲載されているが、LBPで検出された顔領域に対するものである。

 ・各辞書に対する検出率の表が掲載
  両目を検出するため、検出率は2乗になる

 ・目の画像は小さくなるためなるべく大きな画像を使用したほうがよい

 ・最初にhaarcascade_mcs_lefteyeを試して、失敗したらhaarcascade_lefteye_2splitsを試すとよい
 
 ・顔認識の場合、目を閉じていると信頼性が下がるため、haarcascade_eyeを試し、失敗したらhaarcascade_eye_tree_eyeglassesを試すとよい

 後半に続く

2012年12月27日木曜日

画像認識のセミナーを調べてみた 3


今後3ヶ月以内に開催される画像認識に関連するセミナーを調べてみた。
以下はすべて有料である。

画像処理アルゴリズムとFPGA選定 ~1人1台PC実習付~
2013/1/24 (木) 10:30-17:30
http://www.j-techno.co.jp/infos/view/6168

画像局所特徴量と統計的学習手法の組み合わせによる物体認識
2013年1月29日(火) 10時00分 ~ 17時00分
http://www.catnet.ne.jp/triceps/sem/s130129a.html

スパース信号表現のポイント解説と音声・画像処理への応用
2013年1月30日(水)10:30-16:30
http://www.catnet.ne.jp/triceps/sem/s121022a.html

移動物体認識のための特徴抽出法と判定アルゴリズムの基礎と事例
2013/02/13 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/2899

パーティクルフィルタの基礎と追跡・検出・認識・推定への応用  ~デモ付~
2013年2月14日(木) 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/1052

パターン認識・検索技術の基礎と応用
2013年2月26日(火) 10時00分 ~ 17時00分
http://www.catnet.ne.jp/triceps/sem/s130226a.html

パターン認識の基礎と応用 ~1人1台PC実習付~
2013年2月28日(木) 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/6178

距離画像センサ/カメラ技術の基礎とその応用
2013年3月22日(金) 10:30 - 17:30
http://www.j-techno.co.jp/infos/view/6238

以上

2012年12月26日水曜日

Mastering OpenCVの第8章の顔認識のメモ step1 後半


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。
今回は、step1の後半

検出前の処理

・白黒変換
・画像の縮小
 計算時間短縮のため画像を縮小する
  検出したい顔の領域が20x20ピクセルになるようにする
  左右のアスペクト比は変更しない
・ヒストグラムの均等化

検出
 顔の検出は、detectMultiScaleを使用する

 パラメータの説明
  ・minFeatureSize : 検出した顔の最小サイズ 20x20が一般
  ・searchScaleFactor : 異なるサイズの顔を検出する場合の拡大率 1.1が一般的 1.2にすると処理時間が短いが検出しないことがある
  ・minNeighbors : 3が一般的 大きくすると信頼性が上がるが検出されない場合がある
  ・flags : デフォルトは複数の顔を検出するが、CASCADE_BIGGEST_OBJECTにすると最大の領域のみ検出する
       他のパラメータを付加すると数%はやくなる CASCADE_DO_ROUGH_SEARCG, CASCADE_SCALE_IMAGE

 step2に続く

OpenCV 2.4.4がリリースされるようだ


公式のロードマップを見ていたら、2.4.4のリリースが2013/2/1に予定されていた。
以前見たときには、次のバージョンは、2.5の気がしたが追加されたのだろう

2.4.4の特徴は、多くは細かいバグの修正だが、個人的には、

Feature #2645: Patch cvHaarDetectObjects for parallel_for_ 2.4.3

が気になる。

また、Android向けには。2.4.3.2がリリースされている。

2012年12月23日日曜日

OpenCVのプロジェクト向けのgcc と CMakeの使い方


ubuntuで自作のOpenCVアプリをgccでmakeするやり方
オリジナルはここ

1 適当なディレクトリにソースを作成
  例: DisplayImage.cpp

2 CMake用のファイル CMakeLists.txt を作成
    ファイルの中身
    project( DisplayImage )
    find_package( OpenCV REQUIRED )
    add_executable( DisplayImage DisplayImage )
    target_link_libraries( DisplayImage ${OpenCV_LIBS} )

3 OpenCVのディレクトリの設定
export OpenCV_DIR="/usr/local"

4 makeファイルの作成
cmake .

5 make
make

顔検出、認識の資料のメモ



今さらであるが、HaarLikeの顔検出の過程を視覚化した映像

・顔認識の原理説明
  筑波大学システム情報工学研究科の講義資料
  深く知りたい場合は、ここからたどれる

固有顔 wiki

Mastering OpenCVの第8章の顔認識のメモ step1 前半


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識は、4つのStepで構成されている。

個人的には、Step2, Step3が、他では詳しく書かれていない内容が記載されており価値が高いと思う。

まずは、step1の顔検出から

・ポイント
 ・Mastering OpenCVは、特許の関係から、Haar-baseではなくLBP-baseを使用して顔を検出している。(しかし、目の検出は、Haar-baseを使用している。)
LBPの方が検出時間が短い。
   
・辞書は、positive 1000 negative 10000は必要
・辞書作成時間 LBP 数時間 Haar 1週間

・OpenCV 2.xのLBPの辞書は、調整されていなく、Haarの辞書の方が性能がよい
 性能が必要な場合、自分でLBPの辞書を作るか、Haarを使用するか
 (OpenCV2.xの辞書の話であり、方式の話ではない)
 
 辞書の概略
デフォルト : haarcascade_frontalface_default.xml
高速haar : haarcascade_frontalface_alt2.xml
高速LBP : lbpcascade_frontalface.xml
横顔 : haarcascade_profileface.xml
全身 : haarcascade_fullbody.xml

・CascadeClassifierクラスは、抽象化されており、辞書で、HaarとLBPを自動で判定されている。
・辞書のパス間違いによりエラーでよく落ちるので、try catchを使用したほうがよい。

 後半に続く

OpenCVで顔認識を試してみた


Mastering OpenCV with Practical Computer Vision Projectの第8章の顔認識を試してみた。

Ubuntu12.04を使用している。Terminalでソースを展開したディレクトリのChapter8に移動し、

export OpenCV_DIR="/usr/local"
cmake .
make

のコマンドを入力すると、同じディレクトリに実行ファイル WebcamFaceRec が出来上がる。

WebcamFaceRecをそのまま実行すると、
Could not load Face Detection cascade classifier [lbpcascade_frontalface.xml]
Could not load 1st Eye Detection cascade classifier [haarcascade_eye.xml]
とエラーになるので、OpenCVのdataディレクトリーから必要なファイルをChapter8のフォルダーにコピーする。

アプリを実行するとWebCamより画像の取り込みを始める。
顔が検出されると、黄色の枠が描画され、目の検出が成功すると水色で丸が描画される。
また、画面中央上部に補正された認識用の顔が描画される。

AddPerson領域をクリックするとデータの収集を始める。
(アプリの使い方が理解できていないので、step4を読み直す必要がある)

Escで終了するが、固有値ファイルが保存されていないので、ファイルが必要な場合は、自分で改造しなければいけない。

本には、処理の概要が記載されており、非常に役に立つ。全部を記載するのは、問題がありそうなので、今後ポイントのみ忘れないように記載する。

2012年12月18日火曜日

OpenCVでナンバープレートの認識を試してみた


Mastering OpenCV のサンプルが公開されていてので、早速ダウンロードしてみてビルドしてみた。

とりあえず、本を眺めてみて事前の準備がいらなさそうな第5章の車のナンバープレート認識を試してみた。

ナンバープレート認識の前提条件としては、コンディションのよい照明環境で、車の正面から撮影した画像であり、ナンバープレートは、少し傾きがあってもよいが、スペインのナンバーに限定されている

というのは、内部のアルゴリズムで使用する数値、プレートを切り出す時の比率や、内部の文字の間隔など、スペインのプレートに合わせた設定になっているためである。

プログラムのビルドは、いったんCMakeでIDE用のプロジェクトファイルを作成しなければいけなく、WindowsにCMakeをインストールする気がなかったのでUbuntuで試してみた。

サンプルには、テスト画像が12枚付属しておりすぐに試してみることができる。下記画像は、その中の1つで試したものである。


認識結果が重ねて表示される

2012年12月14日金曜日

Mastering OpenCV のKindle版が、60%offで販売されている


先週注文したときには、紙版しか扱われていなかったが、Kindle版がいつの間にか発売されており、かつ60%引きとなっており、ダメージが大きい

Kindle版は、ここから注文できる。60%offは、特別セールなのかもしれないので、気になる人は購入したほうがよいだろう。

Mastering OpenCV のサンプルが公開されている


書名が長いので、単純にMastering OpenCV と縮めている。

どんな内容か気になるのであれば、第4章がサンプルとしてまるまる1章公開されているので読んでみると雰囲気がわかる。

ここのページにアクセスし、Sample Chaptersにアクセスすればよい。

Mastering OpenCV with Practical Computer Vision Projectのソースコードをダウンロードしてみた


Mastering OpenCV with Practical Computer Vision Projectが予想以上によい本なので、しばらくネタが続いてしまう。

早速ソースをgithubからダウンロードしてみた。gitは使わず、zipファイルをダウンロードした。

ダウンロードサイズは、71Mであり、展開後は203Mとなる

早速3章のプロジェクトの注釈を読むと

1 IDE用のプロジェクトファイルをCMakeで最初に作成する必要がある
2 デモを動かすには、OpenGL対応のOpenCVを自分でビルドする必要がある

と書かれており、すぐにデモで遊べそうではない。

2012年12月13日木曜日

Mastering OpenCV with Practical Computer Vision Projectのソースコードを比べてみた


9章がないのでひょっとしてとおもって、githubのソースコードと本文のコードを比べてみた。


昨日2章を見ていたのだが、MarkerDetectorのprivateの宣言が何もないので不思議に思っていたら、githubのソースには、変数が宣言されている。


紹介のページでは、full source-code と書かれているが、実際は一部省かれているので本文を参考にする人は注意したほうがよい

内容を理解したいのであれば、githubのソースをみながらのほうがよいだろう。

Mastering OpenCV with Practical Computer Vision Projectのソースコードが提供されていた


本文にソース記載されており、便利なのだが、ものぐさなのでソースを探していたら、githubに公開されていることがわかった。
また、カラーのサンプル画像も見ることができる。

不思議なことに紹介では、9章が存在しているが、購入した本には8章までしか掲載されていない

ちなみに9章はKinectを使用したFluid Wall である。

2012年12月10日月曜日

Mastering OpenCV with Practical Computer Vision Projectを購入してみた


日本アマゾンで最新版が販売されていたので購入してみた。

いままでOpenCVを触ってみても、ちょっとしたツールは作れるが、何らかのアプリを作ろうとするととたんにハードルが高くなってしまったが、この本をみれば、性能は別としてちょっとしたアプリを作れそうな気になる。

1章
 アニメフィルターと肌色の変更
2章
  マーカーを使用したAR
3章
 マーカーなしAR
4章
 動きから3次元再構成
5章
 ナンバープレート認識
6章
 顔の特徴点追跡
7章
 3次元顔の向き推定
8章
 顔認識

英語を除けば、勉強会にはよい気がする。

2012年12月6日木曜日

OpenCVでOpticalFlowを試してみた 後半


結果の表示
  特徴点の数だけループをまわし、指定した特徴点が次フレームで移動したのかを判定する。

 判定方法は、獲得頂点に対応するstatusの値を調べ、その値が1ならば、newpointsに移動先と推定された座標が格納されることになる
 あと、対応するerrorの値をしらべ、想定した値以上の場合は、破棄するほうが結果はよいと思われるが、今回は調べていない

 有効であれば、pointsの位置に、サークルを表示し、pointsの位置から、newpointsの位置まで直線を描画する。


calcOpticalFlowPyrLKのパラメータに関して
 cv::Size(21,21)は、移動先の判定に使用すウィンドウサイズの大きさであり、大きくすると性能は上がるが計算量が増える
 21はデフォルトの値である。

 その後の3は、ピラミッドの階層数であり、大きいほど大きな移動に対応できるが、計算量が多くなる。
 0から指定するので、値が3の場合(デフォルト)は、元の大きさの画像に加えて、縮小サイズの画像を3枚作成し、それぞれ調べることになる。


 その後のパラメータは、変更してもそれほど結果に差異はないように思われる。

高速化
 OpenCV 2 Computer Vision Application Programming CookBookのサンプルでは、上記の有効と判定した移動先の座標が、想定した数以上であれば、その座標を次のフレームの特徴点として使用することで、次フレームでの特徴点の処理を省いている。

 今回は、有効な移動先座標に次フレームで検出した特徴点を加えて、calcOpticalFlowPyrLKを計算している。

OpenCV 2 Computer Vision Application Programming Cookbookは、kindle版が、安いのだが、残念ながら日本から買うと3800円でお買い得感はない


感想
 ・こちらがほしいと思われる場所のベクトルをほとんどら得ることはできない
 ・人物の場合、頭、手の先、足の先が特徴点として検出されやすいが、人の移動方向と、得られたベクトルの方向とを比較すると、頭 手 足 の順で相関がなくなっていく。結果、人の追跡はむつかしい
 

 サンプル画像だけでも、ほかにも多くの問題が見つかり、他の手法と組みあわせないと、役に立たないと思われる

2012年12月4日火曜日

OpenCVでOpticalFlowを試してみた


OpenCV2.4.3でLucas-Kanade法がサポートされているので試してみた

calcOpticalFlowPyrLKは、指定した特徴点集合に対してのみオプティカルフローを計算する仕様なので、事前に GoodFeaturesToTrackDetectorを用いて、特徴点集合を求めておく

特徴点集合は、以前は、GoodFeaturesToTrackで直接特徴点の座標を求められたが、2.4.3からは、Detectorオブジェクトを作成し、detect メソッドでkeypointを計算し、そこから特徴点の座標を取得する必要がある

std::vector<cv::KeyPoint>  keypoints;
std::vector<cv::Point2f>   points;

cv::GoodFeaturesToTrackDetector detector(100, 0.05, 3);
detector.detect(gray_prev, keypoints);

for( std::vector<cv::KeyPoint>::iterator itk = keypoints.begin(); itk != keypoints.end(); ++itk)
{
points.push_back(itk->pt);
}

注意
ひとつ前のフレーム画像の特徴点を求めておく


calcOpticalFlowPyrLKは、以下のように使用する

std::vector<cv::Point2f>   newpoints
std::vector<unsigned char>  status;
std::vector<float>              errors;

cv::calcOpticalFlowPyrLK(gray_prev, gray, points, newpoints, status, errors, cv::Size(21,21), 3, cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.05), 0);

newpointsには、前のフレームでの特徴点に対応する今のフレームでの座標が格納されている。

statusには、検出の成否が格納されている。statusが1の場合は、検出に成功

ただし、対応する移動先が見つからない場合もあり、座標点ごとに検出が成功したかどうかは、格納される。

errorsには、計算した時の誤差にあたる数値が格納されている



以前から提供されているAPIだが、2.4.3から入力に自分で作成したピラミッド画像を使用することができるらしいが、関数自身がピラミッド画像を作成する機能を有しているようなので、今回は、グレースケールの画像を入力とした。

後半に続く

2012年12月3日月曜日

OpenCVで特徴点を検出してみた


画像の特徴点を検出をためしてみた。まずは、GoodFeaturesToTrackDetectorを使用し、GPUサンプルの歩行者画像を試してみる。

方式の内容を理解していないので、関数をそのまま使用している。

引数に関して
 maxCornersは、検出される特徴点の最大数
 qualityLevelは、特徴量を計算した時の何らかの閾値と思われ、小さいと検出される特徴点が増える
  minDistanceは、特徴点間の最小距離をおもわれ、この値により結果がまびかれる。
 blockSizeは、不明


qualityLevel = 0.2


qualityLevel = 0.05


以上