しんさんのブログ

科学や技術のこと読書のことなど

球面調和関数を視覚化してみまして

球面調和関数と言えば物理やってる人は、水素原子のシュレディンガー方程式の解ということで学部時代に一度は教科書で見たことあるとか、テスト勉強で解いてみたことあるっていう人も多いのではないかと思います。
ルジャンドルの陪関数が出てきたり、添え字がいくつか出てきて混乱したり数式を見て挫折することも多いですが、よくよく見ると構造は単純で、三角関数の三次元版だと思えばいいわけです。

そんな球面調和関数ですが、コンピュータグラフィックスの世界でも意外と使われています。
先日ブログで球面調和に関するリンク集をつくりましたが、そこにいくつかCGでの応用例があります。
球面調和関数と大域照明について(web上のリンク集) - 科学やら技術やら

ざっくり言って信号処理で信号をフーリエ展開するように、CGでオブジェクトのライティングを行う際にいろんな方向からやってくるたくさんの光をひとまとめにして球面調和関数で展開してしまい、入ってくる光の情報を展開係数に圧縮してしまおうという話です。光源の高周波成分はどうせ拡散反射するならわかりませんから。

そんな球面調和関数をprocessingを使って描画するコードを書いてみました。
WEB上には、OpenGLとかDirectXを使ったコードは転がっていますが実行するにはライブラリやらSDKやらなにかと必要で敷居が高いのでさくっと実行できるProcessingで書いてみました。
元にした球面調和関数のコードは以下から使用させていただきました。
☆PROJECT ASURA☆ [OpenGL] 『球面調和関数(1)』

実行結果はこんな感じです↓
f:id:wshinya:20161208103747j:plain

まあやっていることは、ものすごく単純で、Processingのサンプルにある
processing-docs/NoiseSphere.pde at master · processing/processing-docs · GitHub
を改造して、lineで書いた球を乱数でゆらゆらしている部分の、lineで線を書いている部分を流用して、線の長さを球面調和関数の結果に置き換え、符号を色に置き換えただけです。
球面調和関数の計算コードは、Project Asuraさんのコードほぼそのままです。
キーボードからの入力でリアルタイムに球面調和の次数(l, m)を変えてイガイガの形を変えたり、マウスでぐりぐり回転させたりして楽しんでます。

コードは以下からどうぞ↓
github.com

球面調和関数と大域照明について(webリンク集)

大域照明について、球面調和関数を使用する方法と球面調和関数そのものについての解説記事にリンク集を自分メモように作ります。
多くのサイトで球面調和を計算したり可視化するコードが公開されていますが、ほぼ同じようなコードとなっているようです。

1) 以下のサイトでは球面調和関数をつかったリアルタイム大域照明について解説してあります。

数式もあり、DirectX9のコードもあります。
実装コードが何を意味しているのかも解説があります。球面調和関数そのものについての説明はありません。
t-pot『リアルタイム大域照明』

2) そもそも大域照明(グローバルイルミネーション)ってなに?ということに関して、ゲームでの事例の解説記事です。

セガ、新作「ソニック ワールドアドベンチャー」におけるライティング技法を公開

3) この記事も大域照明に関する解説記事、(2)よりも詳しい。球面調和だけでなくPRT(Precomputed Radiance Transfer)全般についてまとめてある。

筆者は西川善司さん.
itmemolog.blogspot.jp
上の記事は古くて、最新の記事は以下の記事一部になっているのかも。
news.mynavi.jp

4) 球面調和関数で大域照明をするときの実装に関するものすごく簡単な解説。

実装されたコードへのリンクがある。
blogs.yahoo.co.jp

5) (4)のブログで実装先としてリンクされいるサイト。球面調和関数で大域照明を実装するときに多くのサイトから参照されている大元になるぺージ。

このサイトのコードが元になっているサイトが多い。
An Efficient Representation for Irradiance Environment Maps

6) Asuraさんの記事。球面調和を視覚化するサンプルコード。具体的に式もかいてある。CGで使う場合は実部のみを利用するがようの式もきちんと記述してある

☆PROJECT ASURA☆ [OpenGL] 『球面調和関数(1)』
球面調和関数を使ってキューブマップを近似(圧縮)するコードと解説。
☆PROJECT ASURA☆ [OpenGL] 『球面調和関数(2)』

7) 藤田さんの球面調和関数の多項式表現のpdfドキュメント。

CGで利用する実数球面調和関数について正しく記述してある(ネットにはこの記述間違いの記事もある)
また、デカルト座標系での球面調和関数についての記述もある。
http://lucille.sourceforge.net/blog/images/shpoly.pdf

8) 球面調和関数計算の高速化についての記述。Web上で球面調和展開した画像を取得するアプリも公開されている。

Spherical Harmonic Expansion

9) GLUTを使って球面調和関数の値を描画するテストプログラムのソース

http://harumune.s56.xrea.com/assari/index.php?%B5%E5%CC%CC%C4%B4%CF%C2%B4%D8%BF%F4

10) pythonを用いた球面調和関数の視覚化

takuyaokada.hatenablog.com

11) msdnによるPRTの解説とサンプル.サイトの一番下にあるリンクからさらにPRTレンダリングに関する解説に飛べます.

PRTDemo サンプル

Courseraでヒントン先生の"Neural Networks for Machine Learning" 2週目

1週目はイントロということで、課題も無難にこなし2週目も受講し終わりました。

2週目はざっと以下のような内容でした。

ネットワークの種類の説明
feed forward network
recurrent network
symmetrically connected networks
以上3つの種類のネットワークの解説

パーセプトロンの解説
歴史的経緯からパーセプトロンを解説

パーセプトロンの幾何的な概念
weight spaceの話
急にweight spaceの話が出てきて、初め何を言っているのかわかりづらい
線形分離していることを説明しているようだ

パーセプトロンでなぜ学習できるか
input vector とweightをかけてうまく領域分けできますというのを原理的に解説した。
feasible regionをとれば領域分けは収束するよという話のようだ

パーセプトロンで何ができないのか
いわゆるxorがパーセプトロンで表現できないよという話
パーセプトロンは線形分離可能な問題しか扱えないという制限がある

結構むつかしいことをサラッと説明してしまうので、この講義だけだと完全理解は難しいかもしれません。

課題は、複数選択があるので選択式といっても案外難しいです。

教師あり学習と教師なし学習のイメージ

教師というからには、学校をイメージしてみましょう。
教師あり学習と教師なし学習で、生徒を小集団に分類することを考えます。

教師あり学習

全校生徒を運動場に集めて、一人一人に教師があなたは1組、あなたは2組という風に伝えます。
その後任意の生徒に教室に入ってといえば、その生徒は自分の教室に入ります。これが教師あり学習。まさに教師がいるから自分のクラスがどこかを学習したということです。

教師なし学習

教師なし学習は、例えば運動場に集まった生徒たちを、お互い話し合って同じ趣味の人同士集まってくださいというようなもの。
結果としていくつかの集団はできますが、どのような集団にわかれるべきかという教師は居なくて、単に同じ趣味の人同士集まるという基準だけで集団をいくつかの小集団に分類できました。
これが教師なし学習のイメージです。

強化学習

強化学習を学校の生徒に例えると、新入生が昼休みにたむろする場所が、入学してからしばらくすると固定してくるというようなものです。
生徒一人一人が初めは昼休みにいろんな場所に出没しますが、図書館が居心地のいい人、運動場で遊ぶ人、校舎裏でゲームする人、屋上で昼寝する人、教室でおしゃべりする人など人それぞれ居心地の良さ(報酬)に応じて滞在場所が決まってきます。そして結果として場所ごとの生徒の小集団(クラスター)に分けられる、これが強化学習のイメージです。

かなり強引な例えですが、いかがだったでしょうか。

Courseraでヒントン先生の"Neural Networks for Machine Learning"を受講しはじめました

今日から始まったようですので、早速1週目を聞きました。
最初の週なので、機械学習ディープラーニングの概要やOctaveのインストール作業など軽めの内容でした。
英語が私には聞き取りにくくスライドを読みながら理解する状態です。
Ng先生のMachine learningの講義は、修了できたのですが今回も無事最後までたどり着けるでしょうか。
Ng先生の時にOctaveの開発・実行環境は整えてあるのでそれはそのまま使用できそうです。
今回は日本語字幕はありませんので、英語も頑張って聞きましょう。
ちなみに、機械学習ニューラルネットワークの基礎知識なしでも理解できないことはないとは思いますが、簡単な解説書1冊くらいは読んでから学習した方がより理解が深まると思います。


1週目は主にニューラルネットワークについての解説でした。
脳のニューラルネットワークの仕組みや特徴から、それを計算機上でどのように実装していくかの大まかな解説となぜニューロンを使うのかの説明がありました。
最後には、非常に簡単にですが、教師あり学習、教師なし学習、強化学習についての簡単な解説もあります。
Ng先生のMachine learningは、機械学習を入り口としていましたのでまずは線形分離やフィッテイングの話から入っていきましたが、Hinton先生の講義はいきなりニューロンの話からとアプローチが違います。
両方の講義を受ければ、オーソドックスな機械学習の基礎もニューラルネットワークの基礎も学ぶことができます。
実際、Ng先生の機械学習の講義は私の基礎知識としてものすごく役に立っています。

%matplotlib inlineについて

最近、jupyter notebookを使い始めた人から質問を受け、僕も前にはまったことがあるのでメモを残します。
jupyter notebookでノート上にグラフを書こうと思い例えば、

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.1)
y = np.arctan(x)
plt.plot(x, y)

のように書くと、グラフが表示されません。
コード自体は間違っていないので、理由が分からずはまってしまうことがあるようです。
これを解決するには、先頭で、

%matplotlib inline

を1行書けば解決します。
他にも起動時に

jupyter notebook --matplotlib inline

とする方法でもOKです。
以下のブログに、説明があります
yagays.github.io

「人工知能入門」 小高知宏/著 を読みました

人工知能入門

人工知能入門

人工知能全般について、浅く広く知るための本です。
ディープラーニング機械学習の特定のアルゴリズムについて知りたいとか、機械学習の理論的な側面について知りたいと言った人向けの本ではありません。
それよりは、いったい人工知能ってどんなもので、何を目的に研究・開発されているのかを知りたいという欲求にこたえてくれる本です。
各章末に演習問題が載っていたりするのでおそらく著者が大学の講義で利用しているのではないかと思われます。

人工知能とは何かから、その歴史、そして機械学習とは何かニューラルネットとはどういうものなのかを数式をほとんど使わないで完結に説明しています。
なぜかQ-Networkの説明というちょっとそれは他のバランスから考えて難しい内容じゃないかと思うような記述もありますが、全般的には理系でない人でも、人工知能につて知りたいと思う方なら、短時間で読めてしまえます。
本の雰囲気がいかにも教科書って感じなので、ちょっと見た目はとっつきにくく感じますが読んでみると、あ、簡単に読めてしまったとなりました。