2006年10月アーカイブ

主成分分析(PCA)とは、特徴量の次元がバカでかくなりすぎた場合に行われる次元収縮の手法である。
参考: http://www-pse.cheme.kyoto-u.ac.jp/~kano/document/text-PCA.pdf
   http://aoki2.si.gunma-u.ac.jp/lecture/PCA/index.html
主成分分析は広く知られている手法で、統計学で習った人も多いかもしれない。

パターン認識の分野では、この主成分分析と組み合わせて、独立成分分析(ICA)がしばしば使われる。

独立成分分析と主成分分析の処理は似ている。だが、主成分分析は(主成分の)軸は直交しなければいけないのに対して、独立成分分析では軸は直交しなくてもよいという点が違う。独立成分分析では、データ分布の独立性を見るのだ。

独立成分分析は fastICA ( http://www.cis.hut.fi/projects/ica/fastica/ ) で簡単に計算できる。

以下では、fastICA の例をもって説明する。

画像ファイルの全画素値を配列にコピーする場合の速度比較を行った。

比較するのは以下の3手法。

・方法1: C#
 - C# で Bitmap クラスの GetPixel メソッドを使った
 - 普通の方法
・方法2: C#(unsafe)
 - C# で unsafe を使った
 - ちょっと工夫した方法
・方法3: C++
 - C++ のクラスライブラリを作成し、C# から参照して使った
 - 画像処理ライブラリとして、OpenCV を用いた

一応、比較用に書いたソースは記事末に載っけときました。

557x850 の 24ビットカラー JPEG画像の場合
方法1: 21.6388260748251 (秒)
方法2: 5.06153430618396 (秒)
方法3: 0.0533208579219269 (秒)

方法1の20秒は、ありえないぐらい遅い。
unsafe を用いた方法2で処理時間は1/4になったが、C++を用いた方法3と比べると100倍近く遅い。

方法1はポインタが使えないから遅いというのは分かるような気がするが、ポインタが使える方法2と方法3がこんなに違うのは不思議だ。

JPEG のデコードで時間が掛かってるのか?と思って、ビットマップ画像でも比較。

557x850 の 24ビットカラー ビットマップ画像の場合
方法1: 21.81745337468 (秒)
方法2: 5.01866893115639 (秒)
方法3: 0.0364773279243997 (秒)

あれ?方法1と方法2があんまり変わらんのに、方法3がますます速くなってるし。


まとめ
・大量の画像を相手にしなければいけないときは C++ を使おう。


【追記(2007/11/24)】
Bitmap.Width, Bitmap.Height は意外にコストが高い(内部的にDllImportしたgdiplus.dllを利用している)ので、forループ前に一旦変数に入れてやると多少パフォーマンスが改善されるそうです。(コメントからの情報)

このアーカイブについて

このページには、2006年10月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年8月です。

次のアーカイブは2006年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

プロフィール

profile.jpg

モローチョ(moro-tyo)

Webエンジニア。

詳しいプロフィール

このblogのはてブ

Powered by Movable Type 4.1