_Vision2010/report3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*視覚認知計算特論 2010年度 レポートその三 [#k9dc8115]
//&color(Red){工事中};
**いろいろ [#m345035b]
-締切: 2010年7月15日(木)の授業開始時
-形式: A4の紙に書き,左上を綴じる
-このレポート課題では,octave, MATLAB, Mathematica, Maple Vなどの数値計算/数式処理言語を利用することを前提としています.
レポートにはどんな環境でどんな言語を用いたかを記すこと.
-octaveは,1-612その他の計算機室のLinux-PCにもインストールされています.[[Docs/octave]]
-計算の実行手順や結果を示す際にはoctave等の出力をレポート中にcopy&pasteしても構いません.もちろんちゃんと説明や考察も書いてください.
-以下では,数式を記述しているツールの制約により,「ベクトルx」を &mimetex( \vec{x} ); と表記しています.
**問1 [#ce208b91]
cat.txtのデータ(「[[データと変換ツール>#data]]」参照)を主成分分析して次のものを求め考察しなさい.
-平均画像
-いくつかの固有ベクトルを画像にしたもの
-いくつかの猫画像の主成分スコア(上位のもの(対応する固有値の大きいもの)のみでよい)
-いくつかの猫画像を上位の主成分のみで再構成した画像(教科書p.218のように再構成に用いる主成分の数も変化させてみること)
**問2 [#h2890eb9]
&mimetex(\alpha); 番目の猫画像(から平均を引いたもの)を &mimetex(\vec{x}_{\alpha});,第 &mimetex(h); 主成分までを用いて &mimetex(\vec{x}_{\alpha}); を再構成したものを &mimetex(\vec{z}_{h\alpha}); とおく.
このとき,&mimetex(\{\vec{x}_{\alpha}\}); の分散は
#mimetex( V = \frac{1}{N}\sum_{\alpha = 1}^{N} ||\vec{x}_{\alpha}||^{2} );
と表される.また,h次元再構成の平均二乗誤差は
#mimetex( E(h) = \frac{1}{N}\sum_{\alpha = 1}^{N} ||\vec{x}_{\alpha} - \vec{z}_{h\alpha}||^{2} );
と表される.
これらの値を求め,横軸 &mimetex(h);,縦軸 &mimetex( E(h)/V ); のグラフを描きなさい.
**問3(オプション) [#zeb9fc52]
主成分分析を使って何かやってみよう.
-猫画像から求めた基底ベクトルを使って他の画像を再構成してみる
-他のデータを主成分分析してみる,etc.
**データと変換ツール [#data]
***入手 [#bca31507]
レポート課題で用いる画像データと,画像をoctaveで読み込める形式のテキストファイルに変換したり,逆にoctaveの出力を画像に変換したりするプログラムをまとめたものが,
[[Vision2010report3.tgz>Vision2010gakunai:Vision2010report3.tgz]] (学内アクセス限定)
にあります.これは,tar + gzip の形式ですので,GNU tarの使える多くのUNIX環境では
$ tar tzf Vision2010report3.tgz
とすれば内容を一覧することができ,
$ tar xzf Vision2010report3.tgz
とすればファイルを伸張して展開することができます.
内容は次の通りです.
Vision2010report3/cat.txt データ
Vision2010report3/Image2Vector.class 画像をベクトルに変換するプログラム
Vision2010report3/Vector2Image.class ベクトルを画像に
Vision2010report3/uni_black.jpg 上記プログラムの動作確認用サンプル画像
Vision2010report3/Image2Matrix.class 複数の画像を行列に変換するプログラム
Vision2010report3/Matrix2Image.class 行列を画像に
***画像→ベクトル,ベクトル→画像 [#ic594de2]
上記のなかに,uni_black.jpg というサンプル画像があります.
適当な画像表示ソフトで表示させてみましょう.
ImageMagickがインストールされている環境(実習室のLinux環境など)では,
$ display uni_black.jpg
とすれば画像が表示されます.
ためしにこの画像をベクトルデータに変換してみましょう.
Image2Vectorを使います.これは Java のクラスファイルですので,次のように実行します.
$ java Image2Vector
上記のようにコマンドライン引数をつけずに実行すると,次のメッセージが出力されます.
usage: java Image2Vector fn
fn: input filename (e.g. hoge.png)
これは,このプログラムの使い方を示しています.次のように実行してみましょう.
$ java Image2Vector uni_black.jpg
すると,指定した画像ファイル(JPEG, PNG, GIFに対応してます)を読み込んでグレイスケール化してからベクトルデータに変換したものが uni_black.txt という名前のテキストファイルに出力されます.
lessで眺めてみるとわかりますが,単に0から255の整数値が画素数分ならんでいるだけです.
uni_black.txt を octave で読み込み,値をいじってから別のファイルに出力してみましょう.
#pre{{
octave> x = load("uni_black.txt");
octave> size(x)
ans =
1 92928 このファイルは 1 x 92928 のベクトル
octave> y = 255 - x; (yの各要素)= 255 - (xの各要素)
octave> save("y.txt", "y"); ← ファイル名だけでなく変数名(y)にも""が必要
}}
y.txt は uni_black.txt と同サイズのベクトルのテキストデータです.今度は Vector2Image を使ってこれを画像に変換してみましょう.
#pre{{
$ java Vector2Image
usage: java Vector2Image fn width height
fn: input filename (e.g. hoge.txt)
width: image width
height: image height
}}
この例では,
$ java Vector2Image y.txt 363 256
と実行すると,y.txtを読み込んで画像に変換したものが y.png というファイルに出力されます(出力はPNGのみ).
$ display y.png
として表示してみましょう.
***画像→行列,行列→画像 [#ta52087d]
ファイル一式に含まれている cat.txt というのは,64x64画素の画像131枚を行列に変換してテキストデータにしたものです.
Matrix2Image で画像に変換してみましょう(引数なしで実行すれば使い方が表示されます).
$ java Matrix2Image cat.txt 131 64 64
上記のように実行すると,cat000.png から cat130.png までの131枚の画像が出力されます.
どんな画像か確認してみましょう.
今度は,Image2Matrixでさきほど作った画像を行列に変換してみましょう(引数なしで実行すれば使い方が表示されます).
cat.txt を削除してから,
$ java Image2Matrix cat png 131
とすると,131枚の画像を読み込んで行列データに変換したものが cat.txt というファイルに出力されます.読み込む画像はJPEG, PNG, GIFのいずれかの形式で,全て同じサイズであり,000からはじまる3桁の連番が付与されている必要があります.
cat.txt を octave で読み込んでサイズを確認すると, 131 x 4096 の行列であることがわかります.
教科書や高橋の作成した参考資料では個々のデータを列ベクトルとして扱っていますので,それにあわせるためには転置する必要があることに注意して下さい.
固有ベクトルや再構成をテキストファイルに出力する際にも同様です.
また,固有ベクトルを画像に変換する際には,もう一つ気をつけないといけないことがあります.
octaveで得られる固有ベクトルは正規化されているので,その要素は非常に小さな値になっている,という点です.
そのまま変換して画像にすると,ほとんどの画素が 0 になって真っ黒な画像しか得られません.
この問題を解決するためには,octave上で固有ベクトルから可視化用のデータを作ってそちらを出力することにするとよいでしょう.
可視化用データの作り方の例…
+ベクトルの各要素を &mimetex(x_{i}); とおくとき, &mimetex( x_{absmax} = \max_{i}|x_{i}| ); を求める
+ベクトルの新しい要素 &mimetex(y_{i}); を &mimetex( y_{i} = 127 \times x_{i} / x_{absmax} + 128 ); とする
***画像データと変換ツールの取り扱いについての注意 [#o160d504]
&color(#ff0000){cat.txtに含まれる画像データは,このレポート以外の目的に使用してはいけません.};
変換ツールは高橋が作成しました.
ソースを見たい人は高橋に言ってください.
終了行:
*視覚認知計算特論 2010年度 レポートその三 [#k9dc8115]
//&color(Red){工事中};
**いろいろ [#m345035b]
-締切: 2010年7月15日(木)の授業開始時
-形式: A4の紙に書き,左上を綴じる
-このレポート課題では,octave, MATLAB, Mathematica, Maple Vなどの数値計算/数式処理言語を利用することを前提としています.
レポートにはどんな環境でどんな言語を用いたかを記すこと.
-octaveは,1-612その他の計算機室のLinux-PCにもインストールされています.[[Docs/octave]]
-計算の実行手順や結果を示す際にはoctave等の出力をレポート中にcopy&pasteしても構いません.もちろんちゃんと説明や考察も書いてください.
-以下では,数式を記述しているツールの制約により,「ベクトルx」を &mimetex( \vec{x} ); と表記しています.
**問1 [#ce208b91]
cat.txtのデータ(「[[データと変換ツール>#data]]」参照)を主成分分析して次のものを求め考察しなさい.
-平均画像
-いくつかの固有ベクトルを画像にしたもの
-いくつかの猫画像の主成分スコア(上位のもの(対応する固有値の大きいもの)のみでよい)
-いくつかの猫画像を上位の主成分のみで再構成した画像(教科書p.218のように再構成に用いる主成分の数も変化させてみること)
**問2 [#h2890eb9]
&mimetex(\alpha); 番目の猫画像(から平均を引いたもの)を &mimetex(\vec{x}_{\alpha});,第 &mimetex(h); 主成分までを用いて &mimetex(\vec{x}_{\alpha}); を再構成したものを &mimetex(\vec{z}_{h\alpha}); とおく.
このとき,&mimetex(\{\vec{x}_{\alpha}\}); の分散は
#mimetex( V = \frac{1}{N}\sum_{\alpha = 1}^{N} ||\vec{x}_{\alpha}||^{2} );
と表される.また,h次元再構成の平均二乗誤差は
#mimetex( E(h) = \frac{1}{N}\sum_{\alpha = 1}^{N} ||\vec{x}_{\alpha} - \vec{z}_{h\alpha}||^{2} );
と表される.
これらの値を求め,横軸 &mimetex(h);,縦軸 &mimetex( E(h)/V ); のグラフを描きなさい.
**問3(オプション) [#zeb9fc52]
主成分分析を使って何かやってみよう.
-猫画像から求めた基底ベクトルを使って他の画像を再構成してみる
-他のデータを主成分分析してみる,etc.
**データと変換ツール [#data]
***入手 [#bca31507]
レポート課題で用いる画像データと,画像をoctaveで読み込める形式のテキストファイルに変換したり,逆にoctaveの出力を画像に変換したりするプログラムをまとめたものが,
[[Vision2010report3.tgz>Vision2010gakunai:Vision2010report3.tgz]] (学内アクセス限定)
にあります.これは,tar + gzip の形式ですので,GNU tarの使える多くのUNIX環境では
$ tar tzf Vision2010report3.tgz
とすれば内容を一覧することができ,
$ tar xzf Vision2010report3.tgz
とすればファイルを伸張して展開することができます.
内容は次の通りです.
Vision2010report3/cat.txt データ
Vision2010report3/Image2Vector.class 画像をベクトルに変換するプログラム
Vision2010report3/Vector2Image.class ベクトルを画像に
Vision2010report3/uni_black.jpg 上記プログラムの動作確認用サンプル画像
Vision2010report3/Image2Matrix.class 複数の画像を行列に変換するプログラム
Vision2010report3/Matrix2Image.class 行列を画像に
***画像→ベクトル,ベクトル→画像 [#ic594de2]
上記のなかに,uni_black.jpg というサンプル画像があります.
適当な画像表示ソフトで表示させてみましょう.
ImageMagickがインストールされている環境(実習室のLinux環境など)では,
$ display uni_black.jpg
とすれば画像が表示されます.
ためしにこの画像をベクトルデータに変換してみましょう.
Image2Vectorを使います.これは Java のクラスファイルですので,次のように実行します.
$ java Image2Vector
上記のようにコマンドライン引数をつけずに実行すると,次のメッセージが出力されます.
usage: java Image2Vector fn
fn: input filename (e.g. hoge.png)
これは,このプログラムの使い方を示しています.次のように実行してみましょう.
$ java Image2Vector uni_black.jpg
すると,指定した画像ファイル(JPEG, PNG, GIFに対応してます)を読み込んでグレイスケール化してからベクトルデータに変換したものが uni_black.txt という名前のテキストファイルに出力されます.
lessで眺めてみるとわかりますが,単に0から255の整数値が画素数分ならんでいるだけです.
uni_black.txt を octave で読み込み,値をいじってから別のファイルに出力してみましょう.
#pre{{
octave> x = load("uni_black.txt");
octave> size(x)
ans =
1 92928 このファイルは 1 x 92928 のベクトル
octave> y = 255 - x; (yの各要素)= 255 - (xの各要素)
octave> save("y.txt", "y"); ← ファイル名だけでなく変数名(y)にも""が必要
}}
y.txt は uni_black.txt と同サイズのベクトルのテキストデータです.今度は Vector2Image を使ってこれを画像に変換してみましょう.
#pre{{
$ java Vector2Image
usage: java Vector2Image fn width height
fn: input filename (e.g. hoge.txt)
width: image width
height: image height
}}
この例では,
$ java Vector2Image y.txt 363 256
と実行すると,y.txtを読み込んで画像に変換したものが y.png というファイルに出力されます(出力はPNGのみ).
$ display y.png
として表示してみましょう.
***画像→行列,行列→画像 [#ta52087d]
ファイル一式に含まれている cat.txt というのは,64x64画素の画像131枚を行列に変換してテキストデータにしたものです.
Matrix2Image で画像に変換してみましょう(引数なしで実行すれば使い方が表示されます).
$ java Matrix2Image cat.txt 131 64 64
上記のように実行すると,cat000.png から cat130.png までの131枚の画像が出力されます.
どんな画像か確認してみましょう.
今度は,Image2Matrixでさきほど作った画像を行列に変換してみましょう(引数なしで実行すれば使い方が表示されます).
cat.txt を削除してから,
$ java Image2Matrix cat png 131
とすると,131枚の画像を読み込んで行列データに変換したものが cat.txt というファイルに出力されます.読み込む画像はJPEG, PNG, GIFのいずれかの形式で,全て同じサイズであり,000からはじまる3桁の連番が付与されている必要があります.
cat.txt を octave で読み込んでサイズを確認すると, 131 x 4096 の行列であることがわかります.
教科書や高橋の作成した参考資料では個々のデータを列ベクトルとして扱っていますので,それにあわせるためには転置する必要があることに注意して下さい.
固有ベクトルや再構成をテキストファイルに出力する際にも同様です.
また,固有ベクトルを画像に変換する際には,もう一つ気をつけないといけないことがあります.
octaveで得られる固有ベクトルは正規化されているので,その要素は非常に小さな値になっている,という点です.
そのまま変換して画像にすると,ほとんどの画素が 0 になって真っ黒な画像しか得られません.
この問題を解決するためには,octave上で固有ベクトルから可視化用のデータを作ってそちらを出力することにするとよいでしょう.
可視化用データの作り方の例…
+ベクトルの各要素を &mimetex(x_{i}); とおくとき, &mimetex( x_{absmax} = \max_{i}|x_{i}| ); を求める
+ベクトルの新しい要素 &mimetex(y_{i}); を &mimetex( y_{i} = 127 \times x_{i} / x_{absmax} + 128 ); とする
***画像データと変換ツールの取り扱いについての注意 [#o160d504]
&color(#ff0000){cat.txtに含まれる画像データは,このレポート以外の目的に使用してはいけません.};
変換ツールは高橋が作成しました.
ソースを見たい人は高橋に言ってください.
ページ名: