iPhoneでフォトアルバムに画像を保存する方法

void UIImageWriteToSavedPhotosAlbum (
   UIImage  *image,
   id       completionTarget,
   SEL      completionSelector,
   void     *contextInfo
);

http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/UIImageWriteToSavedPhotosAlbum

第2引数以降は画像の保存が終わったあとにコールバックさせるためのものなので必要なければ全部nilにしていい。


今まで保存機能がないせいでスクリーンショットしてて枠が出ていたけど、ちゃんときれいに保存できるようになった。

PRML(パターン認識と機械学習) Hackathon 飛び入り日記

PRML(パターン認識と機械学習) Hackathon #1 : ATNDに飛び入り参加したナウ(14:58)

iPhoneの加速度センサーの値を教師無し学習で分類するプログラムを作ろうかと思っていたけど、考える脳 考えるコンピューターを実装する方がいいかな。


すばらしい発見をしたような気になる→冷静になる→アレ?(今ここ)


5分ではやはり語りきれなかったのでここで。

まずそもそもやりたかったことが何なのかというと、Real Lifeが面白い→できたばかりのゲームなのでまだ面白いパターンがあまり見つかっていない、探そう→人力で探すの面倒だから機械に探させよう、ということ。

で、単純にランダムな初期配置からがんがん走らせて、それを5x5とかで刻んで自己組織化マップ(SOM)に食わせれば、出現頻度の高いパターンが抽出される、と。ここまでで解きたかった問題には十分な気がするけどここからテンション高くオーバーキルが始まる。そういう刻んで学習するスタイルではライフゲームブリンカーみたいな周期的なパターンが入力されてもそれを別個のパターンAとパターンBとして認識してしまって、その間の関連に気付くことができない。

じゃあどうすればいいかな、と考えて、それってボルツマンマシン(or ホップフィールド・ネットワーク)に流し込んでやればパターンAで発火するニューロンとパターンBで発火するニューロンの間の結線が太くなって時系列パターンとして学習させられるじゃん、と思いつく。

これによってこのニューラルネットはパターンAっぽい入力を受けたあとには「Bが来そうだな」と予想できるようになる。パターンAが来たあとにノイズっぽいどこにも分類されない入力が来た時にはボルツマンマシン部分の「次はBが来るぞ」信号でパターンBが発火して「本当はノイズだったんだけどBが来たものと認識される」っていうとても人間っぽい挙動をする。そして入力からの刺激をなくしてやるとボルツマンマシンの「次は何が来る」情報だけでニューラルネットの状態が更新されて行って「夢を見ている」ような状態になる。

さて、ここまでで「ある入力が来た時に、次にどんな入力が来そうか予測」ができるようになった。しかし、これではAを見た時に「次はB」、Bを見た時に「次はA」という予測はできても「AとBの間を遷移し合うパターンXが存在する」という理解にはならない。なのでここで夢見のフェーズが重要で、夢を見ている間に適当なランダム発火からしばらく連想を走らせると、AとBの交互に移り合う遷移などのところに落ち着くので、すこし時系列にぼかして認識すると「AニューロンとBニューロンが光っているパターン」という空間的パターンに変化する。時系列パターンが空間的パターンに変化したところが重要で、これをまたSOMに食わせることでパターンのシンボル化ができるわけだ。ひとたびパターンのシンボル化ができてしまえばそのシンボルの間の遷移でより高度な抽象化ができる。



ここまではハッカソン前に考えていたことだったのだけど、ハッカソン会場に来たあと「あんまり時間内に完了しないタスクに着手すると積まれすぎているタスクが大変なことになるなぁ」と思ってコードをいきなり書くより設計の側をやることにした。まず最初にやったのは海馬の基礎知識を見て海馬内の配線図を写経することだったが、どう考えても海馬は小さいよね。ほとんど同じ内容のSOMとBMとのレイヤーがたくさん必要なので、上で書いたようなニューラルネットワークは海馬じゃなくて大脳皮質にあるだろうと考える方が自然。Twitterで大脳皮質内の配線に詳しい人を呼びかけて会場の@kenji4569が詳しいということを知る。なぜか同じ会場にいるのにTwitterで会話をする。

僕の大脳皮質に関する理解を確認しつつ、割といろいろなところにいろいろな種類の細胞があるから現時点でわかっている配線だけにこだわらなくても良さそうだという感触を得る。で、大脳皮質の図を描いた。第4層(以下x[4])に入力が入ってきた時に、x[2]とx[3]が刺激され、その信号は上位レイヤーの第4層(以下y[4])に届く。その過程でy[5]も刺激する。一方逆向きの流れもあって、y[5]からはy[6]を介して下のレイヤーに信号が送られる。送られてきた信号は軸索がたくさん集まっているx[1]を通ってたくさんのx[2], x[3], x[5]に送られ、またx[2], x[3]からはx[5], x[6]に信号が送られる。

(あとで図を入れる)

見ていたんだけども大脳皮質の1レイヤーだけ見ていてもリカレントネットワークを形成できそうに見えない。うーむ。

大脳皮質間の結合(corticocortical connectionという表現でOK?)が機能単位だという過程で考える。第4層(以下x[4])に入力が入ってきた時に、x[2]とx[3]が励起されるわけだけど、この例えばx[2]の興奮は上位の第4層(以下y[4])に伝えられる過程でy[5]、y[6]を伝って降りてきてx[1]の軸索がたくさん集まっているところを通って抑制性の刺激を与えることができる。軸索がたくさん集まっているということはそこで広い範囲に信号の伝達ができるということで、自己組織化マップの「最も強く発火しているニューロンが他のニューロンの活動を抑制する」ってのができそうだ。やった。あとはボルツマンマシン的なものが残りのスペースに収まるかどうか。


おお、そうか、なんで2層と3層の使い分けがよくわからないのに2つあるのかと思ったらそういうことか。片方が自己組織化マップで片方がボルツマンマシンなんだ。このTwitterでの発言は適切ではないので修正すると、

第4層(以下x[4])に入力が入ってきた時に、x[2]とx[3]が励起され、x[2]の興奮は上位の第4層(以下y[4])に伝えられる過程でy[5]、y[6]を伝って降りてきてx[1]の軸索がたくさん集まっているところを通ってx[3]に抑制性の信号を与えることができる。このとき、自分自身を抑制するんじゃなくて周辺のニューロンの抑制をする(側抑制)、「AとかBとかCって可能性も考えられるけど、一番強いのはAだからAってことにしよう」というわけ。x[3]はx[4]からの入力と抑制信号とでx[2]よりも「よくマッチしているニューロンだけ厳選で発火したパターン」になる。x[3]の発火はまたy[4]に送られる過程で降りてきてx[2]に繋がる。ここは弱く興奮性。この信号だけで大勢が決するほどではない。でここが学習をすることで「入力から考えるとCかDなんだけど、さっきAだったんだから次はBかCだと思うな」という肯定的な絞り込みがかかって、で、これがまたx[3]に行くところで「BとかDとかCが考えられるけど、まあ一番強いのはCだな」って感じになる。

という結論に到達したところでタイムアップだったので自己紹介もかねて5分で説明しようとしたが無理だった←いまここ

あと、まだ検証していないんだけども、この方法では5x5のマス目の分類だけなのでそれを越えるサイズのパターンを認知することができないけど、人間の目は実際に見えていると思っているものよりかなり狭い範囲しか見えていなくて、認知できないくらい速く(30〜70Hz)眼球を振動させて広い範囲を認知している(Saccade)。同様に、ライフゲームの1ステップが1秒だとすると50ヶ所くらいサンプリングされていてもおかしくないわけなので「ある特徴的なパターンを見た時に、その周辺に視線を動かすとまた別の特徴的なパターンがある」という形で一回のサンプリングで見える範囲よりも広い範囲に渡るパターンを認知することができる。で、運動野からは体を動かすための信号を出すと同時に視床にもそれが行って、そこからまた同じ皮質に戻ってくるらしいので、ボルツマンマシンの入力に目をどう動かしたかをフィードバックするんだと思う。「前回この状態で、目を上に動かした時には、こういうパターンになることが多い」という学習をするの。でも一次運動野なのか…視覚野から直接眼球を動かす信号が出ている方が設計としてはスマートだなぁ、そうなってないのかなぁ。

あ、あと今思いついたんだけど視覚野の細胞の応答速度ってどの程度だろう。仮に25msecとすると数字で見ると小さそうだけど、Hzでいうとたかだか40Hzなのでサッケードで50Hzくらいで眼球が動いているとすると常時モーションブラーだよねぇ。