kabaohのブログ

仕事ができなすぎて辛いので、趣味に逃げるカバ野郎

顔認識のお話

とりあえず、理論の勉強は楽しいんだけど、Wikipediaめぐり状態になるので
血の涙を流しながら一旦中断
OpenCVやdlibあたりを使って顔認識をやります。
OpenCVはインストール済みだったけど
インストール方法を改めてまとめてみる


ちなみに、自分はanacondaを使っています

OpenCV

conda install -c https://conda.binstar.org/menpo opencv3

なんか昔はまってたのはなんだったんだというくらい簡単にインストール完了




dlib

conda install -c menpo dlib

anaconda入れなおして、やりなおしたら普通に動いた...
anaconda使ってる人は、X11周りとかなんか難しいこと色々で
動かない場合があるらしく、その時はエラーを読んでlibpngのバージョン云々だったら

conda install -c anaconda libpng=1.6.22

これたたいとけば割りと上手く行きがち。


つかってみる

gist.github.com

OpenCVのほうは、この前アップしたのと同じで
dlibでも同様のことをさせてみた。
気持ち、dlibのほうが顔だけにフォーカスできている感じもする。

<次回>
目だけを抽出させてみたらをやってみます

HAAR-Like特徴量の話

HAAR-Like特徴量ってなんじゃらほい。
文字通りだとHAARっぽい特徴量ってことになる。

実際は
f:id:kabaoh:20160818093421p:plain
この白と黒でできた四角の
黒い所の平均明度と白いところの平均明度の差らしい。

下記スライドのP13-P15くらいが自分的には分かりやすかった。
局所特徴量と統計学習手法による物体検出

なんで差を取るか。ちょっと考えたら至極簡単。

f:id:kabaoh:20160818094633p:plain:w240
これが顔のパターンだとする。
このパターンにマッチすれば顔と考えて良いと。

与えられた画像が顔を表しているか判別するために
仮に画像の全ピクセルの明度をチェックできるとする。

絶対値しかみないとどうなるか


f:id:kabaoh:20160818094900p:plain:w240

完全に同じ場所に、それっぽいパターンが並んでいるのに
これを顔と認識できなくなる。



閾値を設ければ、多少判別率は上がるだろうが
周辺の明度との差分を見ることにしたほうがシンプルに済みそうだ。
なるほどという感じ。

OpenCVでやっている顔認識について

単純にHaar-Like特徴量を得るには問題があった。
この四角のパターンつまり、矩形領域をどのように配置するかは自由なので
全パターンを網羅しようとすると、それだけで大量のパターンが考えられてしまう。

たとえば、3x3の領域だと30通り?(かぞえ間違っていたらごめんなさい。)
24x24で18,000通りくらいありえるらしい。
ここで、integral imageというのを考えて、計算量を劇的に減らすという工夫を行った論文が下記

[Viola & Jones, CVPR ʼ01] Viola, P and Jones, M,"Rapid object detection using a boosted cascade of simple features", CVPR,vol.1,pp.511-518,(2001). 

論文中では、それだけでなく、学習にBoostingをつかったり、Cascadeなるものをつかったりして
高速化を図っていた。全部かくとまとめだけで時間がくれてしまうので、割愛します。

雑感

基本的な所を抑えておきたいけど、まだまだ色々知らない単語がある。
Boosting,なんとなくわかったけどAdaboostはよくわかってない
Cascade,よくわかってない...
どうしよう。
Wikipediaめぐりのように知らない単語めぐりで先にすすめない
楽しいんだけども。

画像認識ってどうやってんのよ

そもそも、顔の認識ってどうやってるのか。
そこはやっぱり機械学習

1. 多数の教師データから特徴量を抽出して学習
2. 判別させたい画像から、特徴量を抽出してそれを先の学習結果と照合
3. 判別結果を表示

