« ピクトさん発見。 | 最新のページに戻る | Toward an animal model of spatial hemineglect »

■ 顕著性マップを実装するC++ツールキット

どもども、元気です。
娘が好きな男の子にバレンタインデーのチョコをプレゼントするってんで、ママと一緒にフードプロセッサを使ってチョコを砕いてたりする今日このごろです。
さて。
さいきんC++の勉強をしてます。
なんて書くと、また余計なことに手を伸ばして、と言われそうですが、必要に迫られて勉強してます。
University of Southern CaliforniaのLaurent Ittiが構築した"iLab Neuromorphic Vision C++ Toolkit"(iNVT)というのがあって、これがGPLに基づいたオープンソフトウェアとして利用できるようになってます(あらかじめ登録が必要)。これを使ってなにができるかは"iLab Neuromorphic Vision C++ Toolkit Screenshots"のあたりをみるとわかるかと思います。でもって、このコードを読んでやろうってわけ。
Laurent Ittiはsaliency mapのcomputational modelingで有名な人でして、Koch-Ullmanの提唱したsaliency mapの概念をbiologically plausibleなmodelとして実用に耐えうるものにした人です。いちばん有名なのは
Nature Reviews Neuroscience 2001の"Computational Modeling of Visual Attention."(pdf), Vol. 2, No. 3, pp. 194-203
でしょうね。昨年はNeuronにも仕事が出ました。
んで、さいきんはsaliencyに加えて、bayesian surpriseというものを提唱しています。Saliencyのほうは、V1とかのlateral inhibitionを考慮してfeature(colorとかorientationとか)ごとにspatialにsalientな場所を抽出して、それを足し合わせるというモデルだったのですが、bayesian surpriseのほうは、lateral inhibitionを使う代わりに、ある刺激を見たときのprior probabilityとposteiror probabilityとのあいだの変化の大きさをKL divergenceで計算して、これをbayesian surpriseとして定義する、というものです。この定義からわかるように、どのくらいの重みでpriorからposteriorを作るか、という点を固定しないといけない。この点がトリッキーだと思うんだけれど。
このへんについては、以前のエントリでも"Saliency mapとbayesian surprise (1)"および"Saliency mapとbayesian surprise (2)"で紹介しました。

さてさて。でもってじっさいにどういうimplementationがされているかを調べてやろうということでいまソースコードを読んでるんですが、なかなかたいへん。
まず、わたしはC++を知らない。そして、iNVTはC++のけっこう新しい機能を使いまくったコードで、いわゆる"better C"としての使い方じゃない。
たとえば、Saliency mapを表現している脳をひとつのクラスとしていて、さらにそれがcomponentごとに分かれたさまざまの抽象度のクラスを持っている。たとえば、intensityとか、colorとか、featureレベルの処理もひとつのクラスだし、それらより抽象度の高いVisual Cortexとか、Brainというクラスを持っていて、継承を使いまくってる。
それから、template使いまくり。二次元の画像入力の処理に関してだったら、template<class T>とかclass Image< T >とかそういうのが並んでる。この辺の詳細についてはこちらに書いてあります:"Programmer notes"
わたしの方はといえばこれまでは、STLとかtemplateとか継承とかそういう言葉を使うことさえ出来なくて、やっとさいきんわかってきたところ。
そもそもわたしは薬学出身ですんで、学部時代はもっぱら有機化学の実験とかそんなかんじでして、プログラミングについて系統的な勉強はしたことが無くて、10年前にラボ移ってtaskコントロールのソフトでCのポインタで挫折して、解析はExcelでやってたというかんじでした。Matlabの使い方を知って感激して、そのあとはSASをいじったりとか、せいぜい専用高級言語を使ってるというのが5年前。Matlabはいろんなところのconsistencyがクソですが、それでもCのポインタで挫折した私にとっては救世主でした。
だんだん解析で使うMatlabでの計算が重くなってきて(モンテカルロシミュレーション10万回とかをdoubleのままでやってたりするから)、ここはuint8にしようとか、実験データの行列へのアクセスを構造体を使ってやったりとか(連想配列がないので)、昔よりは工夫するようになったけどぜんぜん素人です。
さてそんなわたしがiNVTのコードを読むためにC++の勉強をしている、というわけ。Cのときみたいにmain()を上から読んでいってもさっぱりやってることがわからないので、入力や出力に近いところのクラスや関数の定義や実装をさがしてそれを読んで、またそこから参照しているところを読んで、とかそんなかんじです。
参考書が必要。とりあえずforとかswitchとかそういうのはべつにいいので、C++に特化したところを知りたいということで紹介してもらったのが「Accelerated C++」。これはポインタとかmallocとかそういうのすっ飛ばして最初からvectorとかを使って簡単なプログラムを作る、というやつでして、いま6章まで来ましたがとてもいいです。
とはいえ、いきなりこれで始めるのはたいへんなので超簡単な入門書を読んでおいたほうがよいと言われたので、Accelerated C++のまえに「C++ の絵本」。とりあえず二日で読んで、最小限のことはわかった。コンストラクタとデストラクタとか、例外処理とかそういう概念だけ。
Accelerated C++を読んだあとはこれ読め、って言われたのが「Effective C++ 原著第3版」。ネットで調べて超有名本だということは知りました。値渡しではなくてconst参照渡しをしよう、とかは理解できた。
そんでもって、リファレンスとしてBjarne Stroustrupの「プログラミング言語C++」は持っておけと言われた。これは知ってる。C++でのカーニハン&リッチーですよね。とりあえず枕にしてる。
図書館でおなじくBjarne Stroustrupの「C++の設計と進化」を見つけた。とりあえず、C++が[C言語の改良版]+[クラスを使ったオブジェクト指向言語]+[STL等を使ったジェネリックプログラミング]、という要素を全部つっこんだものだってことはわかった。
さてさて、並行してコードを読むためのエディタなんだけど、とりあえずKDevelopを使ってます(Linux上で動かしてるもんで)。コードの中で出てくる関数やクラスの実装がどこにあるかとかを右クリックで飛んでくれる。ほんとはEmacsでetagが使うとよいと言われているんだけれど、Emacsはなんどやっても挫折しまくり。チュートリアルをやろうとしてもすぐなんか抜けられなくなるとかそういうレベル。なんとかして。んで試行錯誤した結果、iNVT自体がソースコードの中でDoxygenがhtml形式のdocumentを生成してくれるようになっているので、それを使ってコードを追っかけるのがいちばん良さそうだということが判明。というわけでmake doc。
ともあれ、どうやったらコードって読めるようになるんですかね。タイトルにそのものずばり「code reading」というやつがあるので図書館で読んでみましたけど、どうやら私向けではなかったみたい。
ではまた。なにかしら続きます。


お勧めエントリ


月別過去ログ