OpenCVで顔検出

このエントリーをはてなブックマークに追加
はてなブックマーク - OpenCVで顔検出
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

OpenCVには顔検出用に学習したカスケード型識別器の学習結果があるので、それを使って顔検出してみました。

識別器の学習結果は、環境・インストール方法によって保存場所が若干異なります。

Windowsの場合

C:¥OpenCV にインストールしたとすると、C:¥OpenCV¥data 以下にあります。

Linuxの場合

yumやapt-getでインストールすると、基本的には/usr/share/OpenCV/以下にあると思います。(未確認)

自分でソースコードをダウンロードしてコンパイルしてインストールしている場合は、/usr/local/share/OpenCV/以下にあると思います。
もちろん、インストール先を/usr/localから変更している場合は、その部分は変わります。

Macの場合

僕はMacで、Homebrewを使ってインストールしているのでこれに該当するのですが、この場合は/usr/local/Celler/opencv/2.4.2/share/OpenCV/以下にあります。
もちろんOpenCVのバージョンやHomebrewのインストール先によって当該部分が変わります。

自分でソースコードをコンパイルしてインストールしている場合はLinuxの時と同じで/usr/local/share/OpenCV 以下にあると思います。(未確認)

で、どういうファイルがあるかですが、上記のディレクトリの 下には、haarcascadesとlbpcascadesというディレクトリがあります。haarcascades以下には、haar-like特徴で学習した識別器のデータ(xml)が、lbpcascades以下にはLocal Binary Patterns特徴量で学習した識別器のデータがあります。
以下のソースコードでは、例として、lbpcascade_frontalface.xmlを使っています。

実際のソースコードはこちら。

#include <opencv2/opencv.hpp>;

int main (int argc, char **argv){
    cv::Mat img, gray;
    const std::string cascade_name = "/usr/local/Cellar/opencv/2.4.2/share/OpenCV/lbpcascades/lbpcascade_frontalface.xml";
    cv::CascadeClassifier cascade;
    
    cascade.load(cascade_name);
    
    img=cv::imread(argv[1]);
    cv::cvtColor(img, gray, CV_BGRA2GRAY);
    
    cv::equalizeHist (gray, gray);
    
    std::vector<cv::Rect> faces;
    cascade.detectMultiScale(gray, faces);
    
    for(std::vector<cv::Rect>::iterator it=faces.begin(); it!=faces.end(); it++){
        cv::rectangle(img, *it, CV_RGB(255,0,0), 3);
    }
    
    cv::imshow("Detected", img);
    cv::waitKey (0);
    
    return 0;
}

上の例では、簡単のため、argv[1]で顔検出したい画像を渡しています。

scikit-learnを使ってPCAによる次元削減を7行で書いてみた

このエントリーをはてなブックマークに追加
はてなブックマーク - scikit-learnを使ってPCAによる次元削減を7行で書いてみた
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

高次元のデータを解析する場合、データの分布などが見てもわからないので、PCAを使って次元削減をしてから可視化する場合があります。
PCAについてはこれまでにこのブログでも何度も触れているのでそちらを参照してください。

今回はフランスのINRIAがFundingしているscikit-learnというライブラリを使って7行で(空行含まず)書いてみました。言語はPythonです。

import numpy
import sklearn.decomposition

dim=2
data=numpy.loadtxt("data.csv", delimiter=",")
pca=sklearn.decomposition.PCA(dim)

result=pca.fit_transform(data);
numpy.savetxt("result.csv", result, delimiter=",")

たったこれだけで、data.csvというファイル(行ごとに多次元データがカンマ区切りで入っている)を読み込み、PCAで次元削減(2次元へ圧縮)したあとresult.csvというファイルに書き出しています。

白色化する場合は pca.whiten=True という行を、fit_transform の前に入れればOKだと思います。

PCAというより、numpy.loadtxt / numpy.savetxt 素晴らしい!という内容になりました。