といういつもの流れのようだ。
古い記事ではあるが、下記リンクの図がわかりやすかった。
第1回 画像認識の基本を知ろう:OpenCVで学ぶ画像認識|gihyo.jp … 技術評論社


ではやってみっか!とおもったがわからない単語が多すぎてつらい。
ちょっと調べてみることにした。


分類器について

これはどっかで聞いたけど改めて。
何かを分類する仕組みを分類器と呼んでいるっぽい。
画像の中で、顔と顔以外を分類するとかそういう類かな。

なので、分類器をつくることは学習と判別を行う仕組みを作ることのようだ。


カスケード分類器について

カスケード分類器とは幾つかの分類器を組み合わせて 一つの分類器を形成する類の分類器。 xgboostに似てるなぁという今のところの感想。 xgboostを理解してるわけじゃないんだけど。


OpenCVでつかえる特徴量について

公式ドキュメントによるとOpenCVでは、学習に関して opencv_haartrainingというのとopencv_traincascadeという学習方法が予め準備されているらしい。 Cascade Classifier Training — OpenCV 2.4.13.0 documentation

haartrainingというのは、Haar-Like特徴によって機械学習を行う方法。 traincascadeとうのは、Haar-Like特徴、LBP特徴どちらかを使って機械学習を行う方法のようだ。


次回予告

うーん。結局Haar-Like特徴ってなに?とか、わからない単語は続々と増えますなぁ。 Haar-LikeとLBPはやってることは同じで Haar-Likeのどっかの値をintegerにしたものがLBPで いささか速いよみたいなことがかいてた。

そもそもHaar-Likeをちゃんとわかってない。 次回はHaar-Likeについて書くつもりです。

まずは顔認識界のHello World

自分が勝手にHello World的なもんだとおもってるんだけですが。
レナさんの顔認識から。

下記の記事を参考にしました。ありがとうございます。
python+OpenCVで顔認識をやってみる - Qiita

gist.github.com

動くことはうごいた。まずはうごかすの大事。

HAAR分類器とは何か、そもそもカスケード分類器とは何か。 そもそも画像認識ってどういう感じでやってんの?とか。 疑問はつきないがひとまず今日はここまで。

画像認識を勉強したい話

お久しぶりです。と言っても、全然読者いないので はじめましてというのが適切かしら。 ちょっと本職が忙しいのと、別のことが楽しくなっていて 全然こっちに手を出していなかった。

画像認識をしたい

もっと言うと、人の顔認識を勉強したい。 友人と1年に一回くらい旅行に行くのが恒例になってるんですが 友人がそこで、雑コラをつくってくれるんですね。 それがまぁ、絶妙な雑さで。

その絶妙な角度を定量化したいというのが最初のモチベーション。 とりあえず似たような画像を集めて、顔の角度の画像を分類できるようにしてみたいな。

リーダブルコードを読んだ

お久しぶりです。勉強に関して迷走中です。

機械学習もさることながら、python自体よくわかっていないというものもあり python自体の勉強にも手を出し始めました。とはいえ何をやるべきかよくわからなくて プログラムテストの問題ばかり解いてました。

あとは、なんとなく本を読み始めました。 買ったはいいけど、読んでなかった本、リーダブルコード。 いい本だよと聞いていたのでとりあえず買って放置してました。

結論: 多分いい本何でしょう。自分のレベルでは実感が少ないです。 というかまぁ当たり前だよねということが書いてありました。 問題は、それを実践できるかどうかというところにあるわけで...。できてません。 あと、pythonすらままならないので、C++とかjavascriptとかで書いてあるサンプルコードがよくわかりませんでした。 とは言え、一応通読したので下記雑な感想混じりのまとめ。


1章

読みやすいコードとは何か

  • コードは他の人が最短時間で理解できるように書かなければいけない
    (ここでいう「理解」とはコードの変更や、バグが発見できるレベル)
  • 短いコードは読みやすい。しかしコードを短くすることよりも理解にかかる時間を短くするほうがもっと大切。

2章

名前に情報を詰め込む

  • getよりもDownload、SizeよりもHeight。変数やクラス名にはもっと明確な名前をつける 
  • DownloadTimeはわかりやすいが、DownloadTime_msほうがもっといい(単位が明確)
  • 必要ない情報は削ってもいい。

3章

誤解のない名前をつける

  • 最大文字数を表したい時、 max_lengthでは最大バイト数なのか、最大文字数なのかわかりにくい
    max_lengthよりもmax_ charのほうがわかりやすい。   
  • 最大最小を表すときmax/minを使う。
  • 範囲を表すときは、first/lastまたはbegin/endをつかう
    境界値を含むか含まないかで、使い分ける   

    4章

    美しさ

  • 見た目が美しいコードのほうが使いやすい
    読み手が慣れているパターンと一貫性のあるレイアウトを使う
    似ているコードは似ているように書く
    関連するコードはまとめてブロックにする

  • 同じ処理は一つのメソッドにまとめてしまう

  • ”=” などの位置を揃える(縦のラインを揃える)

一番重要なのは、スタイルに一貫性を持たせること。一貫性のあるスタイルは、正しいスタイルよりも重要だ

5章

コメント

  • 関数名からわかることなど不必要なコメントはかかない。
  • 関数名を補足しなければいけないなら関数名を変える
  • 定数を決めたときに、なぜその定数に決めたのかなどを書いておくのは有用
    そのコメントによって、その後の無駄な努力がなくなるかもしれない。

  • 誰もがはまりそうな注意書きは書くべき

  • ファイルやクラスの全体像は書くべき
    (最初に言っていることと矛盾するのでは?)

6章

コメント(2)

  • 実際にどんなところに気をつけるべきかが書いてある
    気になったのは次の言葉。

情報密度の濃い単語を使う

確かにその通りなのだがこれのせいで初心者の自分たちには読みにくいことが多い   

7章

制御フローを読みやすくする

未消化

8章

巨大な式を分割する

  • 説明変数、要約変数を使って、長い宣言を短く、わかりやすくする
    説明変数:その処理が何をしているか書くusername = input().split()[0]とか
    要約変数:説明変数でわかりやすくしたあとの処理が、つまり何をしているかまとめる変数

  • 同じことをやっている式はまとめる(二回目?)

9章

変数と読みやすや

10章

無関係の下位問題を抽出する

  • 本質的にやりたいことに集中できるようにする
  • そのために必要な下処理とかは別メソッドとしてきりだせばよい
  • 切り出した別メソッドは完全に独立しているのが望ましい
  • このライブラリにこんなメソッドがあったらなと思ったら追加すればよい

11章

一度に一つのことをさせる

  • 複数の処理を入れ子にしない
  • 下処理 --> 実際の処理 --> 後処理のように流す
  • 読みにくいコードがああれば、そこで行われているタスクを洗い出す
    タスクの中には外出しするべきものや関数として定義すべきものが見つかるだろう

12章

コードに思いを込める

やろうとしていることを簡単な言葉で説明できるようにする

13章

短いコードを書く

  • プロジェクトが進むとどんどんとコードは肥大化していく
  • 短く保つためにも標準ライブラリを読み返して、どんなことができるのか知っておく

14章

テストに関して

パス

15章

実例に関して?

パス

xgboostが使いたくて(2)

頑張った。いろいろ頑張った。 でもダメだった。

ふと休憩したら答えが見えてくる。 そんな経験だれにもあるだろう。

結論として

pip install xgboostだけで大丈夫でした。

実は最初にためしてダメだと思ってました。 理由は簡単、pip installで入るディレクトリと自分が適当にインストールしたJupyterが見に行くディレクトリが違うだけでした。 一体自分の 1-2週間はなんだったんだと思いながらも、openmpとかclangとか少し調べられたから無駄にはなっていないよねと思い込んで使っていこうと思う。